Skip to content
Open
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
171 changes: 171 additions & 0 deletions lab2.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
--Лабораторная работа 2
--Задание 1. Написание запросов к БД
--1. Выведите информацию о заказчиках, сформировав два вычисляемых столбца: Фамилия заказчика и Имя заказчика.

SELECT
TRIM(SPLIT_PART(contactname, ',', 2)) as "Name",
TRIM(SPLIT_PART(contactname, ',', 1)) as "Surname"
FROM "Sales"."Customers";

--2. На основе таблицы Employees напишите запрос, возвращающий таблицу из 3 столбцов: Фамилия сотрудника, Имя сотрудника, e-mail адрес.
--Столбец e-mail адрес должен быть сформирован в соответствие со следующим шаблоном: <имя>.<фамилия>@<названиеорганизации>.ru.
--Название организации придумайте сами! Полученные e-mail должны быть в нижнем регистре.
--Символы, недопустимые в адресе эл.почты, должны быть заменены нижним подчеркиванием.

SELECT
lastname AS "Surname",
firstname AS "Name",
LOWER(
REGEXP_REPLACE(
CONCAT(
firstname,
'.',
lastname
),
'[^a-zA-Z0-9._-]',
'_',
'g'
)
) || '@supercorp.org' AS "E-mail"
FROM "HR"."Employees";

--3. Напишите запрос, возвращающий набор уникальных записей из таблиц Employees и Customers.
--Результирующая таблица должна содержать 3 столбца: country, region, city.

SELECT
country,
region,
city
FROM "HR"."Employees"
UNION
SELECT
country,
region,
city
FROM "Sales"."Customers"
ORDER BY country, region, city;

--4. На основании данных ТОЛЬКО таблицы Products (запрос только к одной таблице!) сформируйте таблицу из трех столбцов:
--Номер категории, Название продукта и Название категории.
--Название категории должно выводиться в соответствии с ее номером:
--1 - 'Beverages'; 2 - 'Condiments'; 3 - 'Confections'; 4 - 'Dairy Products'; 5 - 'Grains/Cereals'; 6 - 'Meat/Poultry'; 7 - 'Produce'; 8 - 'Seafood'.
--Для категорий, не попавших в данный список, необходимо вернуть значение 'Other'

SELECT
categoryid,
productname,
CASE categoryid
WHEN 1 THEN 'Beverages'
WHEN 2 THEN 'Condiments'
WHEN 3 THEN 'Confections'
WHEN 4 THEN 'Dairy Products'
WHEN 5 THEN 'Grains/Cereals'
WHEN 6 THEN 'Meat/Poultry'
WHEN 7 THEN 'Produce'
WHEN 8 THEN 'Seafood'
ELSE 'Other'
END AS "categoryname"
FROM "Production"."Products"
ORDER BY categoryid, productname;

--5. Напишите запрос, возвращающий выборку следующего вида: ФИО сотрудника, месяц рождения сотрудника (название месяца, не число!!!!),
--год рождения сотрудника, полный адрес (Страна, город, регион)

SELECT
CONCAT(firstname, ' ', lastname) as "Name",
TO_CHAR(birthdate, 'Month') AS "Birth month",
EXTRACT(YEAR FROM birthdate) AS "Birth year",
CONCAT_WS(', ',
country,
region,
city,
address
) AS "Full address"
FROM "HR"."Employees"
ORDER BY "Name";

--6. Напишите запрос, возвращающий следующие данные о сотрудниках: номер сотрудника, фамилия сотрудника,
--дата рождения и вычисляемый столбец «ДР». Вычисляемый столбец должен содержать 1- если дня рождения еще не было, или 0 – если день рождения уже прошел.
--Отсортируйте результирующую выборку таким образом, чтобы работники у которых еще не было дня рождения были сверху,
--причем в порядке «приближения» дня рождения.

SELECT
empid AS "Employee ID",
lastname AS "Employee Surname",
birthdate AS "Employee Birthdate",
CASE
WHEN TO_CHAR(CURRENT_DATE, 'MM-DD') >= TO_CHAR(birthdate, 'MM-DD')
THEN 0
ELSE 1
END AS "ДР"
FROM "HR"."Employees"
ORDER BY
"ДР" DESC,
TO_CHAR(birthdate, 'MM-DD');


--Задание 2. Использование фильтрации
--1. Выведите из таблицы, содержащей сведения о заказах строки с 51 по 100, упорядоченные по дате заказа

SELECT *
FROM "Sales"."Orders"
ORDER BY orderdate
OFFSET 50 ROWS
FETCH NEXT 50 ROWS ONLY;

--2. Отобразите поставщиков, у которых отсутствует факс

SELECT *
FROM "Production"."Suppliers"
WHERE Fax IS NULL OR Fax = '' OR Fax = 'NULL';

--3. Выведите название и цену продуктов, при условии, что цена находится в диапазоне от 100 до 250.

SELECT productname, unitprice
FROM "Production"."Products"
WHERE unitprice BETWEEN 100::money AND 250::money;

--4. Напишите запрос, возвращающий список работников мужского пола, работающие менеджерами в Лондоне.

SELECT *
FROM "HR"."Employees"
WHERE city = 'London'
AND title ILIKE '%manager%'
AND titleofcourtesy IN ('Mr.', 'Dr.', 'mr.', 'dr.', 'Mr', 'Dr', 'mr', 'dr');

--5. Выведите все заказы, сделанные (оформленные) после 10 апреля 2008 года

SELECT *
FROM "Sales"."Orders"
WHERE orderdate > '2008-04-10';

--6. Напишите запрос, извлекающий запись о сотруднике с номером телефона (206) 555-0100

SELECT *
FROM "HR"."Employees"
WHERE Phone = '(206) 555-0100';

--7. Выведите заказчиков с именами кроме “Linda”, “Robert”, “Ann”, “Venky”

SELECT *
FROM "Sales"."Customers"
WHERE contactname !~ '(^|, )(Linda|Robert|Ann|Venky)(,|$)';

--8. Выведите информацию о заказчиках, сформировав два вычисляемых столбца: Фамилия заказчика и Имя заказчика.
--В результирующую выборку должны попасть только те заказчики, чье имя начинается либо на букву "P" либо на букву "M",
--а фамилия при этом начинается либо на “S” либо на “K”. Фильтрация должна производится на исходных данных столбца (не на вычисляемом выражении)

SELECT
TRIM(SPLIT_PART(contactname, ',', 1)) AS "Surname",
TRIM(SPLIT_PART(contactname, ',', 2)) AS "Name"
FROM "Sales"."Customers"
WHERE contactname SIMILAR TO '(S|K)%, (P|M)%';

--9. Выведите заказчиков, чьи контактные данные состоят из двух и более частей.

SELECT *
FROM "Sales"."Customers"
WHERE
TRIM(SUBSTRING(contactname FROM 1 FOR POSITION(',' IN contactname) - 1)) ~ '^[A-Za-z]+\s+[A-Za-z]+'
OR
TRIM(SUBSTRING(contactname FROM POSITION(',' IN contactname) + 1)) ~ '^[A-Za-z]+\s+[A-Za-z]+';