Files
db/labs/lab2/report.typ
2025-10-23 23:04:02 +03:00

757 lines
36 KiB
Typst
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#show link: underline
#set page(
header: context {
if counter(page).get().first() == 1 [
#align(center)[
Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики
]
]
},
footer: context {
if counter(page).get().first() == 1 [
#align(center)[Санкт-Петербург \ 2025]
] else [
#align(center)[#counter(page).display("1")]
]
}
)
#show raw.where(block: false): box.with(
fill: luma(240),
inset: (x: 3pt, y: 0pt),
outset: (y: 3pt),
radius: 2pt,
)
#show raw.where(block: true): block.with(
fill: luma(240),
inset: 10pt,
radius: 4pt,
)
// title
\
\
\
#align(center)[Факультет инфокоммуникационных технологий]
#align(center)[Направление подготовки 11.03.02]
\
\
#align(center)[Практическая работа №2]
//#align(center)[Установка и первоначальная настройка субд postgresql.]
\
\
\
\ //#align(center)[Вариант 19]
\
\
\
\
\
\
\
#align(right)[Выполнил:]
#align(right)[Дощенников Никита Андреевич]
#align(right)[Группа: К3221]
#align(right)[Проверила:]
#align(right)[Татьяна Евгеньевна Войтюк]
\
\
#pagebreak()
=== Цель работы
=== Задачи, решаемые при выполнении работы
=== Исходные данные
=== Выполнение работы
==== Задание 1. Описание структуры таблицы, выборка данных из таблицы, задание имен столбцов, сортировка строк с помощью предложения ORDER BY
===== 1.1 Будет ли успешна эта команда `SELECT`?
```sql
SELECT *
FROM "EmployeesDepartments".JOB_GRADES;
```
Нет, не будет, так как для корректного выполнения данной команды, нужно добавить кавычки у `JOB_GRADES` (Рис. 1).
#align(center)[
#figure(
image("assets/1.png"),
supplement: [Рис.],
caption: [Исполнение исправленного запроса.]
)
]
===== 1.2 Команда SELECT содержит 4 ошибки. Укажите их.
```sql
SELECT "EMPLOYEE_ID", "LAST_NAME"
"SAL" x 12 ANNUAL SALARY
FROM "EmployeesDepartments"."EMPLOYEES"
```
- Нет запятой перед `"SAL"`.
- Использовать `*` вместо `x`.
- Неправильно задан псевдоним: нужен `AS` и, раз в псевдониме пробел, - кавычки (например `AS "ANNUAL SALARY"`).
- Неправильное название стобца: вместо `SAL` должно быть `SALARY`.
Исправленная версия (Рис. 2):
```sql
SELECT "EMPLOYEE_ID", "LAST_NAME", "SALARY" * 12 AS "ANNUAL SALARY"
FROM "EmployeesDepartments"."EMPLOYEES";
```
#align(center)[
#figure(
image("assets/4.png"),
supplement: [Рис.],
caption: [Исполнение исправленного запроса.]
)
]
===== 1.3 Напишите запрос, который отображает структуру таблицы `DEPARTMENTS`, представленную на таблице 1. Сформируйте запрос на выборку данных из нее, результат должен соответствовать таблице 2.
// таблица 1
#align(center)[
#figure(
table(columns: 3)[*column_name*][*is_nullable*][*Type*][DEPARTMENT_ID][NO][smallint][DEPARTMENT_NAME][NO][character varying][MANAGER_ID][YES][integer][LOCATION_ID][YES][smallint],
caption: [Структура таблицы `DEPARTMENTS`.],
supplement: [Табл.]
)
]
```sql
SELECT column_name,
CASE WHEN is_nullable = 'YES' THEN 'YES' ELSE 'NO' END AS is_nullable,
data_type
FROM information_schema.columns
WHERE table_name = 'DEPARTMENTS'
AND table_schema IN ('EmployeesDepartments', 'public')
ORDER BY ordinal_position;
```
Этот запрос извлекает данные таблицы `DEPARTMENTS` из представления `information_schema.columns`.
- `column_name` имя столбца;
- `is_nullable` может ли столбец содержать null;
- `data_type` тип данных столбца.
Фильтрация по `table_name` и `table_schema` позволяет получить только нужную таблицу. Сортировка по `ordinal_position` отображает столбцы в порядке их создания в таблице. Результат выполнения скрипта представлен на рисунке 3.
#align(center)[
#figure(
image("assets/2.png"),
caption: [Результат выполнения запроса.],
supplement: [Рис.]
)
]
// таблица 2
#align(center)[
#figure(
table(columns: 4)[*DEPARTMENT_ID*][*DEPARTMENT_NAME*][*MANAGER_ID*][*LOCATION_ID*][10][Administration][200][1700][20][Marketing][201][1800][50][Shipping][124][1500][60][IT][103][1400][80][Sales - Europe][149][2500][85][Sales - Americas][149][2100][90][Executive][100][1700][110][Accounting][205][1700][190][Contracting][][1700],
caption: [Результат выполнения запроса к таблице `DEPARTMENTS`.],
supplement: [Табл.]
)
]
```sql
SELECT "DEPARTMENT_ID", "DEPARTMENT_NAME", "MANAGER_ID", "LOCATION_ID"
FROM "EmployeesDepartments"."DEPARTMENTS"
ORDER BY "DEPARTMENT_ID";
```
Этот запрос выбирает все данные из таблицы `DEPARTMENTS` в схеме `EmployeesDepartments`. Сортировка по `DEPARTMENT_ID` обеспечивает упорядоченный вывод строк. Результат выполнения запроса представлен на рисунке 4.
#align(center)[
#figure(
image("assets/3.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 1.4 Напишите запрос, который отображает структуру таблицы `EMPLOYEES`, представленную в таблице 3.
#align(center)[
#figure(
table(columns: 3)[*Name*][*Null?*][*Type*][HIRE_DATE][NO][date][SALARY][YES][numeric][COMMISION_PCT][YES][numeric][MANAGER_ID][YES][integer][DEPARTMENT_ID][YES][smallint][EMPLOYEE_ID][NO][integer][BONUS][YES][character varying][FIRST_NAME][YES][character varying][LAST_NAME][NO][character varying][EMAIL][NO][character varying][PHONE_NUMBER][YES][character varying][JOB_ID][NO][character varying],
caption: [Результат выполнения запроса к таблице `DEPARTMENTS`.],
supplement: [Табл.]
)
]
```sql
SELECT column_name AS "Name",
CASE WHEN is_nullable = 'YES' THEN 'YES' ELSE 'NO' END AS "Null?",
data_type AS "Type"
FROM information_schema.columns
WHERE table_schema = 'EmployeesDepartments'
AND table_name = 'EMPLOYEES'
ORDER BY ordinal_position;
```
Этот запрос извлекает информацию о столбцах таблицы `EMPLOYEES`:
- `Name` — имя столбца;
- `Null?` — может ли столбец содержать NULL;
- `Type` — тип данных столбца.
Фильтрация по `table_schema` и `table_name` позволяет получить данные только для нужной таблицы. Сортировка по `ordinal_position` отображает столбцы в том порядке, в котором они были созданы в таблице. Результат запроса приведен на рисунке 5.
#align(center)[
#figure(
image("assets/5.png"),
caption: [Результат выполнения запроса.],
supplement: [Рис.]
)
]
===== 1.5 Составьте запрос для вывода фамилии каждого служащего, должности, даты найма и номера. Номер служащего должен быть первым. Результат запроса должен быть схож с таблицей 4.
#align(center)[
#figure(
table(columns: 4)[*EMPLOYEE_ID*][*LAST_NAME*][*JOB_ID*][*HIRE_DATE*][100][King][AD_PRES][2002-06-17][101][Kochhar][AD_VP][2004-09-21][102][De Haan][AD_VP][2008-01-13][103][Hunold][IT_PROG][2005-01-03][104][Ernst][IT_PROG][2006-05-21][107][Lorentz][IT_PROG][2014-02-07][124][Mourgos][ST_MAN][2014-11-16][141][Rajs][ST_CLERK][2010-10-17][142][Davies][ST_CLERK][2012-01-29][143][Matos][ST_CLERK][2013-03-15][144][Vargas][ST_CLERK][2013-07-09][$dots$][$dots$][$dots$][$dots$],
caption: [Часть результата выполнения запроса из пункта 1.5.],
supplement: [Табл.]
)
]
```sql
SELECT "EMPLOYEE_ID",
"LAST_NAME",
"JOB_ID",
"HIRE_DATE"
FROM "EmployeesDepartments"."EMPLOYEES"
ORDER BY "EMPLOYEE_ID";
```
В этом запросе выбираются четыре столбца таблицы `EMPLOYEES`:
- `EMPLOYEE_ID` идентификатор сотрудника, выводится первым;
- `LAST_NAME` фамилия сотрудника;
- `JOB_ID` код должности;
- `HIRE_DATE` дата найма.
Сортировка по `EMPLOYEE_ID` обеспечивает упорядоченный вывод. Использование точных имён столбцов с кавычками гарантирует корректное выполнение запроса в PostgreSQL с регистрозависимыми именами. Результат выполнения запроса представлен на рисунке 6.
#align(center)[
#figure(
image("assets/6.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 1.6 Составьте запрос для вывода неповторяющихся должностей из таблицы EMPLOYEES, результат должен соответствовать таблице 5.
#align(center)[
#figure(
table(columns: 1)[*JOB_ID*][AC_ACCOUNT][AC_MGR][AD_ASST][AD_PRES][AD_VP][IT_PROG][MK_MAN][MK_REP][SA_MAN][SA_REP][SR_MK_REP][SR_SA_REP][SR_ST_CLRK][ST_CLERK][ST_MAN],
caption: [Результат выполнения запроса для вывода неповторяющихся должностей.],
supplement: [Табл.]
)
]
```sql
SELECT DISTINCT "JOB_ID"
FROM "EmployeesDepartments"."EMPLOYEES"
ORDER BY "JOB_ID";
```
В этом запросе используется ключевое слово `DISTINCT` для того, чтобы выбрать только уникальные значения столбца `JOB_ID` из таблицы `EMPLOYEES`. Сортировка по `JOB_ID` упорядочивает результат по алфавиту. Результат выполнения запроса представлен на рисунке 7.
#align(center)[
#figure(
image("assets/7.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 1.7 Выведите на экран фамилию, соединенную с идентификатором должности через запятую и пробел. Назовите новый столбец Employee and Title. Результат запроса должен быть схож с таблицей 6.
#align(center)[
#figure(
table(columns: 1)[*Employee and Title*][King, AD_PRES][Kochhar, AD_VP][De Haan, AD_VP][Hunold, IT_PROG][Ernst, IT_PROG][Lorentz, IT_PROG][Mourgos, ST_MAN][Rajs, ST_CLERK][Davies, ST_CLERK][Matos, ST_CLERK][Vargas, ST_CLERK][$dots$],
caption: [Результат выполнения запроса для вывода фамилии, соединённой с идентификатором должности.],
supplement: [Табл.]
)
]
```sql
SELECT "LAST_NAME" || ', ' || "JOB_ID" AS "Employee and Title"
FROM "EmployeesDepartments"."EMPLOYEES"
ORDER BY "EMPLOYEE_ID";
```
В этом запросе используется оператор `||` для конкатенации строк:
- сначала `LAST_NAME`,
- затем запятая и пробел `', '`,
- затем `JOB_ID`.
Результат выводится под новым именем столбца `Employee and Title`. Результат выполнения запроса представлен на рисунке 8.
#align(center)[
#figure(
image("assets/8.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
==== Задание 2. Выборка данных и изменение последовательности вывода строк, ограничение количества возвращаемых строк с помощью предложения `WHERE`, сортировка строк с помощью предложения `ORDER BY`.
===== 2.1 Создайте запрос для вывода фамилии и заработной платы служащих, зарабатывающих более 12000. Результат выполнения запроса должен соответствовать таблице 7.
#align(center)[
#figure(
table(columns: 2)[*LAST_NAME*][*SALARY*][King][24000][Kochhar][17000][De Haan][17000][Hartstein][13000],
caption: [Результат выполнения запроса для вывода фамилии и заработной платы служащих],
supplement: [Рис.]
)
]
```sql
SELECT "LAST_NAME", "SALARY"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "SALARY" > 12000
ORDER BY "SALARY" DESC;
```
- выбираются столбцы `LAST_NAME` и `SALARY` из таблицы `EMPLOYEES`;
- фильтруются только те строки, где заработная плата больше 12000;
- строки сортируются по убыванию зарплаты, чтобы сначала отображались сотрудники с наибольшей зарплатой.
Результат выполнения запроса представлен на рисунке 9.
#align(center)[
#figure(
image("assets/9.png"),
caption: [Результат выполнения запроса.],
supplement: [Рис.]
)
]
===== 2.2 Создайте запрос для вывода фамилии и номера отдела служащего под номером 176. Результат выполнения запроса должен соответствовать таблице 7.
#align(center)[
#figure(
table(columns: 2)[*LAST_NAME*][*DEPARTMENT_ID*][Taylor][80],
supplement: [Табл.],
caption: [Результат выполнения запроса для служащего под номером 176.]
)
]
```sql
SELECT "LAST_NAME", "DEPARTMENT_ID"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "EMPLOYEE_ID" = 176;
```
- выбираются столбцы `LAST_NAME` и `DEPARTMENT_ID` из таблицы `EMPLOYEES`;
- фильтрация выполняется по точному значению `EMPLOYEE_ID` с помощью условия `WHERE`;
Результат выполнения запроса представлен на рисунке 10.
#align(center)[
#figure(
image("assets/10.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.3 Измените запрос из задания 2.1 и выведите фамилии и оклады всех служащих, чей оклад не входит в диапазон от 5000 до 12000. Результат выполнения запроса должен быть схож с таблицей 8.
#align(center)[
#figure(
table(columns: 2)[*LAST_NAME*][*SALARY*][King][24000.00][Kochhar][17000.00][De Haan][17000.00][Lorentz][4200.00][Rajs][3500.00][Davies][3100.00][Matos][2600.00][Vargas][2500.00][Whalen][4400.00][Hartstein][13000.00],
supplement: [Табл.],
caption: [Результат выполнения запроса для служащих, чей оклад не входит в диапазон от 5000 до 12000.]
)
]
```sql
SELECT "LAST_NAME", "SALARY"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "SALARY" < 5000 OR "SALARY" > 12000
ORDER BY "SALARY" DESC;
```
- выбираются столбцы `LAST_NAME` и `SALARY` из таблицы `EMPLOYEES`;
- фильтруются строки, где оклад не входит в диапазон от 5000 до 12000, с помощью условия `WHERE ... OR`;
- строки сортируются по убыванию оклада.
Результат выполнения запроса представлен на рисунке 11.
#align(center)[
#figure(
image("assets/11.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.4 Выведите фамилию, идентификатор должности и дату начала работы всех служащих, нанятых в период с 16 февраля 2011 по 12 мая 2011г. Отсортируйте данные в порядке возрастания даты найма. Результат выполнения запроса должен соответствовать таблице 9.
#align(center)[
#figure(
table(columns: 3)[*LAST_NAME*][*JOB_ID*][*HIRE_DATE*][Hartstein][MK_MAN][2011-02-17][Abel][SA_REP][2011-05-11],
supplement: [Табл.],
caption: [Результат выполнения запроса для служащих, нанятых в период с 16 февраля 2011 по 12 мая 2011г.]
)
]
```sql
SELECT "LAST_NAME", "JOB_ID", "HIRE_DATE"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "HIRE_DATE" BETWEEN '2011-02-16' AND '2011-05-12'
ORDER BY "HIRE_DATE" ASC;
```
- выбираются столбцы `LAST_NAME`, `JOB_ID` и `HIRE_DATE` из таблицы `EMPLOYEES`;
- фильтрация выполняется по дате найма с помощью предложения `WHERE` и `BETWEEN`, чтобы выбрать сотрудников, нанятых с 16 февраля по 12 мая 2011 года включительно;
- сортировка по возрастанию даты найма.
Результат выполнения запроса представлен на рисунке 12.
#align(center)[
#figure(
image("assets/12.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.5 Выведите фамилию и номер отдела всех служащих из отделов 20 и 50. Отсортируйте данные по фамилиям в алфавитном порядке. Результат выполнения запроса должен быть схож с таблицей 10.
#align(center)[
#figure(
table(columns: 2)[*LAST_NAME*][*DEPARTMENT_ID*][Bell][50][Davies][50][Fay][20][Hartstein][20][Heiden][50][Matos][50][Mourgos][50],
supplement: [Табл.],
caption: [Результат выполнения запроса для служащих из отделов 20 и 50.]
)
]
```sql
SELECT "LAST_NAME", "DEPARTMENT_ID"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "DEPARTMENT_ID" IN (20, 50)
ORDER BY "LAST_NAME" ASC;
```
- выбираются столбцы `LAST_NAME` и `DEPARTMENT_ID` из таблицы `EMPLOYEES`;
- фильтруются сотрудники, работающие в отделах 20 и 50 с помощью условия `WHERE ... IN`;
- сортировка по фамилии.
Результат выполнения запроса представлен на рисунке 13.
#align(center)[
#figure(
image("assets/13.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.6 Измените запрос из задания 2.3 для вывода фамилий и окладов служащих отделов 20 и 50, зарабатывающих от 5000 до 12000. Назовите столбцы Employee и Mounthly Salary, соответственно. Результат выполнения запроса должен соответствовать таблице 11.
#align(center)[
#figure(
table(columns: 2)[*EMPLOYEE*][*Mounthly Salary*][Safwah][5000.00][Mourgos][5800.00][Steiner][8600.00],
supplement: [Табл.],
caption: [Результат выполнения запроса для служащих из отделов 20 и 50, зарабатывающих от 5000 до 12000.]
)
]
```sql
SELECT "LAST_NAME" AS "EMPLOYEE", "SALARY" AS "Mounthly Salary"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "DEPARTMENT_ID" IN (20, 50)
AND "SALARY" BETWEEN 5000 AND 12000
ORDER BY "LAST_NAME" ASC;
```
- выбираются столбцы `LAST_NAME` и `SALARY` из таблицы `EMPLOYEES`;
- столбцы переименовываются через `AS` в `EMPLOYEE` и `Mounthly Salary`;
- фильтруются сотрудники, работающие в отделах 20 и 50 с зарплатой от 5000 до 12000 с помощью `WHERE ... AND ... BETWEEN`;
- сортировка по фамилии.
Результат выполнения запроса представлен на рисунке 14.
#align(center)[
#figure(
image("assets/14.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.7 Выведите фамилии и должности всех служащих, не имеющих менеджера. Результат выполнения запроса должен соответствовать таблице 12.
#align(center)[
#figure(
table(columns: 2)[*LAST_NAME*][*JOB_ID*][King][AD_PRES],
supplement: [Табл.],
caption: [Результат выполнения запроса для служащих, не имеющих менеджера.]
)
]
```sql
SELECT "LAST_NAME", "JOB_ID"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "MANAGER_ID" IS NULL;
```
- выбираются столбцы `LAST_NAME` и `JOB_ID` из таблицы `EMPLOYEES`;
- фильтруются сотрудники, у которых нет менеджера, с помощью условия `WHERE "MANAGER_ID" IS NULL`;
- результат содержит только тех сотрудников, которые не подчиняются никому.
Результат выполнения запроса представлен на рисунке 15.
#align(center)[
#figure(
image("assets/15.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.8 Выведите фамилию, и комиссионные всех служащих, зарабатывающих комиссионные. Отсортируйте данные в порядке убывания окладов и комиссионных. Результат выполнения запроса должен соответствовать таблице 13.
#align(center)[
#figure(
table(columns: 3)[*LAST_NAME*][*SALARY*][*COMMISION_PCT*][Grant][7000.00][0.15][Alves Rocha][7300.00][0.15][Almeida Castro][7300.00][0.20][Silva Pinto][7500.00][0.15][Taylor][8600.00][0.20][Barbosa Souza][9500.00][0.20][Hooper][9600.00][0.20][Zlotkey][10500.00][0.20][Abel][11000.00][0.30],
supplement: [Табл.],
caption: [Результат выполнения запроса для служащих, зарабатывающих комиссионные.]
)
]
```sql
SELECT "LAST_NAME", "SALARY", "COMMISSION_PCT"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "COMMISSION_PCT" IS NOT NULL
ORDER BY "SALARY" DESC, "COMMISSION_PCT" DESC;
```
- `WHERE "COMMISSION_PCT" IS NOT NULL` — отбирает только сотрудников, которые получают комиссионные.
- `ORDER BY "SALARY" DESC, "COMMISSION_PCT" DESC` — сортировка по зарплате сначала от большей к меньшей, а при равной зарплате — по комиссионным.
Результат выполнения запроса представлен на рисунке 16.
#align(center)[
#figure(
image("assets/16.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.9 Выведите все фамилии служащих БЕЗ использования строковых функций, в которых третья буква - _а_. Результат выполнения запроса должен соответствовать таблице 14.
#align(center)[
#figure(
table(columns: 1)[*LAST_NAME*][Grant][Whalen],
supplement: [Табл.],
caption: [Результат выполнения запроса (фамилии служащих, в которых третья буква _a_).]
)
]
```sql
SELECT "LAST_NAME"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "LAST_NAME" LIKE '__a%'
ORDER BY "LAST_NAME" ASC;
```
- используется оператор `LIKE` для поиска шаблона в столбце `LAST_NAME`;
- `'__a%'` означает:
- первые две символа могут быть любыми,
- третий символ — буква 'a',
- `%` соответствует любому количеству оставшихся символов;
- сортировка по фамилии.
Результат выполнения запроса представлен на рисунке 17.
#align(center)[
#figure(
image("assets/17.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.10 Выведите фамилии, должности и оклады всех служащих, работающих торговыми представителями (SA_REP) или клерками на складе (ST_CLERK), с окладом не равным 2600, 3100, 8600 и 11000. Результат выполнения запроса должен соответствовать таблице 15.
#align(center)[
#figure(
table(columns: 3)[*LAST_NAME*][*JOB_ID*][*SALARY*][Rajs][ST_CLERK][3500.00][Vargas][ST_CLERK][2500.00][Grant][SA_REP][7000.0][Silva Pinto][SA_REP][7500.00][Alves Rocha][SA_REP][7300.00][Almeida Castro][SA_REP][7300.00],
supplement: [Табл.],
caption: [Результат выполнения запроса.]
)
]
```sql
SELECT "LAST_NAME", "JOB_ID", "SALARY"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "JOB_ID" IN ('SA_REP', 'ST_CLERK')
AND "SALARY" NOT IN (2600, 3100, 8600, 11000)
ORDER BY "LAST_NAME" ASC;
```
- выбираются столбцы `LAST_NAME`, `JOB_ID` и `SALARY` из таблицы `EMPLOYEES`;
- фильтруются только сотрудники с должностями `SA_REP` или `ST_CLERK` c помощью условия `WHERE ... IN`;
- дополнительно исключаются строки с окладами 2600, 3100, 8600 и 11000 с помощью `NOT IN`;
- сортировка по фамилии.
Результат выполнения запроса представлен на рисунке 18.
#align(center)[
#figure(
image("assets/18.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 2.11 Измените запрос 2.8 так, чтобы получить фамилии, оклады и комиссионные всех служащих, у которых сумма комиссионных равна или превышает 20%. Выполните запрос еще раз. Результат выполнения запроса должен соответствовать таблице 16.
#align(center)[
#figure(
table(columns: 3)[*Employee*][*Monthly Salary*][*COMMISION_PCT*][Almeida Castro][7300.00][0.20][Taylor][8600.00][0.20][Barbosa Souza][9500.00][0.20][Hooper][9600.00][0.20][Zlotkey][10500.00][0.20][Abel][11000.00][0.30],
supplement: [Табл.],
caption: [Результат выполнения запроса.]
)
]
```sql
SELECT "LAST_NAME" AS "Employee",
"SALARY" AS "Monthly Salary",
"COMMISSION_PCT"
FROM "EmployeesDepartments"."EMPLOYEES"
WHERE "COMMISSION_PCT" >= 0.20
ORDER BY "LAST_NAME" ASC;
```
- выбираются фамилии сотрудников `LAST_NAME`, месячная зарплата `SALARY` и процент комиссионных `COMMISSION_PCT`;
- фильтруются только те сотрудники, у которых `COMMISSION_PCT` $gt.eq$ 0.20, то есть сумма комиссионных равна или превышает 20%;
- столбцы переименованы с помощью `AS`;
- сортировка по фамилии.
Результат выполнения запроса представлен на рисунке 19.
#align(center)[
#figure(
image("assets/19.png"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
==== Задание 3. Составление запросов, требующих использования числовых функций (TRUNC, ROUND и т.д.)
===== 3.1 Выведите номер служащего, его фамилию, оклад, повышенный на 9.5%. Новый оклад должен быть округлен до целого. Назовите столбец New Salary. Результат выполнения запроса должен быть подобен результату, представленному в таблице 17.
#align(center)[
#figure(
table(columns: 4)[*EMPLOYEE_ID*][*LAST_NAME*][*SALARY*][*New Salary*][100][King][24000.00][26280][101][Kochhar][17000.00][18615][102][De Haan][17000.00][18615][103][Hunold][9000.00][9855][104][Ernst][6000.00][6570][$dots$][$dots$][$dots$][$dots$],
supplement: [Табл.],
caption: [Результат выполнения запроса.]
)
]
```sql
```
#align(center)[
#figure(
image("assets/"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
===== 3.2 Измените запрос из пункта 3.1, добавив еще один столбец, который будет содержать результат вычитания старого оклада из нового. Назовите столбец Increase. Результат выполнения запроса должен быть подобен результату, представленному в таблице 18.
#align(center)[
#figure(
table(columns: 5)[*EMPLOYEE_ID*][*LAST_NAME*][*SALARY*][*New Salary*][*Increase*][100][King][24000.00][26280][2280][101][Kochhar][17000.00][18615][1615][102][De Haan][17000.00][18615][1615][103][Hunold][9000.00][9855][855][104][Ernst][6000.00][6570][570][$dots$][$dots$][$dots$][$dots$][$dots$],
supplement: [Табл.],
caption: [Результат выполнения запроса.]
)
]
```sql
```
#align(center)[
#figure(
image("assets/"),
supplement: [Рис.],
caption: [Результат выполнения запроса.]
)
]
==== Задание 4. Составление запросов, требующих символьных функций (INITCAP, POSITION, LENGTH, CONCAT и т.д.)
===== 4.1 Создайте запрос для вывода всех данных из таблицы EMPLOYEES. Разделите столбцы запятыми. Назовите столбец THE_OUTPUT. Результат запроса должен быть схож с таблицей 19.
===== 4.2 Создайте запрос для вывода фамилий служащих (первая буква каждой фамилии должна быть заглавной, а остальные - строчными) и длину каждой фамилии для тех служащих, фамилия которых начинается с символа _J, A_ или _M_. Присвойте соответствующие заголовки столбцам. Результат выполнения запроса должен соответствовать таблице 20.
===== 4.3 Создайте запрос для вывода информации по каждому служащему в следующем виде: \<фамилия\> зарабатывает \<оклад\> в месяц, но желает \<утроенный оклад\>. Назовите столбец Dream Salaries. Результат запроса должен быть схож с таблицей 21.
==== Задание 5. Составление запросов, требующих функций для работы с датами и функции преобразования типов.
===== 5.1 Напишите запрос для вывода текущей даты. Назовите столбец Date. Результат выполнения запроса должен быть подобен результату, представленному на таблице 22.
===== 5.2 Создайте запрос для вывода фамилии и даты найма всех служащих, нанятых в 2011 г. Результат выполнения запроса должен соответствовать таблице 23.
===== 5.3 Создайте запрос, который позволяет для каждого служащего вывести фамилию, дату найма и вычислят количество месяцев со дня найма до настоящего времени. Назовите столбец MONTH_WORKED. Результаты отсортируйте по количеству отработанных месяцев. Результат выполнения запроса должен быть схож с таблицей 24.
===== 5.4 Создайте запрос, который позволяет для каждого служащего вывести фамилию, дату найма и день недели, когда он был нанят на работу. Назовите последний столбец DAY. Отсортируйте результаты по датам. Результат выполнения запроса должен быть схож с таблицей 25.
==== Задание 6. Составление запросов, требующих применения условных выражений.
===== 6.1 Создайте запрос, который позволяет для каждого служащего вывести фамилию и сумму комиссионных. Если служащий не зарабатывает комиссионных, укажите в столбце "No Commission". Назовите столбец COMM. Используются ф-ции преобразования типов и условное выражение COALESCE. Результат выполнения запроса должен быть схож с таблицей 25.
===== 6.2 Создайте запрос, который позволяет для каждого служащего вывести должность и её разряда (grade), используя условное выражение CASE. Разряд каждого типа должности JOB_ID приведён на рисунке 6.2, а результат выполнения запроса должен быть схож с таблицей 26.
=== Выводы и анализ результатов работы