Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions homework-1/create_tables.sql
Original file line number Diff line number Diff line change
@@ -1 +1,38 @@
-- SQL-команды для создания таблиц
--
--
-- CREATE TABLE employees (
-- employee_id SERIAL PRIMARY KEY,
-- first_name VARCHAR(50),
-- last_name VARCHAR(50),
-- title VARCHAR(255),
-- birth_date DATE,
-- notes TEXT
-- );
--
--
-- CREATE TABLE customers (
-- customer_id VARCHAR(255) PRIMARY KEY,
-- name VARCHAR(100),
-- email VARCHAR(100),
-- address VARCHAR(100),
-- company_name VARCHAR(255),
-- contact_name VARCHAR(255)
-- );
--
--
-- CREATE TABLE orders (
-- order_id SERIAL PRIMARY KEY,
-- order_date DATE,
-- customer_id VARCHAR(255),
-- employee_id INT,
-- ship_city VARCHAR(255),
-- FOREIGN KEY (customer_id) REFERENCES customers (customer_id),
-- FOREIGN KEY (employee_id) REFERENCES employees (employee_id)
-- );
--
--
--
-- SELECT * FROM employees;
-- SELECT * FROM customers;
-- SELECT * FROM orders;
75 changes: 74 additions & 1 deletion homework-1/main.py
Original file line number Diff line number Diff line change
@@ -1 +1,74 @@
"""Скрипт для заполнения данными таблиц в БД Postgres."""
import csv
import psycopg2
import os


def read_csv_file(filepath):
with open(filepath, newline='', encoding='utf-8') as csvfile:
filereader = csv.reader(csvfile)
next(filereader)
return [tuple(row) for row in filereader]


def insert_customers(conn, data):
cur = conn.cursor()
cur.executemany(
"INSERT INTO customers (customer_id, company_name, contact_name) VALUES (%s, %s, %s) ON CONFLICT (customer_id) DO NOTHING;",
data
)
print(f"Customers: Успешно вставлено {cur.rowcount} записей.")


def insert_employees(conn, data):
cur = conn.cursor()
cur.executemany(
"INSERT INTO employees (employee_id, first_name, last_name, title, birth_date, notes) VALUES (%s, %s, %s, %s, %s, %s) ON CONFLICT (employee_id) DO NOTHING;",
data
)
print(f"Employees: Успешно вставлено {cur.rowcount} записей.")


def insert_orders(conn, data):
cur = conn.cursor()
cur.executemany(
"INSERT INTO orders (order_id, customer_id, employee_id, order_date, ship_city) VALUES (%s, %s, %s, %s, %s) ON CONFLICT (order_id) DO NOTHING;",
data
)
print(f"Orders: Успешно вставлено {cur.rowcount} записей.")


def main():
global conn
db_params = {
'host': 'localhost',
'database': 'north',
'user': 'postgres',
'password': os.getenv('DB_PASSWORD', '1014'),
'port': '5433'
}

try:
conn = psycopg2.connect(**db_params)
conn.autocommit = True

customers_data = read_csv_file(
'/Users/anastasiya/PycharmProjects/python/postgres/postgres-homeworks/homework-1/north_data/customers_data.csv')
insert_customers(conn, customers_data)

employees_data = read_csv_file(
'/Users/anastasiya/PycharmProjects/python/postgres/postgres-homeworks/homework-1/north_data/employees_data.csv')
insert_employees(conn, employees_data)

orders_data = read_csv_file(
'/Users/anastasiya/PycharmProjects/python/postgres/postgres-homeworks/homework-1/north_data/orders_data.csv')
insert_orders(conn, orders_data)

except psycopg2.DatabaseError as e:
print(f"Ошибка базы данных: {e}")
finally:
if conn:
conn.close()


if __name__ == '__main__':
main()
18 changes: 17 additions & 1 deletion homework-2/filter_sorting.sql
Original file line number Diff line number Diff line change
@@ -1,14 +1,30 @@
-- Напишите запросы, которые выводят следующую информацию:
-- 1. заказы, доставленные в страны France, Germany, Spain (таблица orders, колонка ship_country)
SELECT ...
SELECT *
FROM orders
WHERE UPPER(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) AS average_delivery_days
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 AND 20 <= units_in_stock;


34 changes: 34 additions & 0 deletions homework-2/groupby.sql
Original file line number Diff line number Diff line change
@@ -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, 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(supplier_id) AS supplier_count
FROM suppliers
GROUP BY country
ORDER BY supplier_count DESC;

-- 5. суммарный вес заказов (в которых известен регион) по странам, но вывести только те результаты, где суммарный вес на страну больше 2750. Отсортировать по убыванию суммарного веса (см таблицу orders, колонки ship_region, ship_country, freight)

SELECT ship_country, SUM(freight) AS total_freight
FROM orders
WHERE ship_region IS NOT NULL
GROUP BY ship_country
HAVING SUM(freight) > 2750
ORDER BY total_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;

2 changes: 1 addition & 1 deletion homework-2/northwind_script.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3904,4 +3904,4 @@ ALTER TABLE ONLY employees

--
-- PostgreSQL database dump complete
--
--
15 changes: 14 additions & 1 deletion homework-2/simple_queries.sql
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
-- Напишите запросы, которые выводят следующую информацию:
-- 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 AS days_to_ship
FROM orders;

-- 3. все города без повторов, в которых зарегистрированы заказчики (customers)

SELECT DISTINCT city
FROM customers;

-- 4. количество заказов (таблица orders)

SELECT COUNT(*) AS total_orders
FROM orders;

-- 5. количество стран, в которые отгружался товар (таблица orders, колонка ship_country)

SELECT COUNT(DISTINCT ship_country) AS countries_shipped_to
FROM orders;

34 changes: 33 additions & 1 deletion homework-3/queries.sql
Original file line number Diff line number Diff line change
@@ -1,16 +1,48 @@
-- Напишите запросы, которые выводят следующую информацию:
-- 1. Название компании заказчика (company_name из табл. customers) и ФИО сотрудника, работающего над заказом этой компании (см таблицу employees),
-- когда и заказчик и сотрудник зарегистрированы в городе London, а доставку заказа ведет компания United Package (company_name в табл shippers)

SELECT c.company_name, CONCAT(e.first_name, ' ', e.last_name) AS employee_full_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN employees e ON o.employee_id = e.employee_id
JOIN shippers s ON o.ship_via = s.shipper_id
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 p
JOIN suppliers s ON p.supplier_id = s.supplier_id
JOIN categories c ON p.category_id = c.category_id
WHERE p.discontinued = 0
AND p.units_in_stock < 25
AND c.category_name IN ('Dairy Products', 'Condiments')
ORDER BY p.units_in_stock ASC;

-- 3. Список компаний заказчиков (company_name из табл customers), не сделавших ни одного заказа

SELECT company_name
FROM customers
WHERE customer_id NOT IN (
SELECT DISTINCT customer_id
FROM orders
);

-- 4. уникальные названия продуктов, которых заказано ровно 10 единиц (количество заказанных единиц см в колонке quantity табл order_details)
-- Этот запрос написать именно с использованием подзапроса.


SELECT DISTINCT p.product_name
FROM products p
WHERE EXISTS (
SELECT 1
FROM order_details od
WHERE od.product_id = p.product_id
AND od.quantity = 10
);

18 changes: 18 additions & 0 deletions homework-4/alter_northwind.sql
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
-- Подключиться к БД Northwind и сделать следующие изменения:
-- 1. Добавить ограничение на поле unit_price таблицы products (цена должна быть больше 0)

ALTER TABLE products
ADD CONSTRAINT chk_unnit_price_positive CHECK (unit_price > 0);

-- 2. Добавить ограничение, что поле discontinued таблицы products может содержать только значения 0 или 1

ALTER TABLE products
ADD CONSTRAINT chk_discontinued CHECK (discontinued IN (0,1));

-- 3. Создать новую таблицу, содержащую все продукты, снятые с продажи (discontinued = 1)

CREATE TABLE discontinued_products AS
SELECT *
FROM products
WHERE discontinued = 1;

-- 4. Удалить из products товары, снятые с продажи (discontinued = 1)
-- Для 4-го пункта может потребоваться удаление ограничения, связанного с foreign_key. Подумайте, как это можно решить, чтобы связь с таблицей order_details все же осталась.

INSERT INTO products (product_id, product_name, discontinued) VALUES (0, 'Product Deleted', 1);

UPDATE order_details
SET product_id = 0
WHERE product_id IN (SELECT product_id FROM products WHERE discontinued = 1);

DELETE FROM order_details
WHERE product_id IN (SELECT product_id FROM products WHERE discontinued = 1);

22 changes: 22 additions & 0 deletions homework-4/alter_student.sql
Original file line number Diff line number Diff line change
@@ -1,19 +1,41 @@
-- 1. Создать таблицу student с полями student_id serial, first_name varchar, last_name varchar, birthday date, phone varchar

CREATE TABLE student (
student_id serial PRIMARY KEY,
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 COLUMN birthday TO birth_date;

-- 5. Изменить тип данных колонки phone на varchar(32)

ALTER TABLE student ALTER COLUMN phone TYPE varchar(32);

-- 6. Вставить три любых записи с автогенерацией идентификатора

INSERT INTO student (first_name, last_name, birth_date, phone) VALUES
('John', 'Doe', '1990-01-01', '123-456-7890'),
('Jane', 'Smith', '1992-02-02', '234-567-8901'),
('Alice', 'Johnson', '1993-03-03', '345-678-9012');


SELECT * FROM student

-- 7. Удалить все данные из таблицы со сбросом идентификатор в исходное состояние


TRUNCATE TABLE student RESTART IDENTITY;