diff options
| author | Andrew <saintruler@gmail.com> | 2021-11-11 23:31:22 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2021-11-11 23:31:22 +0400 |
| commit | 93dbc4f894c26adfcf59d625f06848759927e190 (patch) | |
| tree | 50fd3b354cb1ab0c4bae6d135e1c0395bb6f7552 /task3_requests.sql | |
Добавил первые три задания
Diffstat (limited to 'task3_requests.sql')
| -rw-r--r-- | task3_requests.sql | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/task3_requests.sql b/task3_requests.sql new file mode 100644 index 0000000..e9effec --- /dev/null +++ b/task3_requests.sql @@ -0,0 +1,158 @@ +-- INNER JOIN, LOWER +SELECT LOWER(Customers.email) email, Orders.date +FROM Orders INNER JOIN Customers +ON Orders.customer_id = Customers.id; + +-- LEFT JOIN, UPPER +SELECT UPPER(Customers.name) name, Orders.date +FROM Orders LEFT JOIN Customers +ON Orders.customer_id = Customers.id; + +-- RIGHT JOIN +SELECT Customers.name, Orders.date +FROM Orders RIGHT JOIN Customers +ON Orders.customer_id = Customers.id; + +-- FULL JOIN, IIF +-- Выбрать все коробки и ограничить цену на обёртки в 40 рублей. +SELECT Boxes.id, order_id, warehouse_id, + IIF(price > 40, 40, price) price, + volume, weight +FROM Boxes FULL JOIN Wrappings +ON Boxes.wrapping_id = Wrappings.id; + +-- CROSS JOIN +SELECT gas_consumption, distance +FROM Vehicles CROSS JOIN Routes; + +-- CROSS APPLY +SELECT id, city_id, volume, weight +FROM Warehouses CROSS APPLY ( + SELECT Boxes.volume, Boxes.weight + FROM Boxes WHERE Boxes.warehouse_id = Warehouses.id +) ap; + +-- САМОСОЕДИНЕНИЕ +SELECT R1.city1_id, R2.city2_id, R1.distance + R2.distance AS distance +FROM Routes as R1 +INNER JOIN Routes AS R2 ON R1.city2_id = R2.city1_id; + +--- *** --- + +-- UNION +-- Все коробки, у которых обёртка должна быть мягкой или воздушно-пузырьковой. +SELECT id, volume FROM Boxes WHERE wrapping_id = 3 +UNION +SELECT id, volume FROM Boxes where wrapping_id = 4; + +-- UNION ALL +SELECT city_id FROM Warehouses +UNION ALL SELECT city_id FROM Drivers; + +-- EXCEPT +-- Выбрать все заказы, кроме сделанных 29 февраля 2004 года. +SELECT * FROM Orders +EXCEPT SELECT * FROM Orders WHERE date='2004-02-02'; + +-- INTERSECT +-- ВЫбрать доставки, в которых Водитель 1 ехал на Машине 1 +SELECT * FROM Deliveries WHERE driver_id=1 +INTERSECT SELECT * FROM Deliveries WHERE vehicle_id=1; + +--- *** --- + +-- EXISTS +-- Выбрать оплаченные заказы +SELECT * FROM Orders +WHERE EXISTS( + SELECT * FROM Payments WHERE Payments.order_id = Orders.id +); + +-- IN, BETWEEN +-- Выбрать доставки, исполненные водителями из Города #4 +-- между 20 апреля и 30 апреля 2021 года. +SELECT * FROM Deliveries +WHERE Deliveries.driver_id IN( + SELECT id FROM Drivers WHERE city_id=4 +) AND (Deliveries.date BETWEEN '2021-04-20' AND '2021-04-30'); + +-- LIKE, REPLACE +-- ВЫбрать всех клиентов с почтой на домене mail.ru и заменить этот домен на vk.com +SELECT id, name, REPLACE(email, '@mail.ru', '@vk.com') +FROM Customers WHERE email LIKE '%@mail.ru'; + +-- CASE +SELECT id, + CASE WHEN on_delivery = 1 + THEN N'Водитель в данный момент на доставке' + ELSE N'Водитель свободен' + END AS delivery_status +FROM Drivers; + +--- *** --- + +-- CAST +-- Оценить обёртку для коробок (формула не несёт особого смысла) +SELECT Boxes.id, Boxes.volume / Boxes.weight * CAST(price AS FLOAT) +FROM Boxes FULL JOIN Wrappings on Boxes.wrapping_id = Wrappings.id; + +-- CONVERT +SELECT id, CONVERT(NVARCHAR, Payments.date, 0) FROM Payments; + +-- CHOOSE +SELECT id, order_id, warehouse_id, + CHOOSE( wrapping_id, N'Жёсткая', + N'Полужёсткая', N'Мягкая', + N'Воздушно-Пузырьковая', N'Рулон') wrapping, + volume, weight +FROM Boxes; + +--- *** --- + +-- STUFF, SUBSTRING +-- Скрыть email клиентов +SELECT id, name, STUFF(SUBSTRING(email, 1, 4), 4, 1, '***') +FROM Customers; + +-- ALL +-- Выбрать наибольшую выплату. +SELECT * FROM Payments WHERE amount >= ALL (SELECT amount FROM Payments); + +-- ANY +-- Выбрать машины, занятые в заданный интервал времени +SELECT * FROM Vehicles +WHERE id = ANY ( + SELECT vehicle_id FROM Deliveries + WHERE (date BETWEEN '2021-04-20' AND '2021-04-30') +); + +-- STR +SELECT N'Площадь склада ' + STR(Warehouses.id, 3) + N' в городе ' + Cities.name + N' равна ' + STR(area, 7) +FROM Warehouses INNER JOIN Cities +ON Warehouses.city_id = Cities.id; + +--- *** --- + +-- DATEADD, SYSDATETIMEOFFSET, DATEPART, GETDATE +-- Выбрать доставки следующего месяцы +SELECT * FROM Deliveries +WHERE DATEPART(year, date) = DATEPART(year, GETDATE()) AND + DATEPART(month, DATEADD(month, 1, SYSDATETIMEOFFSET())) = + DATEPART(month, date); + +-- DATEDIFF +-- Время ожидания до доставки от оформления заказа. +SELECT Shipments.id, + DATEDIFF(year, Orders.date, Deliveries.date) * 12 + + DATEDIFF(month, Orders.date, Deliveries.date) +FROM Shipments INNER JOIN Orders +ON Shipments.order_id = Orders.id +FULL JOIN Deliveries +ON Shipments.delivery_id = Deliveries.id; + +-- DATEPART, GETDATE +-- Вычислить количество доставок в каждом месяце этого года, если их больше 50. +SELECT COUNT(id) count, DATEPART(month, date) month FROM Deliveries +WHERE DATEPART(year, date) = DATEPART(year, GETDATE()) +GROUP BY DATEPART(month, date) +HAVING COUNT(id) > 50;
\ No newline at end of file |