SQL. Zajímavé úkoly

Ahoj, Habr!

Už více než 3 roky učím SQL v různých školících centrech, a jedním z mých pozorování je to, že studenti se lépe orientují a chápou SQL, pokud mají před sebou úkol, a ne jen vyprávění o možnostech a teoretických základech.

V tomto článku se s vámi podělím o svůj seznam úkolů, které dávám studentům jako domácí úkol a nad kterými provádíme různé brainstormingy, což vede k hlubokému a jasnému pochopení SQL.

SQL. Zajímavé úkoly

SQL (ˈɛsˈkjuˈɛl; anglicky structured query language — „jazyk strukturovaných dotazů“) — deklarativní programovací jazyk, používaný pro vytváření, modifikaci a správu dat v relační databázi, spravované příslušným systémem pro správu databází. Více informací…

O SQL se dá přečíst na různých místech. zdrojů.
Tento článek nemá za cíl naučit vás SQL od nuly.

Tak pojďme na to.

Budeme používat všem známou HR schéma v Oracle s jejími tabulkami (Více informací):

SQL. Zajímavé úkoly
Poznamenám, že se budeme zabývat pouze úkoly na SELECT. Nejsou zde úkoly na DML a DDL.

Úkoly

Omezení a třídění dat

Tabulka Employees. Získejte seznam se všemi informacemi o zaměstnancích.
Řešení

SELECT * FROM employees

Tabulka Employees. Získejte seznam všech zaměstnanců se jménem 'David'.
Řešení

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabulka Employees. Získejte seznam všech zaměstnanců s job_id rovným 'IT_PROG'.
Řešení

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabulka Employees. Získejte seznam všech zaměstnanců z 50. oddělení (department_id) se mzdou (salary) vyšší než 4000.
Řešení

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

Tabulka Employees. Získejte seznam všech zaměstnanců z 20. a 30. oddělení (department_id).
Řešení

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

Tabulka Employees. Získejte seznam všech zaměstnanců, jejichž poslední písmeno v jméně je 'a'.
Řešení

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

Tabulka Employees. Získejte seznam všech zaměstnanců z 50. a 80. oddělení (department_id), kteří mají bonus (hodnota ve sloupci commission_pct není prázdná).
Řešení

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

Tabulka Employees. Získejte seznam všech zaměstnanců, kteří mají v jméně alespoň 2 písmena 'n'.
Řešení

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

Tabulka Employees. Získejte seznam všech zaměstnanců, jejichž délka jména je větší než 4 písmena.
Řešení

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

Tabulka Employees. Získejte seznam všech zaměstnanců, jejichž mzda je v rozmezí od 8000 do 9000 (včetně).
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ je plat mezi 8000 A 9000;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, jejichž jméno obsahuje znak ‘%’
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ první_jméno LIKE '%%%' ESCAPE '';

Tabulka Zaměstnanci. Získat seznam všech ID managerů
Řešení

VYBERTE DISTINCT manager_id
  Z zaměstnanců
 KDYŽ manager_id NENÍ NULL;

Tabulka Zaměstnanci. Získat seznam pracovníků s jejich pozicemi ve formátu: Donald(sh_clerk)
Řešení

VYBERTE first_name || '(' || LOWER (job_id) || ')' zaměstnanec Z zaměstnanců;

Použití funkcí pro jednotlivé řádky k přizpůsobení výstupu

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, jejichž délka jména je větší než 10 písmen
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ LENGTH (first_name) > 10;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, jejichž jméno obsahuje písmeno ‘b’ (bez ohledu na velikost písmen)
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ INSTR (LOWER (first_name), 'b') > 0;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, jejichž jméno obsahuje alespoň 2 písmena ‘a’
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ INSTR (LOWER (first_name),'a',1,2) > 0;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, jejichž plat je násobek 1000
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ MOD (plat, 1000) = 0;

Tabulka Zaměstnanci. Získat první 3-místné číslo telefonního čísla zaměstnance, pokud je jeho číslo ve formátu XXX.XXX.XXXX
Řešení

VYBERTE telefonní_číslo, SUBSTR (telefonní_číslo, 1, 3) nové_telefonní_číslo
  Z zaměstnanců
 KDYŽ telefonní_číslo LIKE '___.___.____';

Tabulka Oddělení. Získat první slovo z názvu oddělení pro ty, jejichž název obsahuje více než jedno slovo
Řešení

VYBERTE department_name,
       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
           první_slovo
  Z oddělení
 KDYŽ INSTR (department_name, ' ') > 0;

Tabulka Zaměstnanci. Získat jména zaměstnanců bez prvního a posledního písmene v jejich jméně
Řešení

VYBERTE first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) nové_jméno
  Z zaměstnanců;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, jejichž poslední písmeno v jméně je ‘m’ a délka jména je větší než 5
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ SUBSTR (first_name, -1) = 'm' A DÉLKA(first_name) > 5;

Tabulka Dual. Získat datum příštího pátku
Řešení

VYBERTE NEXT_DAY (SYSDATE, 'PÁTEK') příští_pátek Z DUAL;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, kteří pracují ve společnosti více než 17 let
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, jejichž poslední číslice telefonního čísla je lichá a skládá se ze 3 čísel oddělených tečkami
Řešení

VYBERTE *
  Z zaměstnanců
 KDYŽ MOD (SUBSTR (telefonní_číslo, -1), 2) != 0
       A INSTR (telefonní_číslo,'.',1,3) = 0;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, jejichž hodnota job_id po znaku ‘_’ má alespoň 3 znaky, ale tato hodnota po ‘_’ není ‘CLERK’
Řešení

VYBERTE *
  Z zaměstnanců
 KDE     DÉLKA (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       A SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců a nahradit v hodnotě PHONE_NUMBER všechny ‘.’ na ‘-‘
Řešení

VYBERTE phone_number, REPLACE (phone_number, '.', '-') nový_phone_number
  Z zaměstnanců;

Použití konverzních funkcí a podmínkových výrazů

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, kteří nastoupili do zaměstnání první den měsíce (jakéhokoliv)
Řešení

VYBERTE *
  Z zaměstnanců
 KDE TO_CHAR (hire_date, 'DD') = '01';

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, kteří nastoupili do zaměstnání v roce 2008
Řešení

VYBERTE *
  Z zaměstnanců
 KDE TO_CHAR (hire_date, 'YYYY') = '2008';

Tabulka DUAL. Zobrazit zítřejší datum ve formátu: Zítra je druhý den v lednu
Řešení

VYBERTE TO_CHAR (SYSDATE, 'fm""Zítra je ""Ddspth ""den v"" Měsíc')     info
  Z DUAL;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců a datum nástupu každého do práce ve formátu: 21. června 2007
Řešení

VYBERTE first_name, TO_CHAR (hire_date, 'fmddth ""of"" Měsíc, YYYY') hire_date
  Z zaměstnanců;

Tabulka Zaměstnanci. Získat seznam pracovníků se zvýšenými platy o 20 %. Plat zobrazit se znakem dolaru
Řešení

VYBERTE first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') nový_salary
  Z zaměstnanců;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců, kteří nastoupili do zaměstnání v únoru 2007.
Řešení

VYBERTE *
  Z zaměstnanců
 KDE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')
                     A LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));

VYBERTE *
  Z zaměstnanců
 KDE to_char(hire_date,'MM.YYYY') = '02.2007'; 

Tabulka DUAL. Zobrazit aktuální datum, + sekunda, + minuta, + hodina, + den, + měsíc, + rok
Řešení

VYBERTE SYSDATE                          nyní,
       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
  Z DUAL;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců s celkovými platy (salary + commission_pct(%)) ve formátu: $24,000.00
Řešení

VYBERTE first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
  Z zaměstnanců;

Tabulka Zaměstnanci. Získat seznam všech zaměstnanců a informace o přítomnosti bonusů k platu (Ano/Ne)
Řešení

VYBERTE first_name, commission_pct, NVL2 (commission_pct, 'Ano', 'Ne') has_bonus
  Z zaměstnanců;

Tabulka Zaměstnanci. Získat úroveň platu každého zaměstnance: Méně než 5000 se považuje za nízkou úroveň, Více nebo rovno 5000 a méně než 10000 se považuje za normální úroveň, Více nebo rovno 10000 se považuje za vysokou úroveň
Řešení

VYBERTE first_name,
       salary,
       PŘÍPAD
           KDYŽ salary = 5000 A salary < 10000 THEN 'Normální'
           JINAK 'Vysoká'
       KONEC salary_level
  Z zaměstnanců;

Tabulka Země. Pro každou zemi zobrazit region, ve kterém se nachází: 1-Evropa, 2-Amerika, 3-Asie, 4-Afrika (bez Join)
Řešení

VYBERTE country_name country,
       DECODE (region_id,
               1, 'Evropa',
               2, 'Amerika',
               3, 'Asie',
               4, 'Afrika',
               'Neznámý')
           region
  Z zemí;

VYBERTE country_name
           country,
       PŘÍPAD region_id
           KDY 1 POTOM 'Evropa'
           KDY 2 POTOM 'Amerika'
           KDY 3 POTOM 'Asie'
           KDY 4 POTOM 'Afrika'
           JINAK 'Neznámý'
       KONEC
           region
  Z zemí;

Zpráva o agregovaných datech pomocí skupinových funkcí

Tabulka Zaměstnanci. Získejte zprávu o department_id s minimálním a maximálním platem, s nejranější a nejpozdější datem nástupu do zaměstnání a s počtem zaměstnanců. Třídit podle počtu zaměstnanců (sestupně)
Řešení

  VYBERTE department_id,
         MIN (salary) min_salary,
         MAX (salary) max_salary,
         MIN (hire_date) min_hire_date,
         MAX (hire_date) max_hire_Date,
         COUNT (*) count
    Z zaměstnanců
SKUPINA PODLE department_id
pořadí podle count(*) sestupně;

Tabulka Zaměstnanci. Kolik zaměstnanců, jejichž jména začínají stejným písmene? Třídit podle počtu. Ukázat pouze ty, kde je počet větší než 1
Řešení

VYBERTE SUBSTR (first_name, 1, 1) first_char, COUNT (*)
    Z zaměstnanců
SKUPINA PODLE SUBSTR (first_name, 1, 1)
  MÍT COUNT (*) > 1
POŘADÍ PODLE 2 SESTUPNĚ;

Tabulka Zaměstnanci. Kolik zaměstnanců pracuje ve stejném oddělení a mají stejný plat?
Řešení

VYBERTE department_id, salary, COUNT (*)
    Z zaměstnanců
SKUPINA PODLE department_id, salary
  MÍT COUNT (*) > 1;

Tabulka Zaměstnanci. Získejte zprávu o tom, kolik zaměstnanců nastoupilo do zaměstnání v každý den v týdnu. Třídit podle počtu
Řešení

VYBERTE TO_CHAR (hire_Date, 'Den') den, COUNT (*)
    Z zaměstnanců
SKUPINA PODLE TO_CHAR (hire_Date, 'Den')
POŘADÍ PODLE 2 SESTUPNĚ;

Tabulka Zaměstnanci. Získejte zprávu o tom, kolik zaměstnanců nastoupilo do zaměstnání během let. Třídit podle počtu
Řešení

VYBERTE TO_CHAR (hire_date, 'YYYY') rok, COUNT (*)
    Z zaměstnanců
SKUPINA PODLE TO_CHAR (hire_date, 'YYYY');

Tabulka Zaměstnanci. Získejte počet oddělení, ve kterých jsou zaměstnanci
Řešení

VYBERTE COUNT (COUNT (*))     department_count
    Z zaměstnanců
   KDY department_id NENÍ NULL
SKUPINA PODLE department_id;

Tabulka Zaměstnanci. Získejte seznam department_id, ve kterém pracuje více než 30 zaměstnanců
Řešení

  VYBERTE department_id
    Z zaměstnanců
SKUPINA PODLE department_id
  MÍT COUNT (*) > 30;

Tabulka Zaměstnanci. Získejte seznam department_id a zaokrouhlený průměrný plat zaměstnanců v každém oddělení.
Řešení

  VYBERTE department_id, ROUND (AVG (salary)) avg_salary
    Z zaměstnanců
SKUPINA PODLE department_id;

Tabulka Země. Získejte seznam region_id, kde je suma všech délek country_name větší než 60
Řešení

  VYBERTE region_id
    Z zemí
SKUPINA PODLE region_id
  MÍT SUM (LENGTH (country_name)) > 60;

Tabulka Zaměstnanci. Získejte seznam department_id, ve kterém pracují zaměstnanci několika (>1) job_id
Řešení

  VYBERTE department_id
    Z zaměstnanců
SKUPINA PODLE department_id
  MÍT COUNT (DISTINCT job_id) > 1;

Tabulka Employees. Získat seznam manager_id, u kterých je počet podřízených větší než 5 a součet všech platů jeho podřízených přesahuje 50000
Řešení

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

Tabulka Employees. Získat seznam manager_id, u kterých je průměrný plat všech jeho podřízených mezi 6000 a 9000, kteří nedostávají bonusy (commission_pct je prázdný)
Řešení

  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;

Tabulka Employees. Získat maximální plat ze všech zaměstnanců, jejichž job_id končí slovem 'CLERK'
Řešení

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';

Tabulka Employees. Získat maximální plat ze všech průměrných platů podle oddělení
Řešení

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

Tabulka Employees. Získat počet zaměstnanců se stejným počtem písmen v jménu. Zobrazit jen ty, jejichž délka jména je větší než 5 a počet zaměstnanců se stejným jménem přesahuje 20. Seřadit podle délky jména
Řešení

  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);

Zobrazování dat z více tabulek pomocí JOIN

Tabulka Employees, Departaments, Locations, Countries, Regions. Získat seznam regionů a počet zaměstnanců v každém regionu
Řešení

  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;

Tabulka Employees, Departaments, Locations, Countries, Regions. Získat podrobné informace o každém zaměstnanci:
First_name, Last_name, Departament, Job, Street, Country, Region
Řešení

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);

Tabulka Employees. Zobrazit všechny manažery, kteří mají podřízených více než 6
Řešení

  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;

Tabulka Employees. Zobrazit všechny zaměstnance, kteří nikomu nepodléhají
Řešení

SELECT emp.first_name
  FROM employees emp
       LEFT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE man.FIRST_NAME IS NULL;

SELECT first_name
  FROM employees
 WHERE manager_id IS NULL;

Tabulka Zaměstnanci, Pracovní historie. V tabulce Employee jsou uloženi všichni zaměstnanci. V tabulce Job_history jsou zaměstnanci, kteří opustili společnost. Získat zprávu o všech zaměstnancích a jejich statusu ve společnosti (Pracuje nebo opustil společnost s datem odchodu)
Příklad:
jméno | status
Jennifer | Opustil společnost 31. prosince 2006
Clara | V současnosti pracuje
Řešení

SELECT first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Opustil společnost v"" DD ""měsíce"" YYYY'),
           'V současnosti pracuje')
           status
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

Tabulka Zaměstnanci, Oddělení, Lokace, Země, Regiony. Získat seznam zaměstnanců, kteří žijí v Evropě (region_name)
Řešení

 SELECT first_name
  FROM employees
       JOIN departments USING (department_id)
       JOIN locations USING (location_id)
       JOIN countries USING (country_id)
       JOIN regions USING (region_id)
 WHERE region_name = 'Europe';
 
 SELECT first_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)
 WHERE region_name = 'Europe';

Tabulka Zaměstnanci, Oddělení. Zobrazit všechna oddělení, ve kterých pracuje více než 30 zaměstnanců
Řešení

SELECT department_name, COUNT (*)
    FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
  HAVING COUNT (*) > 30;

Tabulka Zaměstnanci, Oddělení. Zobrazit všechny zaměstnance, kteří nejsou v žádném oddělení
Řešení

SELECT first_name
  FROM employees e
       LEFT JOIN departments d ON (e.department_id = d.department_id)
 WHERE d.department_name IS NULL;

SELECT first_name
  FROM employees
 WHERE department_id IS NULL;

Tabulka Zaměstnanci, Oddělení. Zobrazit všechna oddělení, ve kterých nejsou žádní zaměstnanci
Řešení

SELECT department_name
  FROM employees e
       RIGHT JOIN departments d ON (e.department_id = d.department_id)
 WHERE first_name IS NULL;

Tabulka Zaměstnanci. Zobrazit všechny zaměstnance, kteří nemají nikoho pod sebou
Řešení

SELECT man.first_name
  FROM employees emp
       RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE emp.FIRST_NAME IS NULL;

Tabulka Zaměstnanci, Práce, Oddělení. Zobrazit zaměstnance ve formátu: Jméno, Název práce, Název oddělení.
Příklad:
Jméno | Název práce | Název oddělení
Donald | Doprava | Klient Dopravy
Řešení

SELECT first_name, job_title, department_name
  FROM employees e
       JOIN jobs j ON (e.job_id = j.job_id)
       JOIN departments d ON (d.department_id = e.department_id);

Tabulka Zaměstnanci. Získat seznam zaměstnanců, jejichž manažeři byli najati v roce 2005, ale sami byli najati před rokem 2005
Řešení

SELECT emp.*
  FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE TO_CHAR (man.hire_date, 'YYYY') = '2005'
       AND emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabulka zaměstnanců. Získat seznam zaměstnanců, jejichž manažeři byli přijati do zaměstnání v lednu jakéhokoli roku a délka job_title těchto zaměstnanců je větší než 15 znaků.
Řešení

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;

Používání poddotazů k řešení dotazů

Tabulka zaměstnanců. Získat seznam zaměstnanců s nejdelším jménem.
Řešení

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

Tabulka zaměstnanců. Získat seznam zaměstnanců s platem vyšším než průměrný plat všech zaměstnanců.
Řešení

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

Tabulka zaměstnanců, oddělení, lokace. Získat město, ve kterém zaměstnanci celkově vydělávají nejméně.
Řešení

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);

Tabulka zaměstnanců. Získat seznam zaměstnanců, jejichž manažer vydělává více než 15000.
Řešení

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

Tabulka Zaměstnanci, Oddělení. Zobrazit všechna oddělení, ve kterých nejsou žádní zaměstnanci
Řešení

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

Tabulka zaměstnanců. Zobrazit všechny zaměstnance, kteří nejsou manažery.
Řešení

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

Tabulka Employees. Zobrazit všechny manažery, kteří mají podřízených více než 6
Řešení

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

Tabulka zaměstnanců, oddělení. Zobrazit zaměstnance, kteří pracují v oddělení IT.
Řešení

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

Tabulka Zaměstnanci, Práce, Oddělení. Zobrazit zaměstnance ve formátu: Jméno, Název práce, Název oddělení.
Příklad:
Jméno | Název práce | Název oddělení
Donald | Doprava | Klient Dopravy
Řešení

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;

Tabulka Zaměstnanci. Získat seznam zaměstnanců, jejichž manažeři byli najati v roce 2005, ale sami byli najati před rokem 2005
Řešení

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');

Tabulka zaměstnanců. Získat seznam zaměstnanců, jejichž manažeři byli přijati do zaměstnání v lednu jakéhokoli roku a délka job_title těchto zaměstnanců je větší než 15 znaků.
Řešení

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;

To je prozatím všechno.

Doufám, že úkoly byly zajímavé a poutavé.
Budou-li možnosti, budu tento seznam úkolů doplňovat.
Také bych uvítal jakékoli poznámky a návrhy.

P.S.: Pokud někoho napadne zajímavý úkol na SELECT, napište do komentářů, přidám ho do seznamu.

Děkuji.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster