SQL. Занимателни задачи

Здравей, Хабр!

Вече повече от 3 години преподавам SQL в различни тренировъчни центрове и едно от наблюденията ми е, че студентите усвояват и разбират SQL по-добре, когато им се поставят задачи, а не само когато им се обясняват възможностите и теоретичните основи.

В тази статия ще споделя с вас списъка от задачи, които давам на студентите като домашно и над които провеждаме различни мозъчни атаки, което води до дълбочинно и ясно разбиране на SQL.

SQL. Занимателни задачи

SQL (ˈɛsˈkjuˈɛl; англ. structured query language — „език за структурирани запитвания“) — декларативен език за програмиране, използван за създаване, модифициране и управление на данни в релационна база данни, управлявана от съответната система за управление на бази данни. Научете повече…

Можете да прочетете за SQL от различни източници.
Тази статия не цели да ви обучи на SQL от нула.

И така, да започваме.

Ще използваме всем известната HR схема в Oracle с нейните таблици (Научете повече):

SQL. Занимателни задачи
Ще отбележа, че ще разглеждаме само задачи на SELECT. Няма да разглеждаме задачи на DML и DDL.

Задачи

Ограничаване и сортиране на данни

Таблица Employees. Получете списък с информация за всички служители.
Решение

SELECT * FROM employees

Таблица Employees. Получете списък на всички служители с име ‘David’
Решение

SELECT *
  FROM employees
 WHERE first_name = 'David';

Таблица Employees. Получете списък на всички служители с job_id равен на ‘IT_PROG’
Решение

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Таблица Employees. Получете списък на всички служители от 50-ия отдел (department_id) със заплата (salary) над 4000.
Решение

SELECT *
  FROM employees
 WHERE department_id = 50 AND salary > 4000;

Таблица Employees. Получете списък на всички служители от 20-ия и 30-ия отдел (department_id).
Решение

SELECT *
  FROM employees
 WHERE department_id = 20 OR department_id = 30;

Таблица Employees. Получете списък на всички служители, при които последната буква в името е ‘a’
Решение

SELECT *
  FROM employees
 WHERE first_name LIKE '%a';

Таблица Employees. Получете списък на всички служители от 50-ия и 80-ия отдел (department_id), които имат бонус (стойността в колоната commission_pct не е празна).
Решение

SELECT *
  FROM employees
 WHERE     (department_id = 50 OR department_id = 80)
       AND commission_pct IS NOT NULL;

Таблица Employees. Получете списък на всички служители, при които в името се съдържат минимум 2 букви ‘n’
Решение

SELECT *
  FROM employees
 WHERE first_name LIKE '%n%n%';

Таблица Employees. Получете списък на всички служители, при които дължината на името е над 4 букви.
Решение

SELECT *
  FROM employees
 WHERE first_name LIKE '%_____%';

Таблица Employees. Получете списък на всички служители, при които заплатата е в диапазона от 8000 до 9000 (включително).
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ заплата МЕЖДУ 8000 И 9000;

Таблица Служители. Получете списък на всички служители, които съдържат символ ‘%’ в името си.
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ first_name LIKE '%%%' ESCAPE '';

Таблица Служители. Получете списък на всички ID на мениджъри.
Решение

ИЗБЕРИ DISTINCT manager_id
  ОТ служители
 КЪДЕ manager_id Е НЕ NULL;

Таблица Служители. Получете списък на служителите с техните позиции във формата: Доналд(sh_clerk).
Решение

ИЗБЕРИ first_name || '(' || LOWER (job_id) || ')' служител ОТ служители;

Използване на функции за единичен ред за персонализиране на изхода.

Таблица Служители. Получете списък на всички служители с име, по-дълго от 10 букви.
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ LENGTH (first_name) > 10;

Таблица Служители. Получете списък на всички служители, чието име съдържа буквата ‘b’ (без значение от регистра).
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ INSTR (LOWER (first_name), 'b') > 0;

Таблица Служители. Получете списък на всички служители, чиито имена съдържат поне 2 букви ‘a’.
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ INSTR (LOWER (first_name),'a',1,2) > 0;

Таблица Служители. Получете списък на всички служители, чиято заплата е кратна на 1000.
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ MOD (salary, 1000) = 0;

Таблица Служители. Получете първото 3-значно число от телефонния номер на служителя, ако номерът му е във формата ХХХ.ХХХ.ХХХХ.
Решение

ИЗБЕРИ phone_number, SUBSTR (phone_number, 1, 3) нов_телефонен_номер
  ОТ служители
 КЪДЕ phone_number LIKE '___.___.____';

Таблица Отдели. Получете първата дума от името на отдела за тези, които имат повече от една дума в заглавието.
Решение

ИЗБЕРИ department_name,
       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
           първа_дума
  ОТ отдели
 КЪДЕ INSTR (department_name, ' ') > 0;

Таблица Служители. Получете имената на служителите без първата и последната буква в името.
Решение

ИЗБЕРИ first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) ново_име
  ОТ служители;

Таблица Служители. Получете списък на всички служители, при които последната буква в името е ‘m’ и дължината на името е по-голяма от 5.
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ SUBSTR (first_name, -1) = 'm' И LENGTH(first_name) > 5;

Таблица Dual. Получете датата на следващия петък.
Решение

ИЗБЕРИ NEXT_DAY (SYSDATE, 'PETЪК') следващ_петък ОТ DUAL;

Таблица Служители. Получете списък на всички служители, които работят в компанията повече от 17 години.
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;

Таблица Служители. Получете списък на всички служители, при които последната цифра от телефонния номер е нечетна и състои от 3 числа, разделени с точка.
Решение

ИЗБЕРИ *
  ОТ служители
 КЪДЕ MOD (SUBSTR (phone_number, -1), 2) != 0
       И INSTR (phone_number,'.',1,3) = 0;

Таблица Служители. Получете списък на всички служители, при които в стойността на job_id след знака ‘_’ има поне 3 символа, но стойността след ‘_’ не е равна на ‘CLERK’.
Решение

ИЗБРАТИ *
  ОТ служащие
 ГДЕ     ДЛИНА (СУБСТР (job_id, ИНСТР (job_id, '_') + 1)) > 3
       И СУБСТР (job_id, ИНСТР (job_id, '_') + 1) != 'КЛЕРК';

Таблица Служащие. Получите список всех сотрудников, заменив в значении PHONE_NUMBER все ‘.’ на ‘-‘
Решение

ИЗБРАТИ phone_number, ЗАМЕНИТЕ (phone_number, '.', '-') новый_phone_number
  ОТ служащие;

Использование функций преобразования и условных выражений

Таблица Служащие. Получите список всех сотрудников, которые начали работать в первый день месяца (любого)
Решение

ИЗБРАТИ *
  ОТ служащие
 ГДЕ TO_CHAR (hire_date, 'DD') = '01';

Таблица Служащие. Получите список всех сотрудников, которые начали работать в 2008 году
Решение

ИЗБРАТИ *
  ОТ служащие
 ГДЕ TO_CHAR (hire_date, 'YYYY') = '2008';

Таблица DUAL. Показать завтрашнюю дату в формате: Завтра - Второй день января
Решение

ИЗБРАТИ TO_CHAR (SYSDATE, 'fm""Завтра - ""Ddspth ""день месяца"" Month')     info
  ОТ DUAL;

Таблица Служащие. Получите список всех сотрудников и дату начала работы каждого в формате: 21-ое июня 2007 года
Решение

ИЗБРАТИ first_name, TO_CHAR (hire_date, 'fmddth ""месяца"" Month, YYYY') hire_date
  ОТ служащие;

Таблица Служащие. Получите список работников с увеличенными зарплатами на 20%. Зарплату показать со знаком доллара
Решение

ИЗБРАТИ first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') новая_salary
  ОТ служащие;

Таблица Служащие. Получите список всех сотрудников, которые начали работать в феврале 2007 года.
Решение

ИЗБРАТИ *
  ОТ служащие
 ГДЕ hire_date МЕЖДУ TO_DATE ('01.02.2007', 'DD.MM.YYYY')
                     И LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));

ИЗБРАТИ *
  ОТ служащие
 ГДЕ to_char(hire_date,'MM.YYYY') = '02.2007'; 

Таблица DUAL. Вывести актуальную дату, + секунда, + минута, + час, + день, + месяц, + год
Решение

ИЗБРАТИ SYSDATE                          сейчас,
       SYSDATE + 1 / (24 * 60 * 60)     плюс_секунда,
       SYSDATE + 1 / (24 * 60)          плюс_минута,
       SYSDATE + 1 / 24                 плюс_час,
       SYSDATE + 1                      плюс_день,
       ADD_MONTHS (SYSDATE, 1)          плюс_месяц,
       ADD_MONTHS (SYSDATE, 12)         плюс_год
  ОТ DUAL;

Таблица Служащие. Получите список всех сотрудников с полной зарплатой (salary + commission_pct(%)) в формате: $24,000.00
Решение

ИЗБРАТИ first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') полная_salary
  ОТ служащие;

Таблица Служащие. Получите список всех сотрудников и информацию о наличии бонусов к зарплате (Да/Нет)
Решение

ИЗБРАТИ first_name, commission_pct, NVL2 (commission_pct, 'Да', 'Нет') есть_бонус
  ОТ служащие;

Таблица Служащие. Получите уровень зарплаты каждого сотрудника: Меньше 5000 считается Низким уровнем, Больше или равно 5000 и меньше 10000 считается Нормальным уровнем, Больше или равно 10000 считается Высоким уровнем
Решение

ИЗБРАТИ first_name,
       salary,
       CASE
           WHEN salary = 5000 И salary < 10000 THEN 'Нормальный'
           ИНАЧЕ 'Высокий'
       КОНЕЦ уровень_зарплаты
  ОТ служащие;

Таблица Страны. Для каждой страны показать регион, в котором она находится: 1 - Европа, 2 - Америка, 3 - Азия, 4 - Африка (без Join)
Решение

ИЗБРАНИЕ country_name страна,
       DECODE (region_id,
               1, 'Европа',
               2, 'Америка',
               3, 'Азия',
               4, 'Африка',
               'Непознато')
           регион
  ОТ countries;

ИЗБРАНИЕ country_name
           страна,
       CASE region_id
           КОГАТО 1 ТОГАВА 'Европа'
           КОГАТО 2 ТОГАВА 'Америка'
           КОГАТО 3 ТОГАВА 'Азия'
           КОГАТО 4 ТОГАВА 'Африка'
           ИНАК 'Непознато'
       КРАЙ
           регион
  ОТ countries;

Отчитане на агрегирани данни с помощта на груповите функции

Таблица Employees. Получите отчет по department_id с минимална и максимална заплата, с ранна и късна дата на наемане и с брой на служителите. Сортирайте по брой служители (по низходящ ред)
Решение

  ИЗБРАНИЕ department_id,
         MIN (salary) min_salary,
         MAX (salary) max_salary,
         MIN (hire_date) min_hire_date,
         MAX (hire_date) max_hire_Date,
         COUNT (*) count
    ОТ employees
ГРУПИРАНЕ ПО department_id
поредица по count(*) по низходящ ред;

Таблица Employees. Колко са служителите, чиито имена започват с една и съща буква? Сортирайте по количество. Покажете само тези, където количеството е повече от 1
Решение

ИЗБРАНИЕ SUBSTR (first_name, 1, 1) first_char, COUNT (*)
    ОТ employees
ГРУПИРАНЕ ПО SUBSTR (first_name, 1, 1)
  ИМАТ COUNT (*) > 1
ПОРЕДИЦА ПО 2 НИЗХОДЯЩО;

Таблица Employees. Колко служители работят в един и същи отдел и получават еднаква заплата?
Решение

ИЗБРАНИЕ department_id, salary, COUNT (*)
    ОТ employees
ГРУПИРАНЕ ПО department_id, salary
  ИМАТ COUNT (*) > 1;

Таблица Employees. Получете отчет колко служители са наети всеки ден от седмицата. Сортирайте по количество
Решение

ИЗБРАНИЕ TO_CHAR (hire_Date, 'Day') ден, COUNT (*)
    ОТ employees
ГРУПИРАНЕ ПО TO_CHAR (hire_Date, 'Day')
ПОРЕДИЦА ПО 2 НИЗХОДЯЩО;

Таблица Employees. Получете отчет колко служители са наети по години. Сортирайте по количество
Решение

ИЗБРАНИЕ TO_CHAR (hire_date, 'YYYY') година, COUNT (*)
    ОТ employees
ГРУПИРАНЕ ПО TO_CHAR (hire_date, 'YYYY');

Таблица Employees. Получете броя на отделите, в които има служители
Решение

ИЗБРАНИЕ COUNT (COUNT (*)) department_count
    ОТ employees
   КЪДЕ department_id НЕ Е NULL
ГРУПИРАНЕ ПО department_id;

Таблица Employees. Получете списък department_id, в който работят повече от 30 служители
Решение

  ИЗБРАНИЕ department_id
    ОТ employees
ГРУПИРАНЕ ПО department_id
  ИМАТ COUNT (*) > 30;

Таблица Employees. Получете списък department_id и закръглената средна заплата на работниците в всеки отдел.
Решение

  ИЗБРАНИЕ department_id, ROUND (AVG (salary)) avg_salary
    ОТ employees
ГРУПИРАНЕ ПО department_id;

Таблица Countries. Получете списък region_id, сумата на всичките букви на country_name, в която е повече от 60
Решение

  ИЗБРАНИЕ region_id
    ОТ countries
ГРУПИРАНЕ ПО region_id
  ИМАТ SUM (LENGTH (country_name)) > 60;

Таблица Employees. Получете списък department_id, в който работят служители с няколко (>1) job_id
Решение

  ИЗБРАНИЕ department_id
    ОТ employees
ГРУПИРАНЕ ПО department_id
  ИМАТ COUNT (DISTINCT job_id) > 1;

Таблица Employees. Получете списък на manager_id, при които броят на подчинените е повече от 5 и сумата на всички заплати на подчинените му е над 50000
Решение

  SELECT manager_id
    FROM employees
GROUP BY manager_id
  HAVING COUNT (*) > 5 AND SUM (salary) > 50000;

Таблица Employees. Получете списък на manager_id, при които средната заплата на всички подчинени е в диапазона от 6000 до 9000 и които не получават бонуси (commission_pct е празно)
Решение

  SELECT manager_id, AVG (salary) avg_salary
    FROM employees
   WHERE commission_pct IS NULL
GROUP BY manager_id
  HAVING AVG (salary) BETWEEN 6000 AND 9000;

Таблица Employees. Получете максималната заплата от всички служители с job_id, завършващ на думата 'CLERK'
Решение

SELECT MAX (salary) max_salary
  FROM employees
 WHERE job_id LIKE '%CLERK';

SELECT MAX (salary) max_salary
  FROM employees
 WHERE SUBSTR (job_id, -5) = 'CLERK';

Таблица Employees. Получете максималната заплата сред всички средни заплати по отдели
Решение

  SELECT MAX (AVG (salary))
    FROM employees
GROUP BY department_id;

Таблица Employees. Получете броя на служителите с еднакъв брой букви в името. При това, покажете само тези, при които дължината на името е над 5 и броят на служителите с такова име е над 20. Сортирайте по дължината на името
Решение

  SELECT LENGTH (first_name), COUNT (*)
    FROM employees
GROUP BY LENGTH (first_name)
  HAVING LENGTH (first_name) > 5 AND COUNT (*) > 20
ORDER BY LENGTH (first_name);

  SELECT LENGTH (first_name), COUNT (*)
    FROM employees
   WHERE LENGTH (first_name) > 5
GROUP BY LENGTH (first_name)
  HAVING COUNT (*) > 20
ORDER BY LENGTH (first_name);

Displaying Data from Multiple Tables Using Joins

Таблица Employees, Departaments, Locations, Countries, Regions. Получете списък на регионите и броя на служителите във всеки регион
Решение

  SELECT region_name, COUNT (*)
    FROM employees e
         JOIN departments d ON (e.department_id = d.department_id)
         JOIN locations l ON (d.location_id = l.location_id)
         JOIN countries c ON (l.country_id = c.country_id)
         JOIN regions r ON (c.region_id = r.region_id)
GROUP BY region_name;

Таблица Employees, Departaments, Locations, Countries, Regions. Получете подробна информация за всеки служител:
First_name, Last_name, Departament, Job, Street, Country, Region
Решение

SELECT First_name,
       Last_name,
       Department_name,
       Job_id,
       street_address,
       Country_name,
       Region_name
  FROM employees  e
       JOIN departments d ON (e.department_id = d.department_id)
       JOIN locations l ON (d.location_id = l.location_id)
       JOIN countries c ON (l.country_id = c.country_id)
       JOIN regions r ON (c.region_id = r.region_id);

Таблица Employees. Покажете всички мениджъри, които имат над 6 подчинени
Решение

  SELECT man.first_name, COUNT (*)
    FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
GROUP BY man.first_name
  HAVING COUNT (*) > 6;

Таблица Employees. Покажете всички служители, които нямат подчинени
Решение

ИЗБЕРЕТЕ emp.first_name
  ОТ служители emp
       ЛЕВИЧЕН СОЕДИНЕНИЕ служители man ON (emp.manager_id = man.employee_id)
 КЪДЕ man.FIRST_NAME IS NULL;

ИЗБЕРЕТЕ first_name
  ОТ служители
 КЪДЕ manager_id Е NULL;

Таблица Служители, История на работа. В таблицата Служители се съхраняват всички служители. В таблицата История на работа се съхраняват служители, които са напуснали компанията. Получете отчет за всички служители и тяхния статус в компанията (Работи или е напуснал компанията с дата на напускане).
Пример:
first_name | статус
Дженефър | Напуснал компанията на 31 декември 2006
Клара | В момента работи
Решение

ИЗБЕРЕТЕ first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Напуснал компанията на"" DD ""от"" Месец, YYYY'),
           'В момента работи')
           статус
  ОТ служители e ЛЕВИЧЕН СОЕДИНЕНИЕ история на работа j ON (e.employee_id = j.employee_id);

Таблица Служители, Отдели, Локации, Държави, Региони. Получете списък на служители, които живеят в Европа (region_name).
Решение

 ИЗБЕРЕТЕ first_name
  ОТ служители
       СЪЕДИНЕТЕ отдели ИЗПОЛЗВАЙКИ (department_id)
       СЪЕДИНЕТЕ локации ИЗПОЛЗВАЙКИ (location_id)
       СЪЕДИНЕТЕ държави ИЗПОЛЗВАЙКИ (country_id)
       СЪЕДИНЕТЕ региони ИЗПОЛЗВАЙКИ (region_id)
 КЪДЕ region_name = 'Европа';
 
 ИЗБЕРЕТЕ first_name
  ОТ служители e
       СЪЕДИНЕТЕ отдели d ON (e.department_id = d.department_id)
       СЪЕДИНЕТЕ локации l ON (d.location_id = l.location_id)
       СЪЕДИНЕТЕ държави c ON (l.country_id = c.country_id)
       СЪЕДИНЕТЕ региони r ON (c.region_id = r.region_id)
 КЪДЕ region_name = 'Европа';

Таблица Служители, Отдели. Показване на всички отдели, в които работят повече от 30 служители.
Решение

ИЗБЕРЕТЕ department_name, COUNT (*)
    ОТ служители e СЪЕДИНЕТЕ отдели d ON (e.department_id = d.department_id)
ГРУПИРАЙ ПО department_name
  ИМА COUNT (*) > 30;

Таблица Служители, Отдели. Показване на всички служители, които не са част от нито един отдел.
Решение

ИЗБЕРЕТЕ first_name
  ОТ служители e
       ЛЕВИЧЕН СОЕДИНЕНИЕ отдели d ON (e.department_id = d.department_id)
 КЪДЕ d.department_name IS NULL;

ИЗБЕРЕТЕ first_name
  ОТ служители
 КЪДЕ department_id IS NULL;

Таблица Служители, Отдели. Показване на всички отдели, в които няма служители.
Решение

ИЗБЕРЕТЕ department_name
  ОТ служители e
       ДЕСЕН СЪЕДИНЕНИЕ отдели d ON (e.department_id = d.department_id)
 КЪДЕ first_name IS NULL;

Таблица Служители. Показване на всички служители, които нямат подчинени.
Решение

ИЗБЕРЕТЕ man.first_name
  ОТ служители emp
       ДЕСЕН СЪЕДИНЕНИЕ служители man ON (emp.manager_id = man.employee_id)
 КЪДЕ emp.FIRST_NAME IS NULL;

Таблица Служители, Работа, Отдели. Показване на служители в формат: First_name, Job_title, Department_name.
Пример:
First_name | Job_title | Department_name
Доналд | Доставка | Клерк за доставка
Решение

ИЗБЕРЕТЕ first_name, job_title, department_name
  ОТ служители e
       СЪЕДИНЕТЕ работа j ON (e.job_id = j.job_id)
       СЪЕДИНЕТЕ отдели d ON (d.department_id = e.department_id);

Таблица Служители. Получаване на списък на служители, чиито мениджъри са започнали работа през 2005 г., но самите те са започнали работа преди 2005 г.
Решение

ИЗБЕРЕТЕ emp.*
  ОТ служители emp СЪЕДИНЕТЕ служители man ON (emp.manager_id = man.employee_id)
 КЪДЕ     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       И emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Таблица Employees. Вземете списък на служителите, чиито мениджъри са започнали работа през януари на произволна година и с дължина на job_title над 15 символа.
Решение

SELECT emp.*
  FROM employees emp
       JOIN employees man ON (emp.manager_id = man.employee_id)
       JOIN jobs j ON (emp.job_id = j.job_id)
 WHERE TO_CHAR (man.hire_date, 'MM') = '01' AND LENGTH (j.job_title) > 15;

Използване на подзапитвания за разрешаване на заявки

Таблица Employees. Вземете списък на служителите с най-дълго име.
Решение

SELECT *
  FROM employees
 WHERE LENGTH (first_name) =
       (SELECT MAX (LENGTH (first_name)) FROM employees);

Таблица Employees. Вземете списък на служителите с заплата над средната заплата за всички служители.
Решение

SELECT *
  FROM employees
 WHERE salary > (SELECT AVG (salary) FROM employees);

Таблица Employees, Departments, Locations. Вземете града, в който служителите печелят най-малко.
Решение

SELECT city
    FROM employees e
         JOIN departments d ON (e.department_id = d.department_id)
         JOIN locations l ON (d.location_id = l.location_id)
GROUP BY city
  HAVING SUM (salary) =
         (  SELECT MIN (SUM (salary))
              FROM employees e
                   JOIN departments d ON (e.department_id = d.department_id)
                   JOIN locations l ON (d.location_id = l.location_id)
          GROUP BY city);

Таблица Employees. Вземете списък на служителите, чийто мениджър получава заплата над 15000.
Решение

SELECT *
  FROM employees
 WHERE manager_id IN (SELECT employee_id
                        FROM employees
                       WHERE salary > 15000)

Таблица Служители, Отдели. Показване на всички отдели, в които няма служители.
Решение

SELECT *
  FROM departments
 WHERE department_id NOT IN (SELECT department_id
                               FROM employees
                              WHERE department_id IS NOT NULL);

Таблица Employees. Показване на всички служители, които не са мениджъри.
Решение

SELECT *
  FROM employees
 WHERE employee_id NOT IN (SELECT manager_id
                             FROM employees
                            WHERE manager_id IS NOT NULL)

Таблица Employees. Покажете всички мениджъри, които имат над 6 подчинени
Решение

SELECT *
  FROM employees e
 WHERE (SELECT COUNT (*)
          FROM employees
         WHERE manager_id = e.employee_id) > 6;

Таблица Employees, Departments. Показване на служителите, които работят в IT департамента.
Решение

SELECT *
  FROM employees
 WHERE department_id = (SELECT department_id
                          FROM departments
                         WHERE department_name = 'IT');

Таблица Служители, Работа, Отдели. Показване на служители в формат: First_name, Job_title, Department_name.
Пример:
First_name | Job_title | Department_name
Доналд | Доставка | Клерк за доставка
Решение

SELECT first_name,
       (SELECT job_title
          FROM jobs
         WHERE job_id = e.job_id)
           job_title,
       (SELECT department_name
          FROM departments
         WHERE department_id = e.department_id)
           department_name
  FROM employees e;

Таблица Служители. Получаване на списък на служители, чиито мениджъри са започнали работа през 2005 г., но самите те са започнали работа преди 2005 г.
Решение

SELECT *
  FROM employees
 WHERE     manager_id IN (SELECT employee_id
                            FROM employees
                           WHERE TO_CHAR (hire_date, 'YYYY') = '2005')
       AND hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Таблица Employees. Вземете списък на служителите, чиито мениджъри са започнали работа през януари на произволна година и с дължина на job_title над 15 символа.
Решение

SELECT *
  FROM employees e
 WHERE     manager_id IN (SELECT employee_id
                            FROM employees
                           WHERE TO_CHAR (hire_date, 'MM') = '01')
       AND (SELECT LENGTH (job_title)
              FROM jobs
             WHERE job_id = e.job_id) > 15;

На това засега е всичко.

Надявам се задачите да са били интересни и завлекателни.
Ще се опитам да добавям към този списък с задачи при възможност.
Също така ще се радвам на всякакви коментари и предложения.

П.С.: Ако на някого му хрумне интересна задача за SELECT, пишете в коментарите, ще я добавя в списъка.

Благодаря.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster