
Код
-- Создание таблиц
CREATE TABLE Categories (
category_id SERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE NOT NULL
);
CREATE TABLE Locations (
location_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE Status (
status_id SERIAL PRIMARY KEY,
status_name VARCHAR(50) UNIQUE NOT NULL
);
CREATE TABLE Employees (
employee_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE Items (
item_id SERIAL PRIMARY KEY,
description TEXT NOT NULL,
found_date DATE NOT NULL,
location_id INT REFERENCES Locations(location_id),
category_id INT REFERENCES Categories(category_id),
days_since_found INT
);
CREATE TABLE Reports (
report_id SERIAL PRIMARY KEY,
item_id INT REFERENCES Items(item_id),
employee_id INT REFERENCES Employees(employee_id),
status_id INT REFERENCES Status(status_id),
report_date DATE NOT NULL
);
-- Заполнение таблиц данными
-- Таблица Categories
INSERT INTO Categories (name) VALUES
('Одежда'),
('Электроника'),
('Документы'),
('Аксессуары'),
('Игрушки'),
('Прочее');
-- Таблица Locations
INSERT INTO Locations (name) VALUES
('Аэропорт'),
('Железнодорожный вокзал'),
('Торговый центр'),
('Парк'),
('Автовокзал'),
('Станция метро'),
('Автобусная остановка'),
('Стадион'),
('Библиотека'),
('Музей');
-- Таблица Status
INSERT INTO Status (status_name) VALUES
('Найдено'),
('В процессе возврата'),
('Возвращено владельцу'),
('Утеряно'),
('Передано в полицию');
-- Таблица Employees
INSERT INTO Employees (name) VALUES
('Иван Иванов'),
('Анна Петрова'),
('Ольга Смирнова'),
('Петр Сергеев'),
('Мария Кузнецова'),
('Виктор Соколов'),
('Юлия Федорова'),
('Алексей Морозов'),
('Екатерина Белова'),
('Дмитрий Громов');
-- Таблица Items
INSERT INTO Items (description, found_date, location_id, category_id) VALUES
('Черный зонт', '2023-10-01', 1, 4),
('Смартфон Samsung', '2023-10-02', 2, 2),
('Кошелек с документами', '2023-10-03', 3, 3),
('Серебряное кольцо', '2023-10-04', 4, 4),
('Игрушечная машинка', '2023-10-05', 5, 5),
('Сумка с одеждой', '2023-10-06', 6, 1),
('Ноутбук HP', '2023-10-07', 7, 2),
('Паспорт', '2023-10-08', 8, 3),
('Солнцезащитные очки', '2023-10-09', 9, 4),
('Книга', '2023-10-10', 10, 6);
-- Таблица Reports
INSERT INTO Reports (item_id, employee_id, status_id, report_date) VALUES
(1, 1, 1, '2023-10-01'),
(2, 2, 2, '2023-10-02'),
(3, 3, 1, '2023-10-03'),
(4, 4, 3, '2023-10-04'),
(5, 5, 1, '2023-10-05'),
(6, 6, 4, '2023-10-06'),
(7, 7, 1, '2023-10-07'),
(8, 8, 2, '2023-10-08'),
(9, 9, 1, '2023-10-09'),
(10, 10, 3, '2023-10-10');
Запросы
1. Получение всех найденных вещей с указанием места и категории.
SELECT Items.description, Locations.name AS location, Categories.name AS category
FROM Items
JOIN Locations ON Items.location_id = Locations.location_id
JOIN Categories ON Items.category_id = Categories.category_id;
2. Поиск вещей, которые найдены на станции метро.
SELECT description
FROM Items
JOIN Locations ON Items.location_id = Locations.location_id
WHERE Locations.name = 'Станция метро';
3. Получение всех отчетов с указанием вещи, статуса и сотрудника.
SELECT Reports.report_id, Items.description, Status.status_name, Employees.name AS employee, Reports.report_date
FROM Reports
JOIN Items ON Reports.item_id = Items.item_id
JOIN Status ON Reports.status_id = Status.status_id
JOIN Employees ON Reports.employee_id = Employees.employee_id;
4. Подсчет общего количества забытых вещей в каждой категории.
SELECT Categories.name, COUNT(Items.item_id) AS total_items
FROM Items
JOIN Categories ON Items.category_id = Categories.category_id
GROUP BY Categories.name;
5. Получение списка сотрудников и количества отчетов, созданных каждым из них.
SELECT Employees.name, COUNT(Reports.report_id) AS reports_count
FROM Employees
JOIN Reports ON Employees.employee_id = Reports.employee_id
GROUP BY Employees.name;
6. Список вещей, которые возвращены владельцам.
SELECT Items.description
FROM Items
JOIN Reports ON Items.item_id = Reports.item_id
JOIN Status ON Reports.status_id = Status.status_id
WHERE Status.status_name = 'Возвращено владельцу';
7. Поиск вещей, которые были найдены за последние 7 дней.
SELECT description
FROM Items
WHERE found_date >= CURRENT_DATE - INTERVAL '7 days';
8. Создание представления для всех вещей, найденных в аэропорту.
CREATE VIEW AirportFoundItems AS
SELECT description, found_date
FROM Items
JOIN Locations ON Items.location_id = Locations.location_id
WHERE Locations.name = 'Аэропорт';
9. Список всех вещей и количество дней с момента нахождения.
SELECT description, days_since_found
FROM Items;
10. Список всех статусов и количество вещей в каждом статусе.
SELECT Status.status_name, COUNT(Reports.report_id) AS count
FROM Reports
JOIN Status ON Reports.status_id = Status.status_id
GROUP BY Status.status_name;
11. Поиск всех вещей, которые были найдены сотрудником "Иван Иванов".
SELECT Items.description
FROM Items
JOIN Reports ON Items.item_id = Reports.item_id
JOIN Employees ON Reports.employee_id = Employees.employee_id
WHERE Employees.name = 'Иван Иванов';
12. Список всех вещей с указанием сотрудника, который их нашел.
SELECT Items.description, Employees.name AS employee
FROM Items
JOIN Reports ON Items.item_id = Reports.item_id
JOIN Employees ON Reports.employee_id = Employees.employee_id;
13. Список всех вещей, найденных в торговом центре.
SELECT description
FROM Items
JOIN Locations ON Items.location_id = Locations.location_id
WHERE Locations.name = 'Торговый центр';
14. Поиск всех вещей, которые еще не возвращены владельцам.
SELECT Items.description
FROM Items
JOIN Reports ON Items.item_id = Reports.item_id
JOIN Status ON Reports.status_id = Status.status_id
WHERE Status.status_name != 'Возвращено владельцу';
15. Получение списка вещей, отсортированных по дате нахождения (от новых к старым).
SELECT description, found_date
FROM Items
ORDER BY found_date DESC;
16. Выбор всех вещей, найденных в октябре 2023 года.
SELECT description
FROM Items
WHERE found_date BETWEEN '2023-10-01' AND '2023-10-31';
17. Получение всех отчетов с указанием текущего статуса.
SELECT Reports.report_id, Items.description, Status.status_name
FROM Reports
JOIN Items ON Reports.item_id = Items.item_id
JOIN Status ON Reports.status_id = Status.status_id;
18. Выбор всех вещей, у которых категория "Одежда".
SELECT description
FROM Items
JOIN Categories ON Items.category_id = Categories.category_id
WHERE Categories.name = 'Одежда';
19. Список всех уникальных категорий вещей.
SELECT DISTINCT name
FROM Categories;
20. Вывод списка всех мест и количество вещей, найденных в каждом из них.
SELECT Locations.name, COUNT(Items.item_id) AS item_count
FROM Locations
JOIN Items ON Locations.location_id = Items.location_id
GROUP BY Locations.name;