SQL. Huvitavad ülesanded

Tere, Habr!

Olen üle kolme aasta õpetanud SQL-i erinevates koolitus keskustes ja üks minu tähelepanekutest on see, et õpilased omandavad ja mõistavad SQL-i paremini, kui neile esitatakse ülesanne, mitte lihtsalt ei räägita võimalustest ja teoreetilistest alustest.

Selles artiklis jagan teiega oma ülesannete nimekirja, mida annan õpilastele kodutööks ja mille üle me korraldame erinevaid ajurünnakuid, mis viib sügava ja selge arusaamiseni SQL-ist.

SQL. Huvitavad ülesanded

SQL (ˈɛsˈkjuˈɛl; ingl. structured query language — 'struktureeritud päringute keel') on deklaratiivne programmeerimiskeel, mida kasutatakse andmete loomisel, muutmisel ja haldamisel relatiivselt andmebaasis, mida haldab vastav andmebaasihaldussüsteem. Loe edasi...

SQList on võimalik lugeda erinevatest allikatest.
Käesoleva artikli eesmärk ei ole õpetada teid SQL-it nullist.

Nii et, hakkame pihta.

Kasutame kõigile tuntud HR skeemi Oracle'is koos selle tabelitega (Loe lähemalt):

SQL. Huvitavad ülesanded
Mainin, et vaatame ainult SELECT ülesandeid. Siin pole DML ja DDL ülesandeid.

Ülesanded

Andmete filtreerimine ja sorteerimine

Tabel Employees. Saada nimekiri kõigi töötajate teabega.
Lahendus

SELECT * FROM employees

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nimi on 'David'
Lahendus

SELECT *
  FROM employees
 WHERE first_name = 'David';

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle töö-ID on 'IT_PROG'
Lahendus

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG';

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle osakond on 50 (department_id) ja palk (salary) on suurem kui 4000
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle osakonnad on 20 ja 30 (department_id)
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nime viimane täht on 'a'
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle osakonnad on 50 ja 80 (department_id) ja kellel on boonuseid (veerg commission_pct ei ole tühi)
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nimes on vähemalt 2 tähte 'n'
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nime pikkus on üle 4 tähe
Lahendus

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

Töötajate tabel. Saada kõikide töötajate nimekiri, kelle palk on vahemikus 8000 kuni 9000 (sh).
Lahendus

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Töötajate tabel. Saada kõikide töötajate nimekiri, kelle eesnimes sisaldub symbol ‘%’.
Lahendus

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

Töötajate tabel. Saada kõikide juhtide ID-d.
Lahendus

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Töötajate tabel. Saada töötajate nimekiri nende ametikohtadega formaadis: Donald(sh_clerk).
Lahendus

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

Kasutades ühe rida funktsioone väljundi kohandamiseks.

Töötajate tabel. Saada kõikide töötajate nimekiri, kelle nime pikkus on üle 10 tähe.
Lahendus

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

Töötajate tabel. Saada kõikide töötajate nimekiri, kelle eesnimes on täht ‘b’ (ilma suurust arvestamata).
Lahendus

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

Töötajate tabel. Saada kõikide töötajate nimekiri, kelle eesnimes on vähemalt 2 tähte ‘a’.
Lahendus

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

Töötajate tabel. Saada need töötajad, kelle palk on 1000-ga jagatav.
Lahendus

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

Töötajate tabel. Saada esimene 3-kohaline number töötaja telefoninumbrist, kui tema number on formaadis XXX.XXX.XXXX
Lahendus

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

Osakondade tabel. Saada esimene sõna osakonna nimest nende jaoks, kellel on nimes rohkem kui üks sõna
Lahendus

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

Töötajate tabel. Saada töötajate nimed, eemaldades esimesed ja viimased tähed nimest
Lahendus

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

Töötajate tabel. Saada kõikide töötajate nimekiri, kelle nimes viimane täht on ‘m’ ja nimi on pikem kui 5 tähemärki
Lahendus

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

Dual tabel. Saada järgmise reede kuupäev
Lahendus

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

Töötajate tabel. Saada kõikide töötajate nimekiri, kes on ettevõttes töötanud rohkem kui 17 aastat
Lahendus

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

Töötajate tabel. Saada kõikide töötajate nimekiri, kelle telefoninumbri viimane number on paaritu ja koosneb kolmest numbrist, mis on eraldatud punktiga
Lahendus

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

Töötajad. Saada nimekiri kõigist töötajatest, kelle job_id väärtuses pärast '_' on vähemalt 3 sümbolit, kuid see väärtus pärast '_' ei ole 'CLERK'.
Lahendus

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

Töötajad. Saada nimekiri kõigist töötajatest, asendades PHONE_NUMBER väärtuses kõik '.' sümbolid '-' sümbolitega.
Lahendus

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

Funktsioonide ja tingimuslike väljendite kasutamine

Töötajad. Saada nimekiri kõigist töötajatest, kes alustasid tööd kuu esimesel päeval (ükskõik milline).
Lahendus

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

Töötajad. Saada nimekiri kõigist töötajatest, kes alustasid tööd 2008. aastal.
Lahendus

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

DUAL. Näita homset kuupäeva formaadis: Homme on kuu teine päev.
Lahendus

SELECT TO_CHAR (SYSDATE, 'fm""Homme on ""Ddspth ""päev"" Kuu')     info
  FROM DUAL;

Töötajad. Saada nimekiri kõigist töötajatest ja igaühe tööle tuleku kuupäev formaadis: 21. juuni, 2007.
Lahendus

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""kuul"" Kuu, YYYY') hire_date
  FROM employees;

Employees tabel. Saada töötajate loetelu, kelle palk tõuseb 20%. Näita palka dollarimärgiga.
Lahendus

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

Employees tabel. Saada kõigi töötajate loetelu, kes alustasid tööd 2007. aasta veebruaris.
Lahendus

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 tabel. Kuvage praegune kuupäev, + sekund, + minut, + tund, + päev, + kuu, + aasta.
Lahendus

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 tabel. Saada kõigi töötajate loetelu täispalga (salary + commission_pct(%)) vormingus: $24,000.00
Lahendus

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

Employees tabel. Saada kõigi töötajate loetelu ja teave palgabonuste (Jah/Ei) olemasolu kohta.
Lahendus

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
  FROM employees;

Töötajate tabel. Saada iga töötaja palk: Alla 5000 loetakse madalaks tasemeks, 5000 ja 10000 vahel loetakse normaalseks tasemeks, 10000 ja rohkem loetakse kõrgeks tasemeks.
Lahendus

SELECT first_name,
       salary,
       CASE
           WHEN salary = 5000 AND salary < 10000 THEN 'Normaalne'
           ELSE 'Kõrge'
       END salary_level
  FROM employees;

Riikide tabel. Näidata iga riigi piirkonda, kus see asub: 1-Euroopa, 2-Ameerika, 3-Aasia, 4-Aafrika (ilma Join-ta)
Lahendus

SELECT country_name country,
       DECODE(region_id,
               1, 'Euroopa',
               2, 'Ameerika',
               3, 'Aasia',
               4, 'Aafrika',
               'Tundmatu')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Euroopa'
           WHEN 2 THEN 'Ameerika'
           WHEN 3 THEN 'Aasia'
           WHEN 4 THEN 'Aafrika'
           ELSE 'Tundmatu'
       END
           region
  FROM countries;

Raporteerimine kogutud andmete kasutamise kaudu grupifunktsioonide abil.

Töötajate tabel. Saada raport department_id kohta, mis sisaldab minimaalset ja maksimaalset palka, varasemate ja hilisemate tööle asumise kuupäevade ning töötajate arvu. Sorteeri töötajate arvu järgi (kahanevas järjekorras).
Lahendus

  SELECT department_id,
         MIN(salary) min_salary,
         MAX(salary) max_salary,
         MIN(hire_date) min_hire_date,
         MAX(hire_date) max_hire_Date,
         COUNT(*) count
    FROM employees
GROUP BY department_id
ORDER BY count(*) DESC;

Töötajate tabel. Kui palju töötajaid on nimedega, mis algavad sama tähega? Sorteeri arvu järgi. Näita ainult neid, kus arv on suurem kui 1
Lahendus

SELECT SUBSTR (first_name, 1, 1) first_char, COUNT (*)
    FROM employees
GROUP BY SUBSTR (first_name, 1, 1)
  HAVING COUNT (*) > 1
ORDER BY 2 DESC;

Töötajate tabel. Kui palju töötajaid töötab samas osakonnas ja saab sama palka?
Lahendus

SELECT department_id, salary, COUNT (*)
    FROM employees
GROUP BY department_id, salary
  HAVING COUNT (*) > 1;

Töötajate tabel. Saada raport, kui palju töötajaid on seotud igal nädalapäeval. Sorteeri arvu järgi
Lahendus

SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;

Töötajate tabel. Saada raport, kui palju töötajaid on palgatud aastate kaupa. Sorteeri arvu järgi
Lahendus

SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');

Töötajate tabel. Selgita, kui palju osakondi on, kus on töötajad
Lahendus

SELECT COUNT (COUNT (*)) department_count
    FROM employees
   WHERE department_id IS NOT NULL
GROUP BY department_id;

Töötajate tabel. Saada loetelu department_id, kus töötab rohkem kui 30 töötajat
Lahendus

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (*) > 30;

Töötajate tabel. Hankige department_id ja ümmargune keskmine palk töötajate kaupa igas osakonnas.
Lahendus

  SELECT department_id, ROUND (AVG (salary)) avg_salary
    FROM employees
GROUP BY department_id;

Riikide tabel. Hankige region_id, kus country_name'i tähemärkide kogus on rohkem kui 60.
Lahendus

  SELECT region_id
    FROM countries
GROUP BY region_id
  HAVING SUM (LENGTH (country_name)) > 60;

Töötajate tabel. Hankige department_id, kus töötavad töötajad mitmete (>1) job_id-dega.
Lahendus

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (DISTINCT job_id) > 1;

Töötajate tabel. Hankige manager_id, kelle alluvate arv on üle 5 ja kelle alluvate palkade summa on üle 50000.
Lahendus

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

Töötajate tabel. Hankige manager_id, kelle alluvate keskmine palk on vahemikus 6000–9000 ja kes ei saa boonuseid (commission_pct on tühi).
Lahendus

  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;

Töötajate tabel. Hankige maksimaalne palk kõikidest töötajatest, kelle job_id lõpeb sõnaga ‘CLERK’.
Lahendus

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 tabel. Saada suurim palk keskmiste palkade seast osakonnas.
Lahendus

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

Employees tabel. Saada töötajate arv, kellel on nime pikkuse järgi sama palju tähti. Näidata ainult neid, kelle nime pikkus ületab 5 ja kellel on sellise nimega töötajaid rohkem kui 20. Sorteerida nime pikkuse järgi.
Lahendus

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

Andmete kuvamine mitmest tabelist kasutades JOIN'e.

Employees, Departments, Locations, Countries, Regions tabel. Saada piirkondade loetelu ja töötajate arvu igas piirkonnas.
Lahendus

  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, Departments, Locations, Countries, Regions tabel. Saada iga töötaja kohta põhjalik teave:
First_name, Last_name, Department, Job, Street, Country, Region
Lahendus

VALI Esimene_nimi,
       Perekonnanimi,
       Osakonna_nimi,
       Töö_id,
       tänava_aadress,
       Riigi_nimi,
       Piirkonna_nimi
  TÖÖTAJAD  e
       LIITU osakondadega d ON (e.osakonna_id = d.osakonna_id)
       LIITU asukohtadega l ON (d.asukoha_id = l.asukoha_id)
       LIITU riikidega c ON (l.riigi_id = c.riigi_id)
       LIITU piirkondadega r ON (c.piirkonna_id = r.piirkonna_id);

Tabel TÖÖTAJAD. Näita kõiki juhte, kelle alluvuses on rohkem kui 6 töötajat.
Lahendus

  VALI man.esimene_nimi, LOEND (*)
    TÖÖTAJAD emp LIITU TÖÖTAJAD man ON (emp.juhataja_id = man.töötaja_id)
RÜHMITA man.esimene_nimi
  KUIDAS LOEND (*) > 6;

Tabel TÖÖTAJAD. Näita kõiki töötajaid, kellele ei allu kedagi.
Lahendus

VALI emp.esimene_nimi
  TÖÖTAJAD  emp
       VASAKLIIT TÖÖTAJAD man ON (emp.juhataja_id = man.töötaja_id)
 KUS man.ESIMENE_NIMI ON NULL;

VALI esimene_nimi
  TÖÖTAJAD
 KUS juhataja_id ON NULL;

Tabel TÖÖTAJAD, Töö_ajalugu. Tabelis TÖÖTAJAD on kõik töötajad. Tabelis Töö_ajalugu on töötajad, kes on ettevõttest lahkunud. Saada raport kõigist töötajatest ja nende staatuse kohta ettevõttes (Töötavad või lahkunud koos lahkumise kuupäevaga).
Näide:
esimene_nimi | staatus
Jennifer | Lahkus ettevõttest 31. detsembril 2006.
Clara | Praegu töötab
Lahendus

VALI esimene_nimi,
       NVL2 (
           lõppkuupäev,
           TO_CHAR (lõppkuupäev, 'fm""Lahkus ettevõttest"" DD ""kuupäeval"" Kuu, YYYY'),
           'Praegu töötab')
           staatus
  TÖÖTAJAD e VASAKLIIT tööajalooga j ON (e.töötaja_id = j.töötaja_id);

Töötajad, osakonnad, asukohad, riigid, piirkonnad. Saada nimekiri töötajatest, kes elavad Euroopas (region_name)
Lahendus

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

Töötajad, osakonnad. Näita kõiki osakondi, kus töötab rohkem kui 30 töötajat
Lahendus

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

Töötajad, osakonnad. Näita kõiki töötajaid, kes ei kuulu ühtegi osakonda
Lahendus

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;

Töötajad, osakonnad. Näita kõiki osakondi, kus ei ole ühtegi töötajat
Lahendus

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

Töötajad. Näita kõiki töötajaid, kellel ei ole kedagi alluvuses
Lahendus

VALI man.first_name
  FROM employees emp
       ÕIGE LIITUMINE employees man ON (emp.manager_id = man.employee_id)
 WHERE emp.FIRST_NAME IS NULL;

Tabel Employees, Jobs, Departaments. Näita töötajaid kujul: First_name, Job_title, Department_name.
Näide:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Lahendus

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

Tabel Employees. Hangi töötajate nimekiri, kelle juhendajad asusid tööle 2005. aastal, kuid need töötajad ise asusid tööle enne 2005. aastat.
Lahendus

VALI emp.*
  FROM employees emp LIITU 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');

Tabel Employees. Hangi töötajate nimekiri, kelle juhendajad asusid tööle jaanuari kuus mistahes aastal ja nende töötajate job_title pikkus on üle 15 tähte.
Lahendus

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

Aluspäringute kasutamine päringute lahendamiseks

Tabel Employees. Hangi nimekiri töötajatest, kelle nimi on kõige pikem.
Lahendus

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

Töötajate tabel. Saada nimekiri töötajatest, kelle palk on kõrgem kui kõikide töötajate keskmine palk.
Lahendus

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

Töötajate, osakondade ja asukohtade tabel. Saada linn, kus töötajad teenivad kokku vähem kui kõik teised.
Lahendus

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

Töötajate tabel. Saada nimekiri töötajatest, kelle juhi palk on üle 15000.
Lahendus

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

Töötajad, osakonnad. Näita kõiki osakondi, kus ei ole ühtegi töötajat
Lahendus

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

Töötajate tabel. Näita kõiki töötajaid, kes ei ole juhid.
Lahendus

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

Tabel TÖÖTAJAD. Näita kõiki juhte, kelle alluvuses on rohkem kui 6 töötajat.
Lahendus

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

Töötajate ja osakondade tabel. Näita töötajaid, kes töötavad IT osakonnas.
Lahendus

VALI *
  TÖÖTAJAD
 KUS osakond_id = (VALI osakond_id
                          TÖÖTAD
                         KUS osakonna_nimi = 'IT');

Tabel Employees, Jobs, Departaments. Näita töötajaid kujul: First_name, Job_title, Department_name.
Näide:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Lahendus

VALI eesnimi,
       (VALI ametinimetus
          TÖÖTAD
         KUS amet_id = e.amet_id)
           ametinimetus,
       (VALI osakonna_nimi
          TÖÖTAD
         KUS osakond_id = e.osakond_id)
           osakonna_nimi
  TÖÖTAJAD e;

Tabel Employees. Hangi töötajate nimekiri, kelle juhendajad asusid tööle 2005. aastal, kuid need töötajad ise asusid tööle enne 2005. aastat.
Lahendus

VALI *
  TÖÖTAJAD
 KUS     juhataja_id IN (VALI töötaja_id
                            TÖÖTAD
                           KUS TO_CHAR (tööle asumise_date, 'YYYY') = '2005')
       JA tööle_asumise_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabel Employees. Hangi töötajate nimekiri, kelle juhendajad asusid tööle jaanuari kuus mistahes aastal ja nende töötajate job_title pikkus on üle 15 tähte.
Lahendus

VALI *
  TÖÖTAJAD e
 KUS     juhataja_id IN (VALI töötaja_id
                            TÖÖTAD
                           KUS TO_CHAR (tööle_asumise_date, 'MM') = '01')
       JA (VALI LENGTH (ametinimetus)
              TÖÖTAD
             KUS amet_id = e.amet_id) > 15;

Sellega on kõik.

Loodan, et ülesanded olid huvitavad ja kaasahaaravad.
Püüan seda ülesannete nimekirja võimalusel täiendada.
Olen ka igasuguste märkuste ja ettepanekute eest tänulik.

P.S.: Kui kellelgi tuleb pähe huvitav SELECT ülesanne, kirjutage kommentaaridesse, lisan nimekirja.

Aitäh.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster