---
# System prepended metadata

title: Решения

---

---
title: Решения
---

<style>
 body{overflow-x:hidden;color:#312928;background:#f5f3ed url(https://i.imgur.com/B8wy02N.png) top left repeat}:root{--color-primary:#004d40;--color-primary-dark:#1c1c1e;--color-primary-darker:#111;--color-primary-light:#39796b;--color-secondary:#00838f;--color-secondary-dark:#005662;--color-secondary-light:#4fb3bf;--color-accent:#9d76ff;--border-color:#080808;--text-color-light:#8effff;--text-color-bright:#fff;--text-color-dark:#333}#doc{display:block;width:100%;margin:31px auto 31px;background:#f5f3ed url(https://i.imgur.com/S2fW9vg.jpg) top left repeat;border-image-width:100px;border:32px solid;border-image:url(https://i.imgur.com/XzF7kg2.png) 38 round round}.tool-bar>a.fa{color:var(--color-primary-light) !important;border:none}.tool-bar>a.fa:hover{color:var(--text-color-bright) !important}.ui-infobar__user-info>ul>li>div>.flex>span{color:var(--text-color-light) !important}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:500;text-align:left;border:none;text-align:center;font-size:80px;color:#424242;font-family:cursive}
.markdown-body h1,.markdown-body h2{text-align:center}}.markdown-body h2{border-bottom:1px solid var(--color-secondary)}.markdown-body h1{font-size:3.7em;text-align:center}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.4em}.markdown-body h4{font-size:1.3em}.markdown-body h5{font-size:1.2em}.markdown-body h6{font-size:.8em}.markdown-body hr{background-color:var(--color-secondary);margin:1.25em 0;height:1.1px}.markdown-body blockquote,.markdown-body blockquote blockquote{border-left-color:var(--color-secondary);color:#999;padding:0 !important;padding-right:5em !important}.markdown-body blockquote:before{color:var(--color-secondary)}.markdown-body blockquote small,.markdown-body blockquote i.fa{color:var(--color-accent);opacity:.8}.markdown-body table{display:table;padding:1em;margin-left:1em;width:calc(100% - 2em)}.markdown-body table th,.markdown-body table td,.markdown-body table tr{border:none !important}.markdown-body table tr{background-color:transparent !important;border-bottom:1px solid rgba(255,255,255,.3) !important}
.markdown-body .sequence-diagram rect[stroke=none](/null){fill:#000;opacity:.2;filter:invert(1)}.markdown-body .graphviz polygon{fill:transparent}.markdown-body .vega svg{background-color:transparent !important}.markdown-body .fretboard .svg_wrapper{background-color:transparent}.markdown-body .alert{color:#fff;position:relative;z-index:1;padding:0;border:none;font-weight:500}.markdown-body p{padding:0 1em}.markdown-body .alert-success:before,.markdown-body .alert-info:before,.markdown-body .alert-warning:before,.markdown-body .alert-danger:before{content:' ';position:absolute;z-index:-1;width:100%;height:100%}

    h1:after,h2:after,h3:after,h4:after,h3.md-focus:before,h4.md-focus:before,h3.md-focus:after,h4.md-focus:after{content:'';display:block;background-repeat:no-repeat;background-position:top center;background-size:auto 80%;width:100%;z-index:1;margin:0;padding:20px 30px;border:0}h1:after,h2:after,h3:after,h4:after{background-image:url("https://lh3.googleusercontent.com/wJsGW_MA3V4aC2clzv0Z0OAVWwdXE11CFoA2LjG-1AavRukDFaCBQU5HqJKe9oi57buAMrsCEkd9XJeIBfGjP4h7HzOKhIjANL94EnNrD8GADHG7I-3GFLdHVq_bF1DJSYCPj9tu5CPzv4Lb4an0Ef93_CRbZ--6QyqFrNWzHz5XL-iRrzbrrA")}table{width:550px;margin:24px auto;border-collapse:separate;border-spacing:4px}tr:nth-child(odd){background-color:#f0f8ff}tr:nth-child(even){background-color:#ffb6c1}td{vertical-align:top;padding:8px 16px}td:first-child{text-align:center}td:not(:first-child){text-align:left}:root{--black:#111;--white:#f2f2f2;--grey:#ccc;--blue:#03a9f4;--border-radius:10px;--box-shadow:0px 3px 6px rgba(0,0,0,.25)}.list{      z-index: -1; margin:0;padding:0;padding-bottom:5px;box-sizing:border-box;position:relative;padding-top: 10px;background:#eae7df;width:80%;border-radius:var(--border-radius);box-shadow:var(--box-shadow);margin:1.5rem;& h2{background:var(--blue);color:var(--white);padding:1rem 2rem;border-radius:var(--border-radius) var(--border-radius) 0 0}
& tbody{position:relative;padding:2em;& tr{position:relative;list-style:none;padding:1rem 0;border-bottom:1px solid rgba(0,0,0,.1);&:last-child{border-bottom:none}}}}.hoverTable{ list-style:none;margin:0;padding:0;margin:0 10px -8px -20px;padding-top: 70px;}.hoverTable a{background:##f4f3ee;color: #312928;border-radius:3px;box-shadow:1px solid red}.hoverTable li{background:#efeee9eb !important;    margin: 10px;
    border: 1px solid #b9ab9e;}.hoverTable li:hover{background-color:white;!important}

    #doc pre{background-color:#f4f3ee !important}.ui-infobar{margin:0;max-width:none;width:100%;height:80px;display:flex;justify-content:flex-end;align-items:center;box-shadow:0 1px 10px rgb(0 0 0/20%),0 1px 1px rgb(0 0 0/20%);box-sizing:border-box;margin-bottom:100px;position:relative;background:#f5f3ed url(https://i.imgur.com/D3JHgvv.png) top left repeat}.ui-infobar:after{content:'';position:absolute;z-index:-1;bottom:-300px;display:block;width:100%;height:300px;background:url(https://i.imgur.com/kZDzETE.png) no-repeat,url(https://i.imgur.com/visfeOY.png) repeat-x}#doc,.toc{z-index:100;!important}.container-fluid{padding-right:0;padding-left:15px;margin-right:auto;margin-left:auto}#ui-toc-affix{z-index:1000;font-size:1.2em}.ui-comment-app{right:100px!important;top:100px}.ui-toc-dropdown .nav>li>a{font-size:25px}.ui-comment-container{margin-left:55px !important}.ribbon-container{background:0 0 !important;position:relative;z-index:1;top:-30px}.ribbon{background:#f6a655 url(http://portfolio.queenofwhisks.com/demo/overlay/noise.png);box-shadow:2px 6px 12px rgba(0,0,0,.5);font-family:Charter,serif;font-size:16px;line-height:1;text-align:center;margin:0 auto;padding:.25em 0;position:relative;width:86%;top:80px}
.ribbon:before,.ribbon:after{border:1.5em solid #ee9e4f;content:'';display:block;position:absolute;bottom:-1em;z-index:-1}.ribbon:before{left:-2em;border-right-width:1.5em;border-left-color:transparent;box-shadow:2px 2px 2px rgba(0,0,0,.5)}.ribbon:after{right:-2em;border-left-width:1.5em;border-right-color:transparent;box-shadow:-2px 2px 2px rgba(0,0,0,.5)}.ribbon-content{border-top:.0625em dashed #d5700b;border-bottom:.0625em dashed #d5700b;box-shadow:inset 0px 1px 1px rgba(0,0,0,.08),inset 0px -1px 1px rgba(255,255,255,.08),0px -1px 1px rgba(255,255,255,.2),0px 1px 1px rgba(0,0,0,.08);display:block;padding:.6875em 0}.ribbon-content:before,.ribbon-content:after{content:'';display:block;position:absolute;border-style:solid;border-color:#b86614 transparent transparent;bottom:-1em}.ribbon-content:before{left:0;border-width:1em 0 0 1em}.ribbon-content:after{right:0;border-width:1em 1em 0 0}.ribbon a{color:#c2660a;text-decoration:none;text-shadow:1px 1px 1px rgba(255,255,255,.25)}

</style>




## Selecting HR Schema Using Oracle Live SQL

<center>
<iframe width="100%" height="420" src="https://www.youtube.com/embed/TXp9b-RpIbw" title="Selecting HR Schema Using Oracle Live SQL" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</center>


<br>

<br>

<center><img src="https://i.imgur.com/9fMgT3O.jpg" alt="Иллюстрация решения 116 задачи." width="90%" height="auto" /><br>
<i>Иллюстрация решения 116 задачи.</i></center>

<br>
<br>

<center><img src="https://i.imgur.com/Wl5GyoU.jpg" alt="Иллюстрация решения 202 задачи." width="90%" height="auto" /><br>
<i>Иллюстрация решения 202 задачи.</i></center>

<br>
<br>

# Solutions




<center>
<div class="ribbon-container">
    <div class="ribbon">
      <a class="ribbon-content">ToDo List</a>
    </div>
    <div class="list">
        
<ul class="nav hoverTable">
<li>
<a href="#80">
80
Помечтаем о зарплате
</a>
</li>
<li>
<a href="#82">
82
Зарплата через 6 месяцев работы
</a>
</li>
<li>
<a href="#83">
83
День найма
</a>
</li>
<li>
<a href="#85">
85
Служащие и их оклад
</a>
</li>
<li>
<a href="#111">
111
Подразделения компании
</a>
</li>
<li>
<a href="#116">
116
Сотрудники и их стаж работы
</a>
</li>
<li>
<a href="#204">
204
Самые ценные
</a>
</li>
<li>
<a href="#207">
207
Кто полетит на Мальдивы летом?
</a>
</li>
<li>
<a href="#208">
208
Загадка числа «3»
</a>
</li>
<li>
<a href="#82">
301
Назад в прошлое
</a>
</li>
</ul>
    </div>

</div>
</center>



# 6
В некоторой Системе существует таблица LOCKS с двумя столбцами - Locker и Locked, каждая запись в которой связывает 2 объекта - заблокированного (Locked) и того, кто его заблокировал (Locker). Необходимо отобразить SQL-запросом иерархию заблокированных объектов, включая те объекты, которые являются причинами всех блокировок. Уровни иерархии выделять отступами от левого края состоящими из пробелов - по одному на каждый новый уровень.
Пример:
LOCKS



| Column 1 | Column 2 | 
| -------- | -------- | 
|A| B|
|A| C|
|B| D|
|D| E|
|C| F|
|C| J|
|C| H|





| Надо вывести: |
| -------- |
A
B
D
E
C
F
H
J

Сдвиг - один пробел

```sql
WITH t AS
(
	SELECT  Locker
	       ,rownum r
	FROM
	(
		SELECT  Locker
		FROM LOCKS
		UNION
		SELECT  Locked
		FROM LOCKS
	)
)
SELECT  lpad(Locker ,length(Locker ) + level -1,' ') rez
FROM
(
	SELECT  distinct t1.Locker
	       ,t1.r id
	       ,t2.r -- построение таблицы для последующей иерархии
	FROM t t1
	LEFT JOIN LOCKS
	ON t1.Locker = LOCKS.Locked
	LEFT JOIN t t2
	ON t2.Locker = LOCKS.Locker
) START
WITH r IS NULL CONNECT BY PRIOR id = r ORDER SIBLINGS BY Locker
```


# 7

Используя таблицы REGIONS, COUNTRIES, LOCATIONS, DEPARTMENTS, построить (показать) иерархию объектов "Регион – Страна – Местоположение – Подразделение" для региона name = ' Americas '.
Иерархия должна быть построена (показана) одной командой SELECT.
В результате вывести:
- номер уровня, на котором находится в иерархии данный объект (LEVEL),
- имя объекта, дополненное слева (LEVEL -1)*3 пробелами.
Объекты одного уровня должны быть отсортированы по именам.
Пример результата:

|Уровень| Единица|
-- | --
|1 | Europe|
|2 | Belgium|
|2 | Denmark|
|2 | France|
|2 | Germany|
|3 | Munich|
|4 | Public Relations|
|2 | Italy|
|3 | Roma|
|3 | Venice|
|2 | Netherlands|

- Решение с использованием иерархического запроса, операций над множествами и вложенного запроса
```sql
SELECT  LEVEL
       ,LPAD(' ',(LEVEL-1)*3) || name
FROM
(
	SELECT  'REG_' || region_id id
	       ,region_name name
	       ,NULL pid
	FROM regions r
	WHERE region_name = 'Americas' 
	UNION ALL
	SELECT  'COU_' || country_id id
	       ,country_name name
	       ,'REG_' || region_id pid
	FROM countries c
	UNION ALL
	SELECT  'LOC_' || location_id id
	       ,city name
	       ,'COU_' || country_id pid
	FROM locations l
	UNION ALL
	SELECT  'DEP_' || department_id id
	       ,department_name name
	       ,'LOC_' || location_id pid
	FROM departments d
) 
START WITH pid IS NULL
CONNECT BY PRIOR id = pid
ORDER SIBLINGS BY name
```

* Решение с использованием иерархического запроса, операций над множествами и вложенного запроса

```sql
SELECT LEVEL, LPAD(' ', (LEVEL-1)* 3) || name FROM 
(
  SELECT 'REG_' || region_id id, region_name name, NULL pid FROM regions r WHERE region_name = 'Americas'
  UNION ALL
  SELECT 'COU_' || country_id id, country_name name, 'REG_' || region_id pid FROM countries c
  UNION ALL
  SELECT 'LOC_' || location_id id, city name, 'COU_' || country_id pid FROM locations l
  UNION ALL
  SELECT 'DEP_' || department_id id, department_name name, 'LOC_' || location_id pid FROM departments d
) 
START WITH pid IS NULL
CONNECT BY PRIOR id = pid
ORDER SIBLINGS BY name
```


# 16

Напишите запрос для вывода самого высокого, самого низкого, суммы всех окладов и среднего оклада по всем служащим. Назовите столбцы Maximum, Minimum, Sum и Average. Округлите ВСЁ до ближайшего целого.

```sql
SELECT  MAX (salary) "Maximum"
       ,MIN (salary) "Minimum"
       ,SUM (salary) "Sum"
       ,ROUND (AVG (salary),0) "Average"
FROM employees
```

# 17

Отделу по работе с персоналом (Human Resources, HR) необходимы данные, включающие фамилию, код должности, дату найма и табельный номер для каждого служащего.
Табельный номер должен выводиться первым. Определите псевдоним STARTDATE для столбца HIRE_DATE. Отсортируйте данные по дате найма.


```sql
SELECT  employee_id
       ,last_name
       ,job_id
       ,hire_date AS STARTDATE
FROM employees
ORDER BY hire_date
```

# 18

Создайте отчет, содержащий фамилию, должность и номер менеджера всех служащих, не имеющих менеджера или номер менеджера которых равен 121.

```sql
SELECT  last_name
       ,job_id
       ,manager_id
FROM employees
WHERE manager_id IS NULL OR manager_id = 121
```

# 19

Выведите фамилии и номера служащих вместе с фамилиями и номерами их менеджеров. Назовите столбцы Employee, Emp, Manager и Mgr. Отсортируйте данные по номеру менеджера.

```sql
SELECT  e.last_name "Employee"
       ,e.employee_id "Emp#"
       ,m.last_name "Manager"
       ,m.employee_id "Mgr#"
FROM employees e, employees m
WHERE (e.manager_id = m.employee_id)
ORDER BY "Mgr#"
```


# 22 
Напишите запрос для вывода фамилий и окладов служащих, зарплата которых строго больше 5000/$ и строго меньше 8000/$. Назовите выходной столбец SALARY. Длина столбца SALARY – 10 символов с дополненными слева символами $.

```sql
SELECT  last_name
       ,LPAD(salary,10,'$') AS "SALARY"
FROM EMPLOYEES
WHERE (salary >= 5000)
AND (salary < 8000)
```

# 23

Отделу HR необходимы сведения о всех служащих, нанятых раньше своих менеджеров. Выведите фамилии и даты найма таких служащих, а также фамилии и даты найма их менеджеров . Назовите колонки e_lastname, e_hire_date, m_lastname, m_hire_date соответственно. Отсортируйте полученные данные по фамилии служащих.


```sql
SELECT  t1.last_name AS "Employee"
       ,t1.hire_date AS "Date employee"
       ,t2.last_name AS "Manager"
       ,t2.hire_date AS "Date manager"
   
FROM employees t1
JOIN employees t2
ON t1.manager_id = t2.employee_id
WHERE t1.manager_id is not null
AND t1.hire_date < t2.hire_date
ORDER BY t1.last_name
```

# 24

Отделу по работе с персоналом (Human Resources, HR) необходим список номеров отделом, в которых нет сотрудников с идентификатором должности FI_ACCOUNT. Используйте операторы над множествами для создания отчета.

```sql
SELECT department_id FROM departments 
MINUS
SELECT d.department_id
from employees   e
    ,departments d
where (e.department_id = d.department_id) and not (e.job_id <> 'FI_ACCOUNT')
```

# 25

Отделу HR необходим отчет, в котором выводится следующее:
- фамилии и отделы всех сотрудников из таблицы EMPLOYEES, независимо от того, относятся ли они к какому-то отделу или нет;
- следом за ними номера и наименования всех отделов из таблицы DEPARTMENTS, независимо от того, есть ли в них сотрудники или нет. Для получения отчета используйте конструкцию UNION.
Названия колонок оставьте оригинальные (т.е. как в таблицах).

```sql
SELECT  last_name
       ,department_id
       ,TO_CHAR (NULL) department_name
FROM employees
UNION
SELECT  (NULL)
       ,department_id
       ,department_name
FROM departments
```

# 26

Сотрудникам отдела HR не нужны все данные таблицы EMPLOYEES. Включите номер служащего, фамилию служащего и номер отдела из таблицы EMPLOYEES. Смените заголовок столбца с фамилией служащего на EMPLOYEE.

```sql
SELECT  employee_id
       ,last_name AS EMPLOYEE
       ,department_id
FROM employees
```

# 27

Выведите отделы и число сотрудников, половина чьей зарплаты
больше, чем средняя зарплата компании. Отделы в которых таких сотрудников нет, не выводить. Столбцы результата назвать соответственно "dept" и "Hi_Salary"Сотрудникам отдела HR не нужны все данные таблицы EMPLOYEES. Включите номер служащего, фамилию служащего и номер отдела из таблицы EMPLOYEES. Смените заголовок столбца с фамилией служащего на EMPLOYEE.


```sql
SELECT
    departments.department_id "dept",
    COUNT(salary) "Hi_Salary"
FROM
    employees
    JOIN departments ON employees.department_id = departments.department_id
WHERE
    salary / 2 > (
        SELECT
            AVG(salary)
        FROM
            employees
    )
GROUP BY
    departments.department_ID
```


# 28

Команда SELECT содержит 4 ошибки. Исправьте их и выполните правильный запрос.

```sql
SELECT  employee_id
       ,last_name
       ,(salary*12) "ANNUAL SALARY"
FROM employees
```

# 30

Вследствие проблем финансирования отделу HR необходим отчет, в котором показываются фамилии и оклады служащих, получающих более $13,000. Отсортируйте данные в порядке возрастания оклада.

```sql
SELECT last_name, salary
FROM employees
WHERE salary > 13000
ORDER BY salary

```

# 21

Создайте отчет для вывода фамилии, идентификатора должности и даты начала работы всех служащих, с фамилиями Matos и Taylor. Отсортируйте данные в порядке возрастания даты найма.Команда SELECT содержит 4 ошибки. Исправьте их и выполните правильный запрос.

```sql
SELECT
    last_name,
    job_id,
    hire_date
FROM
    employees
WHERE
    last_name = 'Matos'
    OR last_name = 'Taylor'
ORDER BY
    hire_date ASC
```

# 32

Отделу HR необходим отчет, в котором выводятся фамилии и даты найма всех служащих, нанятых в 1987 г.

```sql
SELECT  last_name
       ,hire_date
FROM employees
WHERE hire_date like '%87'
```

# 33
 
Создайте отчет для вывода фамилий, окладов и комиссионные всех служащих, зарабатывающих комиссионные.
Отсортируйте данные в порядке убывания окладов и возрастания комиссионных.

```sql
SELECT  last_name
       ,salary
       ,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC, commission_pct
```

# 34

Выведите все фамилии служащих, в которых третья буква – a.

```sql
SELECT  last_name
FROM employees
WHERE instr(last_name, 'a') = 3
```
 
 
# 35

Запросите фамилии, должности и оклады всех служащих, работающих торговыми представителя (SA_REP) или клерками на складе (ST_CLERK), у которых не может быть равен $2500, $3500 или $7000

```sql
SELECT  last_name
       ,job_id
       ,salary
FROM employees
WHERE (job_id IN ('SA_REP', 'ST_CLERK'))
AND (salary NOT IN (2500, 3500, 7000))
```

# 36

Отделу HR требуется отчет, в котором приводится номер служащего, его фамилия, оклад и новый оклад, повышенный на 15% и округленный до целого. Столбец в отчете, содержащий новый оклад, должен иметь имя New Salary

```sql
SELECT
    employee_id,
    last_name,
    salary,
    TRUNC(salary + (salary * 15 / 100), 0) AS "New Salary"
FROM
    employees
```




# 38

Используя функцию DECODE, напишите запрос для отображения должности сотрудника и ее разряда (grade). Разряд каждого типа должности JOB_ID приведен в таблице:
Должность Разряд
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
Другая 0

```sql
SELECT
    JOB_ID "Должность",
    decode(
        JOB_ID,
        'AD_PRES', 'A',
        'ST_MAN', 'B',
        'IT_PROG', 'C',
        'SA_REP', 'D',
        'ST_CLERK', 'E',
        '0'
    ) G
FROM
    EMPLOYEES
```

``` sql
SELECT
    JOB_ID "Должность",
    (
        case
            JOB_ID
            when 'AD_PRES' THEN 'A'
            when 'ST_MAN' THEN 'B'
            when 'IT_PROG' THEN 'C'
            when 'SA_REP' THEN 'D'
            when 'ST_CLERK' THEN 'E'
            ELSE '0'
        END
    ) G
FROM
    EMPLOYEES
```

# 39

Напишите запрос для вывода должности и количества служащих, занимающих каждую должность.

```sql
SELECT job_id, count(*)
FROM employees
GROUP by job_id
```

# 40

Одной командой SELECT выбрать сотрудников, для которых - в таблице истории занятия должностей зафиксированы переходы на другую должность и - в таблице истории занятия должностей отсутствуют сведения об их первой должности, которую они занимали при приеме на работу в компанию. В результат вывести: - идентификатор сотрудника, - фамилию сотрудника, - дата, когда сотрудник был принят на работу, - идентификатор должности, которую занимает сотрудник, - идентификатор подразделения, к которому в данный момент приписан сотрудник. Результат отсортировать по возрастанию по полям: - дата, когда сотрудник был принят на работу, - фамилия сотрудника.

```sql
SELECT
    e.employee_id,
    e.last_name,
    e.hire_date,
    e.job_id,
    e.department_id
FROM
    employees e
WHERE
    e.hire_date < (
        SELECT
            MIN(j.start_date)
        FROM
            job_history j
        WHERE
            e.employee_id = j.employee_id
        GROUP BY
            employee_id
    )
ORDER BY
    e.hire_date,
    e.last_name
```

# 43 

Отделу HR необходим отчет, в котором выводятся фамилии и даты найма всех служащих, нанятых в 1990 г.

```sql
SELECT  last_name
       ,hire_date
FROM employees
WHERE hire_date like '%90'

```

# 45

Напишите запрос для вывода должности и количества служащих, занимающих каждую должность. Отсортируйте данные по названию должности

```sql
SELECT job_id, count(*)
FROM employees e
GROUP by job_id
ORDER by job_id
```

# 46

Выведите все фамилии служащих, в которых есть буквы "a" и "y"

```sql
SELECT
    last_name
FROM
    employees
WHERE
    last_name LIKE '%a%'
    AND last_name LIKE '%y%'
```

# 47

Выведите фамилии и номера служащих вместе с фамилиями и номерами их менеджеров. Назовите столбцы Employee, Emp, Manager и Mgr

```sql
SELECT  e.last_name "Employee"
       ,e.employee_id "Emp#"
       ,m.last_name "Manager"
       ,m.employee_id "Mgr#"
FROM employees e, employees m
WHERE (e.manager_id = m.employee_id)
```

# 48

Отделу HR необходим отчет, в котором выводятся фамилии, номера отделов и должности служащих, идентификатор местоположения отдела которых равен 1700.

```sql
SELECT
    last_name,
    department_id,
    job_id
FROM
    employees
WHERE
    department_id IN (
        SELECT
            department_id
        FROM
            departments
        WHERE
            location_id = 1700
    )
```

# 49

Отделу по работе с персоналом (Human Resources, HR) необходим список номеров отделов, в которых нет сотрудников с идентификатором должности ST_CLERK. Используйте операторы над множествами для создания отчета.

```sql
SELECT
    department_id
FROM
    departments
MINUS
SELECT
    department_id
FROM
    employees
WHERE
    job_id like 'ST_CLERK'
```

# 50

Вывести фамилию сотрудника и рассчитать количество месяцев между
сегодня и датой его найма. Столбец c количеством месяцев назвать MONTHS_WORKED. Отсортировать данные по 2-му полю. Округлить до ближайшего целого.

```sql
SELECT
    last_name,
    ROUND(months_between (SYSDATE, hire_date)) month_worked
FROM
    employees
ORDER BY
    month_worked
```

# 51

Отделу HR необходим отчет, в котором выводится следующее: - фамилии и отделы всех сотрудников из таблицы EMPLOYEES, независимо от того, относятся ли они к какому-то отделу или нет; - номера и наименования всех отделов из таблицы DEPARTMENTS, независимо от того, есть ли в них сотрудники или нет.
Колонки отчета назвать "Last Name", "Dept Employye", "Dept Num", "Dept Name"

```sql
SELECT
    e.last_name "Last Name",
    e.department_id "Dept Employye",
    d.department_id "Dept Num",
    d.department_name "Dept Name"
FROM
    employees e
    CROSS JOIN departments d

```


# 53

Вывести названия колонок и тип данных для таблицы DEPARTMENTS.

```sql
SELECT  column_name
       ,data_type
FROM all_tab_columns
WHERE table_name = 'DEPARTMENTS'
```


# 54

Выведите название колонок и их тип данных для таблицы EMPLOYEES.

```sql
SELECT  column_name
       ,data_type
FROM all_tab_columns
WHERE table_name = 'EMPLOYEES'
```

# 55

Отделу по работе с персоналом (Human Resources, HR) необходимы данные, включающие фамилию, код должности, дату найма и табельный номер для каждого служащего. Табельный номер должен выводиться первым. Определите псевдоним STARTDATE для столбца HIRE_DATE.

```sql
SELECT  employee_id
       ,last_name
       ,job_id
       ,hire_date AS STARTDATE
FROM employees
ORDER BY hire_date

```

# 56

Отдел по работе с персоналом запрашивает данные о всех должностях из таблицы EMPLOYEES. В выводимых результатах идентификаторы должностей не должны повторяться.


```sql
SELECT DISTINCT job_id
FROM employees
```

# 57

Отделу HR необходим отчет о служащих, содержащим табельный номер, фамилию, должность, дату приема на работу. Назовите столбцы Emp, Employee, Job и Hire Date соответственно. Отсортируйте по первому столбцу.

```sql
SELECT
    employee_id as "Emp#",
    last_name as "Employee",
    job_id as "Job",
    hire_date as "Hire Date"
FROM
    employees
ORDER BY employee_id
```

# 58

Отделу HR необходим отчет о всех сотрудниках и идентификаторах их должностей. Выведите на экран имя, соединенное с идентификатором должности через запятую и пробел. Назовите новый столбец Employee and Title.

```sql
SELECT  first_name || ', ' || job_id AS "Employee and Title"
FROM employees
```

# 59

Создайте запрос для вывода всех данных из таблицы EMPLOYEES, чтобы познакомиться с ее содержимым таблицы.
Разделите значения столбцов запятыми и выведите их в одном столбце с наименованием THE_OUTPUT

```sql
SELECT employee_id ||','|| first_name ||','|| last_name ||','|| email ||','|| phone_number ||','|| hire_date ||','|| job_id ||','|| salary ||','|| commission_pct ||','|| manager_id ||','|| department_id 
AS the_output
FROM
    employees
```


# 60

Вследствие проблем финансирования отделу HR необходим отчет, в котором показываются фамилии и оклады служащих, получающих более 12,000. 

```sql
SELECT last_name, salary
FROM employees
WHERE salary > 12000
```

# 61

Создайте запрос для вывода фамилии и номера отдела служащего под номером 176

```sql
SELECT last_name, department_id
FROM employees
WHERE employee_id = 176
```

# 62

Отделу HR необходимы данные о высокооплачиваемых и низкооплачиваемых сотрудниках. Выведите фамилии и оклады всех служащих, чей оклад не входит в диапазон от 5000 до 12000.

```sql
SELECT  last_name
       ,salary
FROM employees
WHERE salary NOT BETWEEN 5000 AND 12000
```


# 63

Создайте отчет для вывода фамилии, идентификатора должности и даты начала работы всех служащих, с фамилиями Matos и Taylor. Отсортируйте данные в порядке возрастания даты найма.

```sql
SELECT
    last_name,
    job_id,
    hire_date
FROM
    employees
WHERE
    last_name = 'Matos'
    OR last_name = 'Taylor'
ORDER BY
    hire_date ASC
```


# 64

Выведите фамилию и номер отдела всех служащих из отделов 20 и 50. Отсортируйте данные по фамилиям в алфавитном порядке.

```sql
SELECT
    last_name, department_id
FROM
    employees
WHERE
    department_id = 20 OR department_id = 50
ORDER BY
    last_name
```


# 65

Выведите фамилии и оклады служащих отделов 20 и 50 , зарабатывающих от 5000 до 12,000. Назовите столбцы Employee и Monthly Salary, соответственно.

```sql
SELECT
    last_name AS "Employee",
    salary AS "Monthly Salary"
FROM
    employees
WHERE
    department_id IN (20, 50)
    AND salary BETWEEN 5000 AND 12000
```

# 66

Отделу HR необходим отчет, в котором выводятся фамилии и даты найма всех служащих, нанятых в 1994 г.

```sql
SELECT  last_name
       ,hire_date
FROM employees
WHERE hire_date like '%90'
```

# 67

Создайте отчет, содержащий фамилии и должности всех служащих, не имеющих менеджера.

```sql
SELECT  last_name
       ,job_id
FROM employees
WHERE manager_id is null
```

# 68

Создайте отчет для вывода фамилий, окладов и комиссионные всех служащих, зарабатывающих комиссионные. Отсортируйте данные в порядке убывания окладов и комиссионных.

```sql
SELECT  last_name
       ,salary
       ,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC, commission_pct DESC
```

# 71

Выведите все фамилии служащих, в которых третья буква – a.

```sql
SELECT last_name
FROM employees
WHERE instr(last_name, 'a') = 3
```

```sql 
SELECT  last_name
FROM employees
WHERE last_name like '__a%';
```


# 72

Выведите все фамилии служащих, в которых есть буквы “a” и “e”.

```sql
SELECT
    last_name
FROM
    employees
WHERE
    last_name LIKE '%a%'
    AND last_name LIKE '%e%'
```

# 73

Запросите фамилии, должности и оклады всех служащих, работающих торговыми представителя (SA_REP) или клерками на складе (ST_CLERK), у которых не может быть равен 2500, 3500 или 7000

```sql
SELECT  last_name
       ,job_id
       ,salary
FROM employees
WHERE (job_id IN ('SA_REP', 'ST_CLERK'))
AND (salary NOT IN (2500, 3500, 7000))
```

# 74

Получите фамилии, оклады и комиссионные всех служащих, у которых сумма комиссионных составляет 20 %.

```sql
SELECT  last_name AS "employee"
       ,salary    AS "monthly salary"
       ,commission_pct
FROM employees
WHERE commission_pct = .2;
 ```


# 75

Отделу HR требуется отчет, в котором приводится номер служащего, его фамилия, оклад и новый оклад, повышенный на 15% и округленный до целого. Столбец в отчете, содержащий новый оклад, должен иметь имя New Salary.

```sql
SELECT
    employee_id,
    last_name,
    salary,
    TRUNC(salary + (salary * 15 / 100), 0) AS "New Salary"
FROM
    employees
```

# 77

Отделу HR требуется отчет, в котором приводится номер служащего, его фамилия, оклад и новый оклад, повышенный на 15% и округленный до целого. Столбец в отчете, содержащий новый оклад, должен иметь имя New Salary. Добавьте еще один столбец, который будет содержать результат вычитания старого оклада из нового. Назовите столбец Increase.


```sql
SELECT
    employee_id,
    last_name,
    salary,
    TRUNC(salary + (salary * 0.15), 0) AS "New Salary",
    (TRUNC(salary + (salary * 0.15), 0) - salary) AS "Increase"
FROM
    employees
```

# 79

Отделу HR необходимы сведения о продолжительности работы служащих. Для каждого служащего выведите фамилию и вычислите количество месяцев со дня найма до настоящего времени, округленное до ближайшего целого. Назовите столбец MONTHS_WORKED.
Результаты отсортируйте по длительности отработанного времени от новичков к старожилам. Сотрудники принятые в один день должны быть отсортированы по фамилии.

```sql
SELECT  last_name
       ,round(months_between(sysdate,hire_date)) month_worked
FROM employees
ORDER BY months_between(sysdate, hire_date), last_name
```


# 80

Получите по каждому служащему отчет в следующем виде: "<фамилия> зарабатывает <оклад> в месяц, но желает <утроенный оклад>. " Назовите столбец Dream Salaries.
Фразу построить на английском языке.
Пример:
Dream salaries
King earns $24,000.00 monthly but wants $72,000.00.
Kochhar earns $17,000.00 monthly but wants $51,000.00.
De Haan earns $17,000.00 monthly but wants $51,000.00.
Между словами должен стоять только один пробел.

</br>

<center><img src="https://i.imgur.com/c86c4ZV.jpg" alt="Решение правильное, ошибка в системе." width="90%" height="auto" /><br>
<i>Решение правильное, ошибка в системе.</i></center>

</br>


```sql
SELECT  (last_name 
    || ' earns '
    || TRIM(to_char (salary,'$99,999.00')) 
    || ' monthly but wants '
    ||TRIM(to_char (salary*3,'$99,999.00'))
    || '.') AS "Dream Salaries"
FROM employees
 ```


# 82


<div style="background-color: rgba(255, 0, 0, 0.4); padding:20px;align:110px;">
Для каждого служащего выведите фамилию, дату найма и дату пересмотра зарплаты, которая приходится на первый понедельник после шести месяцев работы. Назовите столбец REVIEW. Формат даты при выводе имеет вид: “Monday, the Thirty-First of July, 2000.”

```sql

SELECT
    last_name,
    hire_date,
    TO_CHAR(
        NEXT_DAY(ADD_MONTHS(hire_date, 6), 'MONDAY'),
        'fmDay, "the" Ddspth "of" Month, YYYY'
    ) REVIEW
FROM
    employeesA
SELECT
    last_name,
    hire_date,
    salary,
    to_char(
        next_day(add_months(hire_date, 6), 'Monday'),
        'yyyy" year "MM" month "DD" day "DAY'
    ) REVIEW
FROM
    employees
SELECT
    last_name,
    to_char (
        hire_date,
        'dd-mon-yy',
        'nls_date_language=american'
    ) hire_date,
    to_char (
        next_day (add_months (hire_date, 6), 'понедельник'),
        'fmday, "the" ddspth "of" month, yyyy',
        'nls_date_language=american'
    ) review
FROM
    employees

SELECT 
    last_name,
    hire_date,
    to_char(
        next_day(
            add_months(hire_date,6), 
            'MONDAY'
        ),
        'fmDay, "the" Ddspth "of" Month, YYYY'
    )  REVIEW
FROM
    employees
```
</div>



# 83


<div style="background-color: rgba(255, 0, 0, 0.4); padding:20px;align:110px;">
По каждому служащему выведите фамилию, дату найма и день недели (на английском языке маленькими буквами), когда он был нанят на работу. Назовите последний столбец DAY. Отсортируйте результаты по дням недели, начиная с понедельника.

```sql

```
</div>


# 84

Напишите запрос для вывода фамилии и суммы комиссионных каждого служащего. Если служащий не зарабатывает комиссионных, укажите в столбце “No Commission” Назовите столбец COMM.
```sql
SELECT
    last_name,
    NVL(TO_CHAR(commission_pct), 'No Commission') COMM
FROM
    employees
```




# 85

Напишите запрос для отображения первых восьми букв фамилий сотрудников и разделенных пробелом их заработной платы в виде гистограммы, состоящей из звездочек. Каждая звездочка означает 1000\$ (первый диапазон 0-1000 - одна звездочка). Строки должны быть отсортированы по заработной плате в убывающем порядке. Результат должен быть выведен одним столбцом, озаглавленным как salary_rating .

```sql
SELECT
    SUBSTR(last_name, 1, 8)  || rpad(' ', salary / 1000 + 1, '*') AS  "salary_rating" 
FROM
    employees
ORDER BY
    salary DESC
```


# 86

Используя функцию DECODE, напишите запрос для отображения должности сотрудника и ее разряда (grade). Разряд каждого типа должности JOB_ID приведен в таблице:
Должность Разряд
AD_PRES A
ST_MAN B
IT_PROG C

```sql
SELECT
    JOB_ID "Должность",
    (
        case
            JOB_ID
            when 'AD_PRES' THEN 'A'
            when 'ST_MAN' THEN 'B'
            when 'IT_PROG' THEN 'C'
            when 'SA_REP' THEN 'D'
            when 'ST_CLERK' THEN 'E'
            ELSE '0'
        END
    ) G
FROM
    EMPLOYEES
```

# 87

Напишите запрос для вывода самого высокого, самого низкого и среднего оклада по всем служащим, а также суммы всех окладов. Назовите столбцы Maximum, Minimum, Sum и Average. Округлите суммы до ближайшего целого значения.

```sql
SELECT  ROUND(MAX(salary),0) "Maximum"
       ,ROUND(MIN(salary),0) "Minimum"
       ,ROUND(SUM(salary),0) "Sum"
       ,ROUND(AVG(salary),0) "Average"
FROM employees
```
 

# 88

Выведите список должностей и укажите для каждой должности самый высокий, самый низкий, сумму окладов и средний оклад отдельно округилв значения до целого.

```sql
SELECT
    JOB_ID,
    MAX(salary),
    MIN(salary),
    SUM(salary),
    round(AVG(salary))
FROM
    EMPLOYEES
GROUP BY
    JOB_ID
```


# 89

Напишите запрос для вывода должности и количества служащих, занимающих каждую должность. Отсортируйте результат по должностям в порядке возрастания.

```sql
SELECT job_id, count(*)
FROM employees e
GROUP by job_id
ORDER by job_id
```

# 90

Получите количество служащих, имеющих подчиненных, без их перечисления. Назовите столбец Number of Managers. Подсказка: используйте столбец MANAGER_ID для определения числа менеджеров.

```sql
SELECT COUNT(DISTINCT manager_id) "Number of Managers" FROM   employees
```


# 91

Напишите запрос для вывода разности между самым высоким и самым низким окладами. Назовите столбец DIFFERENCE.

```sql
SELECT
    (max (salary) - min (salary)) DIFFERENCE
FROM
    employees
```

# 92

Напишите запрос для вывода номера каждого менеджера и заработной платы самого низкооплачиваемого из его подчиненных. Исключите всех, для которых неизвестны их менеджеры. Исключите все группы, где минимальный оклад составляет менее $6000. Отсортируйте выходные строки в порядке убывания оклада.

```sql
SELECT
    manager_id,
    min (salary) min_salary
FROM
    employees
WHERE
    manager_id is not null
HAVING
    min (salary) > 6000
GROUP BY
    manager_id
ORDER BY
    min_salary desc
```

# 93

Напишите запрос для вывода общего количества служащих и количества служащих, нанятых в 1995, 1996, 1997 и 1998 годах. Дайте соответствующие заголовки столбцам
https://github.com/DmitryShuvaev/Oracle-SQL-PLSQL/blob/master/Oracle-SQL/lab6.sql

```sql
SELECT
    COUNT(employee_id) TOTAL,
    COUNT(decode(to_char(hire_date, 'YYYY'), '1995', 1995)) "1995",
    COUNT(decode(to_char(hire_date, 'YYYY'), '1996', 1996)) "1996",
    COUNT(decode(to_char(hire_date, 'YYYY'), '1997', 1997)) "1997",
    COUNT(decode(to_char(hire_date, 'YYYY'), '1998', 1998)) "1998"
FROM
    employees
```

# 94

Напишите матричный запрос для вывода всех должностей и суммы заработной платы служащих, работающих в этой должности в отделах 20, 50, 80 и 90. Последний столбец должен содержать сумму заработной платы служащих этих отделов, занимающих каждую конкретную должность. Дайте столбцам
соответствующие заголовки - Job, Dept 20, Dept 50, Dept 80, Dept 90, TOTAL.

```sql
select job_id "Job",
nvl(sum(decode(department_id,20,salary)),0) "Dept20",
nvl(sum(decode(department_id,50,salary)),0) "Dept50",
nvl(sum(decode(department_id,80,salary)),0) "Dept80",
nvl(sum(decode(department_id,90,salary)),0) "Dept90",
nvl(sum(decode(department_id,20,salary)),0)+nvl(sum(decode(department_id,50,salary)),0)+nvl(sum(decode(department_id,80,salary)),0)+
nvl(sum(decode(department_id,90,salary)),0) "Total"
from employees 
group by job_id
```

```sql
SELECT
    job_id "Job",
    SUM(DECODE(department_id, 20, salary)) "Dept 20",
    SUM(DECODE(department_id, 50, salary)) "Dept 50",
    SUM(DECODE(department_id, 80, salary)) "Dept 80",
    SUM(DECODE(department_id, 90, salary)) "Dept 90",
    SUM(salary) "TOTAL"
FROM
    employees
GROUP BY
    job_id
```

```sql
SELECT  JOB_ID "Job"
       ,CASE WHEN department_id = 20 THEN SUM(salary)  ELSE 0 END "Dept 20"
       ,CASE WHEN department_id = 50 THEN SUM(salary)  ELSE 0 END "Dept 50"
       ,CASE WHEN department_id = 80 THEN SUM(salary)  ELSE 0 END "Dept 80"
       ,CASE WHEN department_id = 90 THEN SUM(salary)  ELSE 0 END "Dept 90"
       ,SUM(salary)total
FROM EMPLOYEES
GROUP BY  JOB_ID
         ,department_id
```

# 95

Создайте отчет, при выполнении которого выдаются адреса всех отделов. Используйте таблицы LOCATIONS и COUNTRIES. Выведите код местоположения, адрес (street_address), город, штат или провинцию, а также страну. Для получения результатов используйте натуральное соединение.


```sql
SELECT location_id, street_address, city, state_province, country_name
FROM locations l , countries c
WHERE l.country_id = c.country_id
```

```sql
SELECT location_id, street_address, city, state_province, country_name
FROM locations
NATURAL JOIN countries
```

# 96

Отделу HR необходим отчет о всех служащих. Напишите запрос для вывода фамилии, номера отдела и названия отдела для всех служащих. Отсортируйте по второму полю.

```sql
SELECT  E.last_name
       ,E.department_id
       ,D.department_name
FROM employees E
JOIN departments D
ON E.department_id = D.department_id
ORDER BY 2
```

# 97

Отделу HR необходим отчет о сотрудниках в Торонто. Напишите запрос для вывода фамилии, должности, номера отдела и названия отдела всех служащих, работающих в городе Toronto.

```sql
SELECT
    e.last_name,
    e.job_id,
    d.department_id,
    d.department_name
FROM
    employees e
    JOIN departments d ON e.department_id = d.department_id
    JOIN locations l ON d.location_id = l.location_id
WHERE
    l.city = 'Toronto
```


# 98

Выведите фамилии и номера служащих вместе с фамилиями и номерами их менеджеров. Назовите столбцы Employee, Emp, Manager и Mgr. Отсортируйте по номеру служащего.

```sql
SELECT  e.last_name "Employee"
       ,e.employee_id "Emp#"
       ,m.last_name "Manager"
       ,m.employee_id "Mgr#"
FROM employees e, employees m
WHERE (e.manager_id = m.employee_id)
ORDER BY "Emp#"
```

# 99

Выведите фамилии и номера служащих вместе с фамилиями и номерами их менеджеров. Назовите столбцы Employee, Emp, Manager и Mgr.

Получите фамилии всех служащих, включая Кинга, который не имеет менеджера. Упорядочьте результат по возрастанию номера служащего.

![](https://www.thoughtco.com/thmb/xh4MUu8HQyX1JVEcxn2IorWogoo=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/0iHiL-d7a0c49a861448cb94477386a6f3f05b.png)

```sql
SELECT
    w.last_name "Employee",
    w.employee_id "EMP#",
    m.last_name "Manager",
    m.employee_id "Mgr#"
FROM
    employees w

LEFT OUTER JOIN employees m
    ON w.manager_id = m.employee_id
```


# 100

Подготовьте отчет для отдела HR, в котором показываются номер отдела, фамилия служащего и фамилии всех служащих, работающих в одном отделе с данным служащим. Дайте столбцам соответствующие имена. Отсортируйте результат в порядке приоритета по отделу, фамилии и фамилии коллеги сотрудника.

```sql
SELECT
    e.department_id department,
    e.last_name employee,
    c.last_name colleague
FROM
    employees e,
    employees c
WHERE
    e.department_id = c.department_id
    AND e.employee_id <> c.employee_id
ORDER BY
    e.department_id,
    e.last_name,
    c.last_name
```

# 101

Для отдела HR необходимы сведения о том, какие сотрудники были наняты после приема на работу после Davies. Создайте запрос для вывода фамилий и дат найма всех таких служащих.

```sql
SELECT
    e.last_name,
    e.hire_date
FROM
    employees e,
    employees davies
WHERE
    davies.last_name = 'Davies'
    AND davies.hire_date < e.hire_date
```

# 102

Отделу HR необходимы сведения о всех служащих, нанятых раньше своих менеджеров. Выведите фамилии и даты найма таких служащих, а также фамилии и даты найма их менеджеров. Колонки назовите emp_last_name, emp_hire_date, man_last_name, man_hire_date

```sql
SELECT
    e.last_name "emp_last_name",
    e.hire_date "emp_hire_date",
    m.last_name "man_last_name",
    m.hire_date "man_hire_date"
FROM
    employees e
    JOIN employees m ON (e.manager_id = m.employee_id)
WHERE
    m.hire_date > e.hire_date
```

# 103

Отделу HR необходимы данные о фамилиях и даты найма сотрудников, работающих в одном отделе с King (сам этот служащий не выводится).

```sql
SELECT  emp.last_name,
        emp.hire_date
FROM employees emp
WHERE emp.department_id IN ( SELECT department_id FROM employees WHERE last_name = 'King')
AND emp.last_name != 'King' 
```
 
# 104

Создайте запрос для вывода номеров,и фамилий, и окладов всех служащих, оклад которых выше среднего. Отсортируйте выходные данные в порядке увеличения окладов.

```sql
SELECT
    employee_id,
    last_name,
    salary
FROM
    employees
WHERE
    salary > (
        SELECT
            AVG(salary)
        FROM
            employees
    )
ORDER BY
    salary ASC
```

# 105

Создайте запрос для вывода номеров и фамилий всех служащих, работающих в одном отделе с любым служащим, фамилия которого содержит букву “u”.

```sql
SELECT
    employee_id,
    last_name
FROM
    employees
WHERE
    department_id IN (
        SELECT
            department_id
        FROM
            employees
        WHERE
            last_name like '%u%'
    )
```

# 106

Отделу HR необходим отчет, в котором выводятся фамилии, номера отделов и должности служащих, идентификатор местоположения отдела которых равен 1700.

```sql
SELECT
    last_name,
    department_id,
    job_id
FROM
    employees
WHERE
    department_id IN (
        SELECT
            department_id
        FROM
            departments
        WHERE
            location_id = 1700
    )
```

# 107

Подготовьте отчет для отдела HR, в котором выводится список фамилий и окладов всех служащих, подчиненных Кингу (King).

```sql
SELECT
    last_name,
    salary
FROM
    employees
WHERE
    manager_id = (
        SELECT
            employee_id
        FROM
            employees
        WHERE
            last_name = 'King'
            AND first_name = 'Steven'
    )
```

# 108

Подготовьте отчет для отдела HR, в котором выводится номер отдела, фамилия и код должности для каждого служащего, работающего в администрации (department_name = 'Executive')

```sql
SELECT
    department_id,
    last_name,
    job_id
FROM
    employees
WHERE
    department_id IN (
        SELECT
            department_id
        FROM
            departments
        WHERE
            department_name = 'Executive'
    )
```


# 109

Создайте запрос для вывода номеров и фамилий всех служащих и их оклад, работающих в одном отделе с любым служащим, фамилия которого содержит букву “u” и при условии, что оклады превышают средний.

```sql
SELECT
    employee_id,
    last_name,
    salary
FROM
    employees
WHERE
    (
        salary > (
            SELECT
                AVG(salary)
            FROM
                employees
        )
    )
    AND department_id IN (
        SELECT
            department_id
        FROM
            employees
        WHERE
            last_name LIKE '%u%'
    )
```

# 110

Отделу по работе с персоналом (Human Resources, HR) необходим список номеров отделом, в которых нет сотрудников с идентификатором должности ST_CLERK. Используйте операторы над множествами для создания отчета.

```sql
SELECT
    department_id
FROM
    departments
MINUS
SELECT
    department_id
FROM
    employees
WHERE
    job_id like 'ST_CLERK'
```




# 111


Отделу HR необходим перечень стран, в которых не располагаются подразделения компании. Выведите 
идентификаторы и названия таких стран.


```sql
SELECT
    country_id,
    country_name
FROM
    countries
WHERE
    country_id NOT IN (
        SELECT
            E.country_id
        FROM
            departments B
            JOIN locations C ON (B.location_id = C.location_id)
            JOIN countries E ON (E.country_id = C.country_id)
    )
```



# 112

Используя операторы над множествами, выведите список должностей отделов 10, 50 и 20 в таком же порядке отделов. Включите в отчет столбцы job_id и department_id (назовите так же). Внутри отделов строки должны быть отсортированы по job_id .

```sql
SELECT
    job_id,
    department_id
FROM
    (
        SELECT
            job_id,
            department_id
        FROM
            employees
        WHERE
            department_id IN (10, 20, 50)
            
        INTERSECT
        SELECT
            job_id,
            department_id
        FROM
            employees
    )
ORDER BY
    decode (department_id, 10, 1, 50, 2, 20, 3),
    job_id
```

# 113

Выведите номер сотрудника и идентификатор его должности, если его текущая должность совпадает с той, которую он уже занимал, работая в компании

```sql
SELECT
    employee_id,
    job_id
FROM
    employees
INTERSECT
SELECT
    employee_id,
    job_id
FROM
    job_history
```

# 115

HR необходима информация о всех клерках (ST_CLERK), устроенных на работу после 1997 года.

```sql
SELECT *
FROM
    employees
WHERE
    (job_id IN ('ST_CLERK'))
    AND (to_char(hire_date, 'YYYY') > '1997')
```




# 116

HR необходим отчёт о сотрудниках и стаже их работы. Отчёт должен включать в себя поля: фамилия, полных лет работы и полных месяцев работы. Для лет и месяцев дать имена YEARS и MONTHS. Полученные данные необходимо отсортировать так, чтобы сверху списка отображался сотрудник с самым большим стажем работы

```sql
SELECT
    last_name,
     floor(MONTHS_BETWEEN(SYSDATE, hire_date)/12)  AS "YEARS" ,
    mod(floor(MONTHS_BETWEEN(SYSDATE, hire_date)), 12) AS "MONTHS"
FROM
    employees
ORDER BY years DESC, months DESC
```

# 117

Отобразить фамилии сотрудников, которые начинаются на букву J, K, L или M.

```sql
SELECT
    last_name
FROM
    employees
WHERE
    last_name like 'J%'
    OR last_name like 'K%'
    OR last_name like 'L%'
    OR last_name like 'M%'
```

# 118

Создать отчёт для отображения фамилии, заработной платы и поля со значением Yes, если комиссия есть, и No, если её нет.

```sql
SELECT
    last_name,
    salary,
CASE
        WHEN commission_pct > 0 THEN 'Yes' ELSE 'No'
 END
FROM
    employees
```


# 119

Создайте отчёт, в который включены номер отдела, название отдела, идентификатор расположения и количество сотрудников в этом отделе.

Убедитесь, что результат запроса также содержит отделы без сотрудников.

```sql
SELECT
    d.department_id,
    d.department_name,
    d.location_id,
    COUNT(e.employee_id)
FROM
    departments d
    LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY
    d.department_id,
    d.department_name,
    d.location_id
```

# 120

Вывести фамилию и день недели всех сотрудников, день недели устройства которых является самым частым в компании
День недели вывести в верхнем регистре.

```sql
SELECT
    last_name,
    TO_CHAR(hire_date, 'DAY')
FROM
    employees
where
    TO_CHAR(hire_date, 'day') = (
        SELECT
            TO_CHAR(hire_date, 'day')
        from
            employees
        group by
            TO_CHAR(hire_date, 'day')
        having
            count(TO_CHAR(hire_date, 'day')) = (
                select
                    MAX(count(TO_CHAR(hire_date, 'day')))
                from
                    employees
                group by
                    TO_CHAR(hire_date, 'day')
            )
    )
```

# 201

Всем сотрудникам отдела 60 надо разослать сообщение по электронной почте. Сформируйте строку рассылки для вставки в почтовый месенджер.

Строка должна содержать все адреса эелектронной почты с добавлением домена компании "@company.com" и разделенных точкой с запятой и пробелом. Адреса должны следовать в алфавитном порядке.
Колонку с адресом назвать MailString

Пример строки:
AHUNOLD@company.com; BERNST@company.com; DAUSTIN@company.com; DLORENTZ@company.com; VPATABAL@company.com

```sql
SELECT
    LISTAGG(CONCAT(email, '@company.com'), '; ') WITHIN GROUP (
        ORDER BY
            email
    ) AS "MailString"
FROM
    employees
WHERE
    department_id = 60
```


# 202



Вывести иерархию сотрудников(фамилии) начиная с главы компании. Каждую ступень отделять тремя знаками тире (‘---‘). Сотрудников одной ступени сортировать по фамилии.
Пример:
Путин
---Мишустин
------Белоусов
---------Колокольцев
---Шойгу
------Шевцова

site: https://livesql.oracle.com/apex/livesql/file/tutorial_GQMLEEPG5ARVSIFGQRD3SES92.html

```sql
SELECT
    LPAD('---', 3 * (LEVEL -1), '---') || last_name AS Result
FROM
    employees start 
    WITH manager_id is null 
    connect by prior employee_id = manager_id
ORDER SIBLINGS BY last_name
```
</div>

# 203

Почтовым адресам из списка была произведена рассылка:
AHUNOLD@company.com; ISCIARRA@company.com; DAUSTIN@company.com; VPATABAL@company.com; PFAY@company.com
Выяснить, сотрудники каких отделов получили письмо.

```sql
SELECT department_id
FROM employees
WHERE email in ('AHUNOLD', 'ISCIARRA', 'DAUSTIN', 'VPATABAL','PFAY')
```


# 204


Вывести фамилию, должность и зарплату сотрудников, чей оклад отличается менее чем на 1000 от максимально допустимого на его должности.

```sql
SELECT e.last_name, e.job_id, e.salary
FROM employees e
JOIN jobs j ON e.job_id = j.job_id
WHERE (j.max_salary - e.salary) < 1000
```

# 205

Вывести табельный номер, фамилию и оклад сотрудников с повторяющимися значениями зарплаты. Отсортировать по величине оклада и фамилии сотрудника.
Пример:
108 Емельянов 4500
256 Панов 4500
142 Сергеев 4600
102 Текутов 4600

```sql
SELECT
    employee_id,
    last_name,
    salary
FROM
    employees
WHERE
    salary in (
        SELECT
            salary
        FROM
            employees
        GROUP BY
            salary
        HAVING
            COUNT(*) > 1
    )
ORDER BY
    salary,
    last_name
```




# 206



Вывести отделы, численность которых превышала 5 человек в 1997 году.

```sql
SELECT
    department_id
FROM
    employees
WHERE
    hire_date BETWEEN '01.01.1997'
    AND '12.31.1997'
HAVING
    COUNT (*) > 5
GROUP BY
    department_id
```




# 207


<div style="background-color: rgba(255, 0, 0, 0.4); padding:20px;align:110px;">
Вывести топ-3 отдела по заработной плате, следом за ними фамилию и зарплату самых высокооплачиваемых сотрудников этих отделов. Назвать столбцы “Dep#”, “Avg_Sal”, “Emp”, “Emp_Sal”.

```sql
WITH dep_salary AS 
	(SELECT department_id, sum(salary) AS salary
	FROM employee 
	GROUP BY department_id)
SELECT department_id
FROM dep_salary
WHERE dep_salary.salary = (SELECT max(salary) FROM dep_salary);
```
</div>



# 208


Вывести должность, табельный номер, фамилию и зарплату трёх сотрудников, занимающих:
- 3-е место в рейтинге зарплат должности “SH_CLERK”
- 9-ое место в рейтинге зарплат должности “ST_CLERK”
- 27-ое место в рейтинге зарплат должности “SA_REP”

```sql
SELECT job_id, employee_id, last_name, salary
FROM
    (
        SELECT job_id, employee_id, last_name, salary,
            row_number() OVER( ORDER BY salary) AS rn
        FROM
            employees
        WHERE
            job_id = 'SH_CLERK'
    )
WHERE
    rn = 3
UNION
SELECT job_id, employee_id, last_name, salary
FROM
    (
        SELECT job_id, employee_id, last_name, salary,
            row_number() OVER( ORDER BY salary) AS rn
        FROM
            employees
        WHERE
            job_id = 'ST_CLERK'
    )
WHERE
    rn = 9
UNION
SELECT job_id, employee_id, last_name, salary
FROM
    (
        SELECT job_id, employee_id, last_name, salary,
            row_number() OVER( ORDER BY salary) AS rn
        FROM
            employees
        WHERE
            job_id = 'SA_REP'
    )
WHERE
    rn = 27
```


# 209


<div style="background-color: rgba(255, 0, 0, 0.4); padding:20px;align:110px;">
Вывести табельный номер, фамилию и номер отдела сотрудников, чья зарплата составляет более 20% от общей суммы зарплат сотрудников отдела. В расчет брать только те отделы, численность которых превышает 5 человек.

```sql
SELECT
    a.employee_id,
    a.last_name,
    a.department_id
FROM
    employees a
WHERE
 a.department_id in (
    SELECT
        department_id
    FROM
        employees
    GROUP BY
        department_id
    HAVING
        COUNT(department_id) > 5
) and
(
    (SELECT
        SUM(b.salary)
    FROM
        employees b
    WHERE
        a.department_id = b.department_id
    )*0.2 < a.salary
)
```
</div>


# 301

Описание: вывести название всех стран из таблицы Countries и количество сотрудников в них, последнюю колонку назвать «Employees». Результат отсортировать по названия страны

```sql
SELECT 
    c.country_name, 
    COUNT(e.employee_id) AS "Employees"
FROM 
    countries c 
    LEFT JOIN locations l ON c.country_id = l.country_id 
    LEFT JOIN departments d ON l.location_id = d.location_id 
    LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY 
    c.country_name
ORDER BY 
    c.country_name
```
