diff --git a/lab2.sql b/lab2.sql new file mode 100644 index 0000000..a6444c3 --- /dev/null +++ b/lab2.sql @@ -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]+';