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 (включително)
Решение

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

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

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

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

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

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

SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;

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

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

SELECT *
  FROM employees
 WHERE LENGTH (first_name) > 10;

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

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name), 'b') > 0;

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

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name),'a',1,2) > 0;

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

SELECT *
  FROM employees
 WHERE MOD (salary, 1000) = 0;

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

SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
  FROM employees
 WHERE phone_number LIKE '___.___.____';

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

SELECT department_name,
       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
           first_word
  FROM departments
 WHERE INSTR (department_name, ' ') > 0;

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

SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
  FROM employees;

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

SELECT *
  FROM employees
 WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name) > 5;

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

SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;

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

SELECT *
  FROM employees
 WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;

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

SELECT *
  FROM employees
 WHERE     MOD (SUBSTR (phone_number, -1), 2) != 0
       AND INSTR (phone_number,'.',1,3) = 0;

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

SELECT *
  FROM employees
 WHERE     LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Таблица Employees. Получете списък на всички служители, заменяйки в стойността PHONE_NUMBER всички '.' на '-'
Решение

SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
  FROM employees;

Използване на функции за конверсия и условни изрази

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

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'DD') = '01';

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

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'YYYY') = '2008';

Таблица DUAL. Показване на утрешната дата във формата: Утре е втори ден на януари
Решение

SELECT TO_CHAR (SYSDATE, 'fm""Утре е ""Ddspth ""ден на"" Month')     info
  FROM DUAL;

Таблица Employees. Получете списък на всички служители и датата на постъпването им на работа във формата: 21-ви юни, 2007
Решение

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""на"" Month, YYYY') hire_date
  FROM employees;

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

SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
  FROM employees;

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

SELECT *
  FROM employees
 WHERE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')
                     AND LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));

SELECT *
  FROM employees
 WHERE to_char(hire_date,'MM.YYYY') = '02.2007'; 

Таблица DUAL. Извеждане на актуалната дата, + секунда, + минута, + час, + ден, + месец, + година
Решение

SELECT SYSDATE                          now,
       SYSDATE + 1 / (24 * 60 * 60)     plus_second,
       SYSDATE + 1 / (24 * 60)          plus_minute,
       SYSDATE + 1 / 24                 plus_hour,
       SYSDATE + 1                      plus_day,
       ADD_MONTHS (SYSDATE, 1)          plus_month,
       ADD_MONTHS (SYSDATE, 12)         plus_year
  FROM DUAL;

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

SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
  FROM employees;

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

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Да', 'Не') has_bonus
  FROM employees;

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

ИЗБЕРЕТЕ first_name,
       salary,
       СЛУЧАЙ
           КОГАТО salary = 5000 И salary < 10000 ТОГАВА 'Нормална'
           ИНАЧЕ 'Висока'
       КРАЙ salary_level
  ОТ employees;

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

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

ИЗБЕРЕТЕ country_name
           country,
       СЛУЧАЙ region_id
           КОГАТО 1 ТОГАВА 'Европа'
           КОГАТО 2 ТОГАВА 'Америка'
           КОГАТО 3 ТОГАВА 'Азия'
           КОГАТО 4 ТОГАВА 'Африка'
           ИНАЧЕ 'Непознат'
       КРАЙ
           region
  ОТ 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
GROUP BY department_id
ORDER BY COUNT(*) DESC;

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

ИЗБЕРЕТЕ SUBSTR (first_name, 1, 1) first_char, COUNT (*)
    ОТ employees
GROUP BY SUBSTR (first_name, 1, 1)
  HAVING COUNT (*) > 1
ORDER BY 2 DESC;

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

ИЗБЕРЕТЕ department_id, salary, COUNT (*)
    ОТ employees
GROUP BY department_id, salary
  HAVING COUNT (*) > 1;

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

ИЗБЕРЕТЕ TO_CHAR (hire_Date, 'Day') day, COUNT (*)
    ОТ employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;

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

ИЗБЕРЕТЕ TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
    ОТ employees
GROUP BY TO_CHAR (hire_date, 'YYYY');

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

ИЗБЕРЕТЕ COUNT (COUNT (*)) department_count
    ОТ employees
   КЪДЕ department_id IS NOT NULL
GROUP BY department_id;

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

  ИЗБЕРЕТЕ department_id
    ОТ employees
GROUP BY department_id
  HAVING COUNT (*) > 30;

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

  ИЗБЕРЕТЕ department_id, ROUND (AVG (salary)) avg_salary
    ОТ employees
GROUP BY department_id;

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

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

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

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

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

  ИЗБЕРИ manager_id
    ОТ employees
ГРУПИРАЙ ПО manager_id
  ИМАЙКИ COUNT (*) > 5 И SUM (salary) > 50000;

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

  ИЗБЕРИ manager_id, AVG (salary) avg_salary
    ОТ employees
   КЪДЕ commission_pct IS NULL
ГРУПИРАЙ ПО manager_id
  ИМАЙКИ AVG (salary) МЕЖДУ 6000 И 9000;

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

ИЗБЕРИ MAX (salary) max_salary
  ОТ employees
 КЪДЕ job_id LIKE '%CLERK';

ИЗБЕРИ MAX (salary) max_salary
  ОТ employees
 КЪДЕ SUBSTR (job_id, -5) = 'CLERK';

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

  ИЗБЕРИ MAX (AVG (salary))
    ОТ employees
ГРУПИРАЙ ПО department_id;

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

  ИЗБЕРИ LENGTH (first_name), COUNT (*)
    ОТ employees
ГРУПИРАЙ ПО LENGTH (first_name)
  ИМАЙКИ LENGTH (first_name) > 5 И COUNT (*) > 20
ORDER BY LENGTH (first_name);

  ИЗБЕРИ LENGTH (first_name), COUNT (*)
    ОТ employees
   КЪДЕ LENGTH (first_name) > 5
ГРУПИРАЙ ПО LENGTH (first_name)
  ИМАЙКИ COUNT (*) > 20
ORDER BY LENGTH (first_name);

Показване на данни от множество таблици, използвайки JOINs

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

  ИЗБЕРИ region_name, COUNT (*)
    ОТ 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)
ГРУПИРАЙ ПО region_name;

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

ИЗБЕРИ First_name,
       Last_name,
       Department_name,
       Job_id,
       street_address,
       Country_name,
       Region_name
  ОТ 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 подчинени
Решение

  ИЗБЕРЕТЕ man.first_name, COUNT (*)
    ОТ служители emp СВЪРЗАНИ с служители man ON (emp.manager_id = man.employee_id)
ГРУПИРАЙТЕ ПО man.first_name
  ИМА COUNT (*) > 6;

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

ИЗБЕРЕТЕ emp.first_name
  ОТ служители emp
       ЛЯВА СВЪРЗАНИЕ с служители man ON (emp.manager_id = man.employee_id)
 КЪДЕ man.FIRST_NAME Е 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 Е NULL;

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

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

ИЗБЕРЕТЕ department_name
  ОТ служители e
       ДЯСНО СВЪРЗАНИЕ с департаменти d ON (e.department_id = d.department_id)
 КЪДЕ first_name Е NULL;

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

ИЗБЕРЕТЕ man.first_name
  ОТ служители emp
       ДЯСНО СВЪРЗАНИЕ с служители man ON (emp.manager_id = man.employee_id)
 КЪДЕ emp.FIRST_NAME Е 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 ОН (emp.manager_id = man.employee_id)
 КЪДЕ     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       И emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

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

ИЗБЕРИ emp.*
  ОТ служители emp
       СЪЕДИНИ служители man ОН (emp.manager_id = man.employee_id)
       СЪЕДИНИ работни места j ОН (emp.job_id = j.job_id)
 КЪДЕ TO_CHAR (man.hire_date, 'MM') = '01' И LENGTH (j.job_title) > 15;

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

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

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

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

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

Таблица Служители, Отдели, Локации. Получаване на града, в който служителите общо получават най-малко.
Решение

ИЗБЕРИ city
    ОТ служители e
         СЪЕДИНИ отдели d ОН (e.department_id = d.department_id)
         СЪЕДИНИ локации l ОН (d.location_id = l.location_id)
GROUP BY city
  HAVING SUM (salary) =
         (  ИЗБЕРИ MIN (SUM (salary))
              ОТ служители e
                   СЪЕДИНИ отдели d ОН (e.department_id = d.department_id)
                   СЪЕДИНИ локации l ОН (d.location_id = l.location_id)
          GROUP BY city);

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

ИЗБЕРИ *
  ОТ служители
 КЪДЕ manager_id В (ИЗБЕРИ employee_id
                        ОТ служители
                       КЪДЕ salary > 15000)

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

ИЗБЕРИ *
  ОТ отдели
 КЪДЕ department_id НЕ В (ИЗБЕРИ department_id
                               ОТ служители
                              КЪДЕ department_id Е НЕ NULL);

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

ИЗБЕРИ *
  ОТ служители
 КЪДЕ employee_id НЕ В (ИЗБЕРИ manager_id
                             ОТ служители
                            КЪДЕ manager_id Е НЕ NULL);

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

ИЗБЕРИ *
  ОТ служители e
 КЪДЕ (ИЗБЕРИ COUNT (*)
          ОТ служители
         КЪДЕ manager_id = e.employee_id) > 6;

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

ИЗБЕРИ *
  ОТ служители
 КЪДЕ department_id = (ИЗБЕРИ department_id
                          ОТ отдели
                         КЪДЕ department_name = 'ИТ');

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

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

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

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

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

ИЗБЕРИ *
  ОТ служители e
 КЪДЕ     manager_id В (ИЗБЕРИ employee_id
                            ОТ служители
                           КЪДЕ TO_CHAR (hire_date, 'MM') = '01')
       И (ИЗБЕРИ LENGTH (job_title)
              ОТ работни места
             КЪДЕ job_id = e.job_id) > 15;

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

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

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

Благодаря.

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

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