upd
BIN
labs/lab2/assets/10.png
Normal file
|
After Width: | Height: | Size: 337 KiB |
BIN
labs/lab2/assets/11.png
Normal file
|
After Width: | Height: | Size: 356 KiB |
BIN
labs/lab2/assets/12.png
Normal file
|
After Width: | Height: | Size: 337 KiB |
BIN
labs/lab2/assets/13.png
Normal file
|
After Width: | Height: | Size: 341 KiB |
BIN
labs/lab2/assets/14.png
Normal file
|
After Width: | Height: | Size: 330 KiB |
BIN
labs/lab2/assets/15.png
Normal file
|
After Width: | Height: | Size: 322 KiB |
BIN
labs/lab2/assets/16.png
Normal file
|
After Width: | Height: | Size: 386 KiB |
BIN
labs/lab2/assets/17.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
labs/lab2/assets/18.png
Normal file
|
After Width: | Height: | Size: 383 KiB |
BIN
labs/lab2/assets/19.png
Normal file
|
After Width: | Height: | Size: 378 KiB |
BIN
labs/lab2/assets/3.png
Normal file
|
After Width: | Height: | Size: 382 KiB |
BIN
labs/lab2/assets/4.png
Normal file
|
After Width: | Height: | Size: 325 KiB |
BIN
labs/lab2/assets/5.png
Normal file
|
After Width: | Height: | Size: 376 KiB |
BIN
labs/lab2/assets/6.png
Normal file
|
After Width: | Height: | Size: 334 KiB |
BIN
labs/lab2/assets/7.png
Normal file
|
After Width: | Height: | Size: 340 KiB |
BIN
labs/lab2/assets/8.png
Normal file
|
After Width: | Height: | Size: 350 KiB |
BIN
labs/lab2/assets/9.png
Normal file
|
After Width: | Height: | Size: 333 KiB |
@@ -68,6 +68,8 @@
|
||||
|
||||
=== Исходные данные
|
||||
|
||||
=== Выполнение работы
|
||||
|
||||
==== Задание 1. Описание структуры таблицы, выборка данных из таблицы, задание имен столбцов, сортировка строк с помощью предложения ORDER BY
|
||||
|
||||
===== 1.1 Будет ли успешна эта команда `SELECT`?
|
||||
@@ -82,8 +84,8 @@ FROM "EmployeesDepartments".JOB_GRADES;
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/1.png"),
|
||||
supplement: [Рис],
|
||||
caption: []
|
||||
supplement: [Рис.],
|
||||
caption: [Исполнение исправленного запроса.]
|
||||
)
|
||||
]
|
||||
|
||||
@@ -100,13 +102,21 @@ FROM "EmployeesDepartments"."EMPLOYEES"
|
||||
- Неправильно задан псевдоним: нужен `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
|
||||
@@ -128,11 +138,19 @@ WHERE table_name = 'DEPARTMENTS'
|
||||
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: [Рис]
|
||||
supplement: [Рис.]
|
||||
)
|
||||
]
|
||||
|
||||
@@ -151,10 +169,13 @@ FROM "EmployeesDepartments"."DEPARTMENTS"
|
||||
ORDER BY "DEPARTMENT_ID";
|
||||
```
|
||||
|
||||
Этот запрос выбирает все данные из таблицы `DEPARTMENTS` в схеме `EmployeesDepartments`. Сортировка по `DEPARTMENT_ID` обеспечивает упорядоченный вывод строк. Результат выполнения запроса представлен на рисунке 4.
|
||||
|
||||
|
||||
#align(center)[
|
||||
#figure(
|
||||
image("assets/3.png"),
|
||||
supplement: [Рис],
|
||||
supplement: [Рис.],
|
||||
caption: [Результат выполнения запроса.]
|
||||
)
|
||||
]
|
||||
@@ -169,6 +190,33 @@ ORDER BY "DEPARTMENT_ID";
|
||||
)
|
||||
]
|
||||
|
||||
```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)[
|
||||
@@ -179,6 +227,33 @@ ORDER BY "DEPARTMENT_ID";
|
||||
)
|
||||
]
|
||||
|
||||
```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)[
|
||||
@@ -189,6 +264,23 @@ ORDER BY "DEPARTMENT_ID";
|
||||
)
|
||||
]
|
||||
|
||||
```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)[
|
||||
@@ -199,10 +291,448 @@ ORDER BY "DEPARTMENT_ID";
|
||||
)
|
||||
]
|
||||
|
||||
```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.
|
||||
|
||||
=== Выводы и анализ результатов работы
|
||||
|
||||
|
||||