diff --git a/homework-1/create_tables.sql b/homework-1/create_tables.sql index 2240c4efb..ab1b9e7ee 100644 --- a/homework-1/create_tables.sql +++ b/homework-1/create_tables.sql @@ -1 +1,34 @@ -- SQL-команды для создания таблиц + +-- Создание таблицы CUSTOMERS +CREATE TABLE customers +( + customer_id VARCHAR PRIMARY KEY, + company_name VARCHAR(50) NOT NULL, + contact_name VARCHAR(50) NOT NULL +); + + +-- Создание таблицы EMPLOYEES +CREATE TABLE employees +( + employee_id INTEGER PRIMARY KEY, + first_name VARCHAR(30) NOT NULL, + last_name VARCHAR(30) NOT NULL, + title VARCHAR(50) NOT NULL, + birth_date DATE, + notes TEXT +); + + +-- Создание таблицы ORDERS +CREATE TABLE orders +( + order_id INTEGER PRIMARY KEY, + customer_id VARCHAR REFERENCES customers(customer_id), + employee_id INTEGER REFERENCES employees(employee_id), + order_date DATE, + ship_city VARCHAR(30) +); + + diff --git a/homework-1/main.py b/homework-1/main.py index 5b5e8ffd4..991ddb798 100644 --- a/homework-1/main.py +++ b/homework-1/main.py @@ -1 +1,26 @@ """Скрипт для заполнения данными таблиц в БД Postgres.""" +import psycopg2 +import csv +connect = psycopg2.connect(host = 'localhost',database='north', user='postgres', password='manager1') + + +def read_csv_to_bd(path:str, query:str)-> None: + """функция, которая считывает данные из csv и записывает их в таблицу в БД""" + with open(path, encoding='utf-8') as fp: + csv_lists = csv.reader(fp) + next(csv_lists) + with connect.cursor() as curs: + curs.executemany(query, csv_lists) + connect.commit() +query_customers = """INSERT INTO customers(customer_id,company_name,contact_name) + VALUES (%s, %s,%s) """ + +query_employees = """INSERT INTO employees(employee_id,first_name,last_name,title,birth_date,notes) + VALUES (%s,%s,%s,%s,%s,%s) """ + +query_orders = """INSERT INTO orders(order_id,customer_id,employee_id,order_date,ship_city) + VALUES (%s,%s,%s,%s,%s) """ + +read_csv_to_bd('north_data/customers_data.csv', query_customers) +read_csv_to_bd('north_data/employees_data.csv', query_employees) +read_csv_to_bd('north_data/orders_data.csv', query_orders) diff --git a/homework-2/filter_sorting.sql b/homework-2/filter_sorting.sql index 3c23694e7..6aece6c82 100644 --- a/homework-2/filter_sorting.sql +++ b/homework-2/filter_sorting.sql @@ -1,14 +1,28 @@ -- Напишите запросы, которые выводят следующую информацию: -- 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) AS min_price, MAX(unit_price) AS max_price +FROM products +WHERE discontinued <> 1; -- 5. минимальную и максимальную цену среди продуктов, не снятых с продажи и которых имеется не меньше 20 (таблица products, колонки unit_price, units_in_stock, discontinued не равно 1) +SELECT MIN(unit_price) AS min_price, MAX(unit_price) AS max_price +FROM products +WHERE discontinued <> 1; \ No newline at end of file diff --git a/homework-2/groupby.sql b/homework-2/groupby.sql index 9568d57ed..74548fd40 100644 --- a/homework-2/groupby.sql +++ b/homework-2/groupby.sql @@ -1,20 +1,54 @@ -- Напишите запросы, которые выводят следующую информацию: -- 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, 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 DISTINCT country +FROM customers +INTERSECT +SELECT DISTINCT country +FROM employees +INTERSECT +SELECT DISTINCT country +FROM suppliers; -- 7. страны, в которых зарегистрированы и заказчики (customers) и поставщики (suppliers), но не зарегистрированы работники (employees). +ELECT DISTINCT country +FROM customers +INTERSECT +SELECT DISTINCT country +FROM suppliers +EXCEPT +SELECT DISTINCT country +FROM employees; diff --git a/homework-2/simple_queries.sql b/homework-2/simple_queries.sql index 0844a9131..8d7024cc9 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 diff --git a/homework-3/queries.sql b/homework-3/queries.sql index 5f2b4173b..406016d1e 100644 --- a/homework-3/queries.sql +++ b/homework-3/queries.sql @@ -1,16 +1,38 @@ -- Напишите запросы, которые выводят следующую информацию: -- 1. Название компании заказчика (company_name из табл. customers) и ФИО сотрудника, работающего над заказом этой компании (см таблицу employees), -- когда и заказчик и сотрудник зарегистрированы в городе London, а доставку заказа ведет компания United Package (company_name в табл shippers) - +SELECT c.company_name, CONCAT(e.first_name, ' ', e.last_name) +FROM orders AS o +JOIN customers AS c USING(customer_id) +JOIN employees AS e USING(employee_id) +JOIN shippers AS s ON s.shipper_id = o.ship_via +WHERE c.city = 'London' and e.city = 'London' and s.company_name = 'United Package'; -- 2. Наименование продукта, количество товара (product_name и units_in_stock в табл products), -- имя поставщика и его телефон (contact_name и phone в табл suppliers) для таких продуктов, -- которые не сняты с продажи (поле discontinued) и которых меньше 25 и которые в категориях Dairy Products и Condiments. -- Отсортировать результат по возрастанию количества оставшегося товара. +SELECT p.product_name, p.units_in_stock, s.contact_name, s.phone +FROM products AS p +JOIN suppliers AS s USING(supplier_id) +JOIN categories AS c USING(category_id) +WHERE c.category_name IN ('Dairy Products', 'Condiments') AND p.discontinued = 0 AND p.units_in_stock < 25 +ORDER BY p.units_in_stock; -- 3. Список компаний заказчиков (company_name из табл customers), не сделавших ни одного заказа - +SELECT c.company_name +FROM customers AS c +LEFT JOIN orders USING(customer_id) +WHERE order_id IS NULL +ORDER BY company_name; -- 4. уникальные названия продуктов, которых заказано ровно 10 единиц (количество заказанных единиц см в колонке quantity табл order_details) -- Этот запрос написать именно с использованием подзапроса. +SELECT product_name +FROM products +WHERE product_id = ANY ( + SELECT product_id + FROM order_details + WHERE quantity = 10 + ); diff --git a/homework-4/alter_northwind.sql b/homework-4/alter_northwind.sql index 852b12178..6caafe510 100644 --- a/homework-4/alter_northwind.sql +++ b/homework-4/alter_northwind.sql @@ -1,12 +1,28 @@ -- Подключиться к БД Northwind и сделать следующие изменения: -- 1. Добавить ограничение на поле unit_price таблицы products (цена должна быть больше 0) +ALTER TABLE products +ADD CONSTRAINT chk_products_unit_price_positive +CHECK (unit_price > 0); -- 2. Добавить ограничение, что поле discontinued таблицы products может содержать только значения 0 или 1 - +ALTER TABLE products +ADD CONSTRAINT chk_products_discontinued_binary +CHECK (discontinued IN (0, 1)); -- 3. Создать новую таблицу, содержащую все продукты, снятые с продажи (discontinued = 1) - - +SELECT * +INTO discontinued_table +FROM products +WHERE discontinued = 1; -- 4. Удалить из products товары, снятые с продажи (discontinued = 1) -- Для 4-го пункта может потребоваться удаление ограничения, связанного с foreign_key. Подумайте, как это можно решить, чтобы связь с таблицей order_details все же осталась. +ALTER TABLE order_details +DROP CONSTRAINT fk_order_details_products; + +ALTER TABLE order_details +ADD CONSTRAINT fk_order_details_products +FOREIGN KEY (product_id) +REFERENCES products(product_id) ON DELETE CASCADE; + +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..5604bc21d 100644 --- a/homework-4/alter_student.sql +++ b/homework-4/alter_student.sql @@ -1,19 +1,40 @@ -- 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 +); + +SELECT * +FROM student -- 2. Добавить в таблицу student колонку middle_name varchar +ALTER TABLE student +ADD COLUMN middle_name VARCHAR --- 3. Удалить колонку middle_name +-- 3. Удалить колонку middle_name +ALTER TABLE student +DROP COLUMN middle_name; -- 4. Переименовать колонку birthday в birth_date - +ALTER TABLE student +RENAME COLUMN birthday TO birth_date; -- 5. Изменить тип данных колонки phone на varchar(32) +ALTER TABLE student +ALTER COLUMN phone SET DATA TYPE VARCHAR(32); -- 6. Вставить три любых записи с автогенерацией идентификатора +INSERT INTO student (first_name) +VALUES ('Jack'), ('Mike'), ('Ann'); + -- 7. Удалить все данные из таблицы со сбросом идентификатор в исходное состояние +TRUNCATE TABLE student RESTART IDENTITY;