From 38c720be917f237b1b48748ac247166188d76b38 Mon Sep 17 00:00:00 2001 From: Soulgrimm Date: Mon, 9 Oct 2023 00:14:45 +0300 Subject: [PATCH 1/4] Complete_work --- homework-1/create_tables.sql | 29 +++++++++++++++++++ homework-1/main.py | 23 +++++++++++++++ homework-1/north_data/csv_data.py | 10 +++++++ .../{employees_data.csv => employes_data.csv} | 0 pyproject.toml | 14 +++++++++ 5 files changed, 76 insertions(+) create mode 100644 homework-1/north_data/csv_data.py rename homework-1/north_data/{employees_data.csv => employes_data.csv} (100%) create mode 100644 pyproject.toml diff --git a/homework-1/create_tables.sql b/homework-1/create_tables.sql index 2240c4efb..c678ef00e 100644 --- a/homework-1/create_tables.sql +++ b/homework-1/create_tables.sql @@ -1 +1,30 @@ -- SQL-команды для создания таблиц +CREATE TABLE customers_data +( + customer_id char(10) PRIMARY KEY, + company_name varchar(50) NOT NULL, + contact_name varchar(50) NOT NULL +); + +CREATE TABLE employes_data +( + employee_id int PRIMARY KEY, + first_name varchar(20) NOT NULL, + last_name varchar(20) NOT NULL, + title varchar(200) NOT NULL, + birth_data date NOT NULL, + notes text +); + +CREATE TABLE orders_data +( + order_id int PRIMARY KEY, + customer_id varchar(10) REFERENCES customers_data(customer_id), + employee_id int REFERENCES employes_data(employee_id), + order_date date NOT NULL, + ship_city varchar(50) NOT NULL +); + +SELECT * FROM customers_data +SELECT * FROM employes_data +SELECT * FROM orders_data \ No newline at end of file diff --git a/homework-1/main.py b/homework-1/main.py index 5b5e8ffd4..70cb22548 100644 --- a/homework-1/main.py +++ b/homework-1/main.py @@ -1 +1,24 @@ """Скрипт для заполнения данными таблиц в БД Postgres.""" +import os +from north_data.csv_data import get_csv_data +import psycopg2 + + +def main(): + conn = psycopg2.connect(host='localhost', database='north', user='postgres', password='4622') + try: + path_csv_files = ['north_data/customers_data.csv', 'north_data/employes_data.csv', 'north_data/orders_data.csv'] + for path in path_csv_files: + path_csv = os.path.join(os.path.dirname(__file__), path) + csv_data = get_csv_data(path_csv) + with conn: + with conn.cursor() as cur: + columns = len(csv_data[0]) * '%s, ' + for i in csv_data[1:]: + cur.execute(f'INSERT INTO {path[11:-4]} VALUES ({columns.rstrip(", ")})', i) + finally: + conn.close() + + +if __name__ == '__main__': + main() diff --git a/homework-1/north_data/csv_data.py b/homework-1/north_data/csv_data.py new file mode 100644 index 000000000..ef3c8d963 --- /dev/null +++ b/homework-1/north_data/csv_data.py @@ -0,0 +1,10 @@ +import csv + + +def get_csv_data(filename): + table_scv_data = [] + with open(filename, newline='') as f: + rows = csv.reader(f) + for row in rows: + table_scv_data.append(row) + return table_scv_data diff --git a/homework-1/north_data/employees_data.csv b/homework-1/north_data/employes_data.csv similarity index 100% rename from homework-1/north_data/employees_data.csv rename to homework-1/north_data/employes_data.csv diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..d65fb529c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,14 @@ +[tool.poetry] +name = "postgres-homeworks" +version = "0.1.0" +description = "" +authors = ["pavel "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From a8630c4bf8d8230d2331e4ea8c250da03a8ece03 Mon Sep 17 00:00:00 2001 From: Soulgrimm Date: Wed, 11 Oct 2023 04:11:23 +0300 Subject: [PATCH 2/4] Complete_work_2 --- homework-2/filter_sorting.sql | 19 ++++++++++++++---- homework-2/groupby.sql | 37 +++++++++++++++++++++++++++++------ homework-2/simple_queries.sql | 14 +++++++++---- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/homework-2/filter_sorting.sql b/homework-2/filter_sorting.sql index 3c23694e7..1a2dbf21d 100644 --- a/homework-2/filter_sorting.sql +++ b/homework-2/filter_sorting.sql @@ -1,14 +1,25 @@ -- Напишите запросы, которые выводят следующую информацию: -- 1. заказы, доставленные в страны France, Germany, Spain (таблица orders, колонка ship_country) -SELECT ... +SELECT * +FROM orders +WHERE ship_country IN ('France', 'Germany', 'Spain') -- 2. уникальные страны и города, куда отправлялись заказы, отсортировать по странам и городам (таблица orders, колонки ship_country, ship_city) - +SELECT DISTINCT ship_country, ship_city +FROM orders +ORDER BY ship_country, ship_city -- 3. сколько дней в среднем уходит на доставку товара в Германию (таблица orders, колонки order_date, shipped_date, ship_country) - +SELECT AVG(shipped_date - order_date) +FROM orders +WHERE ship_country = 'Germany' -- 4. минимальную и максимальную цену среди продуктов, не снятых с продажи (таблица products, колонки unit_price, discontinued не равно 1) - +SELECT MIN(unit_price), MAX(unit_price) +FROM products +WHERE discontinued IS NOT NULL -- 5. минимальную и максимальную цену среди продуктов, не снятых с продажи и которых имеется не меньше 20 (таблица products, колонки unit_price, units_in_stock, discontinued не равно 1) +SELECT MIN(unit_price), MAX(unit_price) +FROM products +WHERE discontinued IS NOT NULL and units_in_stock >= 20 \ No newline at end of file diff --git a/homework-2/groupby.sql b/homework-2/groupby.sql index 9568d57ed..bb1ff8b16 100644 --- a/homework-2/groupby.sql +++ b/homework-2/groupby.sql @@ -1,20 +1,45 @@ -- Напишите запросы, которые выводят следующую информацию: -- 1. заказы, отправленные в города, заканчивающиеся на 'burg'. Вывести без повторений две колонки (город, страна) (см. таблица orders, колонки ship_city, ship_country) - +SELECT DISTINCT ship_city, ship_country +FROM orders +WHERE ship_city LIKE '%burg' -- 2. из таблицы orders идентификатор заказа, идентификатор заказчика, вес и страну отгрузки. Заказ отгружен в страны, начинающиеся на 'P'. Результат отсортирован по весу (по убыванию). Вывести первые 10 записей. - +SELECT order_id, customer_id, freight, ship_country +FROM orders +WHERE ship_country LIKE 'P%' +ORDER BY freight DESC +LIMIT 10 -- 3. фамилию, имя и телефон сотрудников, у которых в данных отсутствует регион (см таблицу employees) - +SELECT first_name, last_name, home_phone +FROM employees +WHERE region is NULL -- 4. количество поставщиков (suppliers) в каждой из стран. Результат отсортировать по убыванию количества поставщиков в стране - +SELECT country, COUNT(*) +FROM suppliers +GROUP BY country +ORDER BY COUNT(*) DESC -- 5. суммарный вес заказов (в которых известен регион) по странам, но вывести только те результаты, где суммарный вес на страну больше 2750. Отсортировать по убыванию суммарного веса (см таблицу orders, колонки ship_region, ship_country, freight) - +SELECT ship_country, SUM(freight) +FROM orders +WHERE ship_region IS NOT NULL +GROUP BY ship_country +HAVING SUM(freight) > 2750 +ORDER BY SUM(freight) DESC -- 6. страны, в которых зарегистрированы и заказчики (customers) и поставщики (suppliers) и работники (employees). - +SELECT country FROM customers +INTERSECT +SELECT country FROM suppliers +INTERSECT +SELECT country FROM employees -- 7. страны, в которых зарегистрированы и заказчики (customers) и поставщики (suppliers), но не зарегистрированы работники (employees). +SELECT country FROM customers +INTERSECT +SELECT country FROM suppliers +EXCEPT +SELECT country FROM employees \ No newline at end of file diff --git a/homework-2/simple_queries.sql b/homework-2/simple_queries.sql index 0844a9131..71747dbe1 100644 --- a/homework-2/simple_queries.sql +++ b/homework-2/simple_queries.sql @@ -1,14 +1,20 @@ -- Напишите запросы, которые выводят следующую информацию: -- 1. "имя контакта" и "город" (contact_name, city) из таблицы customers (только эти две колонки) -SELECT ... +SELECT contact_name, city +FROM customers -- 2. идентификатор заказа и разницу между датами формирования (order_date) заказа и его отгрузкой (shipped_date) из таблицы orders - +SELECT order_id, (shipped_date - order_date) +FROM orders -- 3. все города без повторов, в которых зарегистрированы заказчики (customers) - +SELECT DISTINCT city +FROM customers -- 4. количество заказов (таблица orders) - +SELECT COUNT(*) +FROM orders -- 5. количество стран, в которые отгружался товар (таблица orders, колонка ship_country) +SELECT COUNT(DISTINCT ship_country) +FROM orders \ No newline at end of file From 519f8c5fd6a5bd41c249839ab132e1fd9f60d4bd Mon Sep 17 00:00:00 2001 From: Soulgrimm Date: Sun, 15 Oct 2023 17:36:32 +0300 Subject: [PATCH 3/4] Complete_work_3 --- homework-3/queries.sql | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/homework-3/queries.sql b/homework-3/queries.sql index 5f2b4173b..1b8c34e60 100644 --- a/homework-3/queries.sql +++ b/homework-3/queries.sql @@ -1,16 +1,34 @@ -- Напишите запросы, которые выводят следующую информацию: -- 1. Название компании заказчика (company_name из табл. customers) и ФИО сотрудника, работающего над заказом этой компании (см таблицу employees), -- когда и заказчик и сотрудник зарегистрированы в городе London, а доставку заказа ведет компания United Package (company_name в табл shippers) +SELECT customers.company_name AS customer, CONCAT(employees.first_name, ' ', employees.last_name) AS employee +FROM orders +JOIN employees USING(employee_id) +JOIN customers USING(customer_id) +WHERE customers.city = 'London' AND employees.city = 'London' AND ship_via IN (SELECT shipper_id FROM shippers WHERE company_name = 'United Package') -- 2. Наименование продукта, количество товара (product_name и units_in_stock в табл products), -- имя поставщика и его телефон (contact_name и phone в табл suppliers) для таких продуктов, -- которые не сняты с продажи (поле discontinued) и которых меньше 25 и которые в категориях Dairy Products и Condiments. -- Отсортировать результат по возрастанию количества оставшегося товара. - +SELECT product_name, units_in_stock, contact_name, phone +FROM products +JOIN suppliers USING (supplier_id) +JOIN categories USING (category_id) +WHERE discontinued = 0 AND units_in_stock < 25 and category_name IN ('Condiments', 'Dairy Products') +ORDER BY units_in_stock -- 3. Список компаний заказчиков (company_name из табл customers), не сделавших ни одного заказа +SELECT company_name +FROM customers +FULL JOIN orders ON customers.customer_id = orders.customer_id +WHERE NOT EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.customer_id) -- 4. уникальные названия продуктов, которых заказано ровно 10 единиц (количество заказанных единиц см в колонке quantity табл order_details) -- Этот запрос написать именно с использованием подзапроса. +SELECT DISTINCT product_name +FROM products +WHERE product_id IN (SELECT product_id FROM order_details WHERE quantity = 10) +ORDER BY product_name \ No newline at end of file From b7ae6e5ecaa19629ed8fd33ab70f511af73e8c86 Mon Sep 17 00:00:00 2001 From: Soulgrimm Date: Tue, 17 Oct 2023 23:50:59 +0300 Subject: [PATCH 4/4] Complete_work_4 --- homework-4/alter_northwind.sql | 6 +++++- homework-4/alter_student.sql | 19 ++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/homework-4/alter_northwind.sql b/homework-4/alter_northwind.sql index 852b12178..9495a1340 100644 --- a/homework-4/alter_northwind.sql +++ b/homework-4/alter_northwind.sql @@ -1,12 +1,16 @@ -- Подключиться к БД Northwind и сделать следующие изменения: -- 1. Добавить ограничение на поле unit_price таблицы products (цена должна быть больше 0) +ALTER TABLE products ADD CONSTRAINT chk_products_unit_price CHECK (unit_price >= 0) -- 2. Добавить ограничение, что поле discontinued таблицы products может содержать только значения 0 или 1 +ALTER TABLE products ADD CONSTRAINT chk_products_discontinued CHECK (discontinued IN (0, 1)) -- 3. Создать новую таблицу, содержащую все продукты, снятые с продажи (discontinued = 1) - +SELECT * INTO true_discontinued FROM products WHERE discontinued > 0 -- 4. Удалить из products товары, снятые с продажи (discontinued = 1) -- Для 4-го пункта может потребоваться удаление ограничения, связанного с foreign_key. Подумайте, как это можно решить, чтобы связь с таблицей order_details все же осталась. +DELETE FROM order_details WHERE EXISTS (SELECT 1 FROM products WHERE product_id = order_details.product_id AND discontinued = 1) +DELETE FROM products WHERE discontinued = 1 \ No newline at end of file diff --git a/homework-4/alter_student.sql b/homework-4/alter_student.sql index d4f099c60..0cd4623a8 100644 --- a/homework-4/alter_student.sql +++ b/homework-4/alter_student.sql @@ -1,19 +1,28 @@ -- 1. Создать таблицу student с полями student_id serial, first_name varchar, last_name varchar, birthday date, phone varchar - +CREATE TABLE student +( + student_id serial, + first_name varchar, + last_name varchar, + birthday date, + phone varchar +) -- 2. Добавить в таблицу student колонку middle_name varchar - +ALTER TABLE student ADD COLUMN middle_name varchar; -- 3. Удалить колонку middle_name - +ALTER TABLE student DROP COLUMN middle_name; -- 4. Переименовать колонку birthday в birth_date - +ALTER TABLE student RENAME birthday to birthday_date -- 5. Изменить тип данных колонки phone на varchar(32) - +ALTER TABLE student ALTER COLUMN phone SET DATA TYPE varchar(32); -- 6. Вставить три любых записи с автогенерацией идентификатора +INSERT INTO student (first_name, last_name) VALUES ('Pavel', 'Gromov'), ('Ivan','Ivanov'), ('Sergey','Sergeev'); -- 7. Удалить все данные из таблицы со сбросом идентификатор в исходное состояние +TRUNCATE TABLE student RESTART IDENTITY; \ No newline at end of file