SQL. Huvitavad ülesanded.

Tere, Habr!

Juba rohkem kui 3 aastat olen õpetanud SQL-i erinevates koolituskeskustes ning üks minu tähelepanekutest on see, et õpilased omandavad ja mõistavad SQL-i paremini, kui seada neile ülesanne, mitte lihtsalt rääkida võimalustest ja teoreetilistest alustest.

Selles artiklis jagan teiega oma nimekirja ülesannetest, mida ma õpilastele kodutööks annan ja mille üle me erinevaid ajurünnakuid peame, mis viib sügava ja selge SQL-i mõistmiseni.

SQL. Huvitavad ülesanded.

SQL (ˈɛsˈkjuˈɛl; inglise keeles structured query language — ‘struktureeritud päringute keel’) on deklaratiivne programmeerimiskeel, mida kasutatakse andmete loomisel, muutmisel ja haldamisel rälatsioonilises andmebaasis, mida haldab vastav andmebaasi haldussüsteem. Loe rohkem…

SQL-i kohta saab lugeda erinevatest allikatest.
Selle artikli eesmärk ei ole õpetada teid SQL-i nullist.

Nii et, lähme!

Kasutame kõigile tuntud HR skeemi Oracle'is koos selle tabelitega (Lisateave):

SQL. Huvitavad ülesanded.
Tahan märkida, et vaatame ainult SELECT ülesandeid. Siin pole DML ja DDL ülesandeid.

Ülesanded

Andmete piiramine ja järjestamine

Tabel Employees. Saage teave kõigi töötajate kohta.
Lahendus

SELECT * FROM employees

Tabel Employees. Saage nimekirja kõigist töötajatest, kelle nimi on ‘David’.
Lahendus

SELECT * FROM employees WHERE first_name = 'David';

Tabel Employees. Saage nimekirja kõigist töötajatest, kelle job_id on ‘IT_PROG’.
Lahendus

SELECT * FROM employees WHERE job_id = 'IT_PROG';

Tabel Employees. Saage nimekirja kõigist töötajatest 50. osakonnast (department_id) koos palgaga (salary), mis on üle 4000.
Lahendus

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

Tabel Employees. Saage nimekirja kõigist töötajatest 20. ja 30. osakonnast (department_id).
Lahendus

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

Tabel Employees. Saage nimekirja kõigist töötajatest, kelle nime viimane täht on ‘a’.
Lahendus

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

Tabel Employees. Saage nimekirja kõigist töötajatest 50. ja 80. osakonnast (department_id), kellel on boonus (komisjoniprotsendi veerus ei ole väärtus tühi).
Lahendus

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

Tabel Employees. Saage nimekirja kõigist töötajatest, kelle nimedes on vähemalt 2 tähte ‘n’.
Lahendus

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

Tabel Employees. Saage nimekirja kõigist töötajatest, kelle nime pikkus on üle 4 tähe.
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle palk on vahemikus 8000 kuni 9000 (kaasa arvatud)
Lahendus

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nimes on sümbol ‘%’
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist juhtide ID-dest
Lahendus

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

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

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

Kasutades ühekordseid funktsioone väljundi kohandamiseks

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

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nimes on täht ‘b’ (ilma suur-tähtedeta)
Lahendus

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

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

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle palk on 1000 võrra jaotatav
Lahendus

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

Töötajate tabel. Saada kontakttelefoni numbrist töötaja esimene 3-numbriline number, 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 osakonna nime esimeses sõnast need, kelle nimedes on 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 nimekiri kõigist töötajatest, kelle nime viimane täht on ‘m’ ja nimetähe pikkus on suurem kui 5
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 nimekiri kõigist töötajatest, kes on ettevõttes töötanud üle 17 aasta
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle telefoninumbri viimane number on paaritu ja koosneb 3 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öötajate tabel. Saada nimekiri kõigist töötajatest, kelle job_id väärtuses pärast ' _ ' on vähemalt 3 tähte, kuid see väärtus 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öötajate tabel. Saada nimekiri kõigist töötajatest, asendades PHONE_NUMBER väärtuses kõik '.' tähised '-' tähistega
Lahendus

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

Kasutades konversioonifunktsioone ja tingimuslikke väljendeid

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

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

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

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

DUAL tabel. Kuvage homne kuupäev formaadis: Homme on kuu teine päev jaanuaris
Lahendus

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

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

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""päev ""Kuu, YYYY') hire_date
  FROM employees;

Töötajate tabel. Saada nimekiri töötajatest, kelle palka on suurendatud 20%. Palga kuvamine dollarimärgis
Lahendus

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

Töötajate tabel. Saada nimekiri kõigist töötajatest, 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;

Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle täispalk (palk + komisjon %) on 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;

Töötajate tabel. Saada nimekiri kõigist töötajatest ja teave palga boonuste olemasolu kohta (Jah / Ei)
Lahendus

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

Töötajate tabel. Saada iga töötaja palga tase: Alla 5000 loetakse madalaks tasemeks, 5000 või enam ja alla 10000 loetakse normaalseks tasemeks, 10000 või enam 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;

Tabel Countries. Näidata iga riigi piirkonda, kus ta asub: 1-Euroopa, 2-Ameerika, 3-Aasia, 4-Aafrika (ilma Joinita)
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;

Aruandlus Kogutud Andmete Kohta Kasutades Rühma Funktsioone

Tabel Employees. Saada aruandlus department_id kaupa, minimaalse ja maksimaalse palgaga, varase ja hilise tööleasumise kuupäevaga ning töötajate arvuga. Sordima 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;

Tabel Employees. Kui palju töötajaid, kelle nimed algavad sama tähega? Sordima arvu järgi. Näidata 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;

Tabel Employees. 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;

Tabel Employees. Saada aruandlus, kui palju töötajaid võeti tööle igal nädalapäeval. Sordima 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;

Tabel Employees. Saada aruandlus, kui palju töötajaid võeti tööle aastate kaupa. Sordima arvu järgi
Lahendus

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

Tabel Employees. Saada aruanne, 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;

Tabel Employees. Saada osakondade loetelu, kus töötab rohkem kui 30 töötajat
Lahendus

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

Tabel Employees. Saada osakondade loetelu ja ümardatud keskmine palk töötajatele igas osakonnas.
Lahendus

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

Tabel Countries. Saada loetelu region_id summa kõigist letters, mis on country_name, kus on rohkem kui 60
Lahendus

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

Tabel Employees. Saage department_id, kus töötavad mitmed (>1) job_id töötajad
Lahendus

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

Tabel Employees. Saage manager_id, kelle alluvate arv on suurem kui 5 ja kõigi tema alluvate palkade summa suurem kui 50000
Lahendus

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

Tabel Employees. Saage manager_id, kelle kõigi tema alluvate keskmine palk jääb vahemikku 6000 kuni 9000 ja kes ei saa boonuseid (commission_pct tühi)
Lahendus

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

Tabel Employees. Saage maksimaalne palk kõigilt töötajatelt, kelle job_id lõpeb sõnaga 'CLERK'
Lahendus

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

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

Tabel Employees. Saage maksimaalne palk kõikide osakondade keskmiste palkade seas
Lahendus

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

Tabel Employees. Saage töötajate arv, kellel on sama nime pikkus. Näidake vaid neid, kelle nime pikkus on suurem kui 5 ja kellel on sellise nimega töötajaid rohkem kui 20. Sorteerige nime pikkuse alusel
Lahendus

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

  VALI 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

Tabel Employees, Departaments, Locations, Countries, Regions. Saage piirkondade nimekiri ja töötajate arv igas piirkonnas
Lahendus

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

Tabel Employees, Departaments, Locations, Countries, Regions. Saage üksikasjalik teave iga töötaja kohta:
First_name, Last_name, Departament, Job, Street, Country, Region
Lahendus

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

Tabel Employees. Kuvage kõik juhid, kelle alluvate arv ületab 6 töötajat
Lahendus

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

Töötajate tabel. Näita kõiki töötajaid, kellel ei ole ülemust.
Lahendus

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

VALI first_name
  FROM employees
 WHERE manager_id IS NULL;

Töötajate tabel, Tööajalugu. Töötajate tabelis on kõik töötajad. Tööajalugu tabelis on töötajad, kes on ettevõtte lahkunud. Saada aruanne kõigi töötajate ja nende staatuse kohta ettevõttes (Töötavad või lahkusid ettevõttest lahkumiskuupäevaga).
Näide:
first_name | staatus
Jennifer | Lahkus ettevõttest 31. detsembril 2006.
Clara | Praegu töötav
Lahendus

VALI first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Lahkunud ettevõttest"" DD ""kuupäeval"" Kuu, YYYY'),
           'Praegu töötav')
           staatus
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

Töötajate tabel, Osakonnad, Asukohad, Riigid, Regioonid. Saada nimekiri töötajatest, kes elavad Euroopas (region_name).
Lahendus

 VALI 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';
 
 VALI 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öötajate tabel, Osakonnad. Näita kõiki osakondi, kus töötab rohkem kui 30 töötajat.
Lahendus

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

Töötajate tabel, Osakonnad. Näita kõiki töötajaid, kes ei kuulu ühtegi osakonda.
Lahendus

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

VALI first_name
  FROM employees
 WHERE department_id IS NULL;

Töötajate tabel, Osakonnad. Näita kõiki osakondi, kus ei ole ühtegi töötajat.
Lahendus

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

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

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

Töötajate tabel, Töökoht, Osakonnad. Näita töötajaid vormingus: First_name, Job_title, Department_name.
Näide:
First_name | Job_title | Department_name
Donald | Laondus | Klientlaondus
Lahendus

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

Töötajate tabel. Saada nimekiri töötajatest, kelle ülemused on tööle asunud 2005. aastal, kuid need töötajad ise on tööle asunud enne 2005. aastat.
Lahendus

VALI emp.*
  KASUTA töötajad emp LIITU töötajatega man KAS (emp.manager_id = man.employee_id)
 KUS     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       JA emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Töötajate tabel. Saada nimekiri töötajatest, kelle juhid alustasid tööd jaanuaris igal aastal ja kelle ametinimetuse pikkus on üle 15 tähemärgi.
Lahendus

VALI emp.*
  KASUTA töötajad emp
       LIITU töötajatega man KAS (emp.manager_id = man.employee_id)
       LIITU töödega j KAS (emp.job_id = j.job_id)
 KUS TO_CHAR (man.hire_date, 'MM') = '01' JA LENGTH (j.job_title) > 15;

Alamklauslite kasutamine päringute lahendamiseks

Töötajate tabel. Saada nimekiri töötajatest, kellel on kõige pikem nimi.
Lahendus

VALI *
  KASUTA töötajad
 KUS LENGTH (first_name) =
       (VALI MAX (LENGTH (first_name)) KASUTA töötajad);

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

VALI *
  KASUTA töötajad
 KUS salary > (VALI AVG (salary) KASUTA töötajad);

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

VALI linn
    KASUTA töötajad e
         LIITU osakondadega d KAS (e.department_id = d.department_id)
         LIITU asukohtadega l KAS (d.location_id = l.location_id)
RÜHMITA LINN
  HAVING SUM (salary) =
         (  VALI MIN (SUM (salary))
              KASUTA töötajad e
                   LIITU osakondadega d KAS (e.department_id = d.department_id)
                   LIITU asukohtadega l KAS (d.location_id = l.location_id)
          RÜHMITA LINN);

Töötajate tabel. Saada nimekiri töötajatest, kelle juhid teenivad rohkem kui 15000.
Lahendus

VALI *
  KASUTA töötajad
 KUS manager_id IN (VALI employee_id
                        KASUTA töötajad
                       KUS salary > 15000)

Töötajate tabel, Osakonnad. Näita kõiki osakondi, kus ei ole ühtegi töötajat.
Lahendus

VALI *
  KASUTA osakonnad
 KUS department_id NOT IN (VALI department_id
                               KASUTA töötajad
                              KUS department_id IS NOT NULL);

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

VALI *
  KASUTA töötajad
 KUS employee_id NOT IN (VALI manager_id
                             KASUTA töötajad
                            KUS manager_id IS NOT NULL)

Tabel Employees. Kuvage kõik juhid, kelle alluvate arv ületab 6 töötajat
Lahendus

VALI *
  KASUTA töötajad e
 KUS (VALI COUNT (*)
          KASUTA töötajad
         KUS manager_id = e.employee_id) > 6;

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

VALI *
  KASUTA töötajad
 KUS department_id = (VALI department_id
                          KASUTA osakonnad
                         KUS department_name = 'IT');

Töötajate tabel, Töökoht, Osakonnad. Näita töötajaid vormingus: First_name, Job_title, Department_name.
Näide:
First_name | Job_title | Department_name
Donald | Laondus | Klientlaondus
Lahendus

VALI first_name,
       (VALI job_title
          KASUTA tööde
         KUS job_id = e.job_id)
           job_title,
       (VALI department_name
          KASUTA osakonnad
         KUS department_id = e.department_id)
           department_name
  KASUTA töötajad e;

Töötajate tabel. Saada nimekiri töötajatest, kelle ülemused on tööle asunud 2005. aastal, kuid need töötajad ise on tööle asunud enne 2005. aastat.
Lahendus

VALI *
  KASUTA töötajad
 KUS     manager_id IN (VALI employee_id
                            KASUTA töötajad
                           KUS TO_CHAR (hire_date, 'YYYY') = '2005')
       JA hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Töötajate tabel. Saada nimekiri töötajatest, kelle juhid alustasid tööd jaanuaris igal aastal ja kelle ametinimetuse pikkus on üle 15 tähemärgi.
Lahendus

VALI *
  KASUTA töötajad e
 KUS     manager_id IN (VALI employee_id
                            KASUTA töötajad
                           KUS TO_CHAR (hire_date, 'MM') = '01')
       JA (VALI LENGTH (job_title)
              KASUTA tööde
             KUS job_id = e.job_id) > 15;

Sellega on kõik.

Loodan, et ülesanded olid huvitavad ja kaasahaaravad.
Püüan seda ülesannete nimekirja vajadusel täiendada.
Olen ka avatud igasuguste kommentaaride ja ettepanekute suhtes.

P.S.: Kui kellelgi tuleb meelde huvitav ülesanne SELECT-i kohta, kirjutage kommentaaridesse, lisan nimekirja.

Aitäh.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster