SQL. Meelelahutuslikud mõistatused

Tere Habr!

Üle 3 aasta olen õpetanud SQL-i erinevates koolituskeskustes ja üks minu tähelepanekutest on see, et õpilased valdavad ja mõistavad SQL-i paremini, kui neile antakse ülesanne, mitte ei räägi ainult võimalustest ja teoreetilistest alustest.

Selles artiklis jagan teiega oma ülesannete nimekirja, mille annan õpilastele kodutööna ja mille kohta viime läbi erinevaid ajurünnakuid, mis viib SQL-i sügava ja selge mõistmiseni.

SQL. Meelelahutuslikud mõistatused

SQL (ˈɛsˈkjuˈɛl; eng. struktureeritud päringukeel) on deklaratiivne programmeerimiskeel, mida kasutatakse andmete loomiseks, muutmiseks ja haldamiseks relatsiooniandmebaasis, mida haldab sobiv andmebaasihaldussüsteem. Loe edasi ...

SQL-i kohta saate lugeda erinevatest allikatest.
See artikkel ei ole mõeldud teile SQL-i nullist õpetamiseks.

Nii et lähme.

Kasutame tuntud HR skeem Oracle'is oma tabelitega (Rohkem):

SQL. Meelelahutuslikud mõistatused
Märgin, et käsitleme ainult SELECT-i ülesandeid. DML-is ja DDL-is pole ülesandeid.

ülesanded

Andmete piiramine ja sortimine

Töötajate tabel. Hankige nimekiri kõigi töötajate kohta käiva teabega
otsus

SELECT * FROM employees

Töötajate tabel. Hankige nimekiri kõigist töötajatest nimega "David"
otsus

SELECT *
  FROM employees
 WHERE first_name = 'David';

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle job_id võrdub 'IT_PROG'
otsus

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Töötajate tabel. Hankige nimekiri kõigist 50. osakonna töötajatest (osakonna_id), kelle palk (palk) on suurem kui 4000
otsus

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

Töötajate tabel. Hankige kõigi 20. ja 30. osakonna töötajate nimekiri (osakonna_id)
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle nime viimane täht on "a"
otsus

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

Töötajate tabel. Hankige nimekiri kõigist 50. ja 80. osakonna töötajatest (osakonna_id), kellel on boonus (väärtus veerus Commission_pct ei ole tühi)
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle nimi sisaldab vähemalt kahte n-tähte
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle nimi on pikem kui 4 tähte
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle palk on vahemikus 8000–9000 (kaasa arvatud)
otsus

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle nimi sisaldab sümbolit "%"
otsus

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

Töötajate tabel. Hankige kõigi halduri ID-de loend
otsus

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Töötajate tabel. Hankige töötajate nimekiri koos nende ametikohtadega kujul: Donald(sh_clerk)
otsus

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

Üherealiste funktsioonide kasutamine väljundi kohandamiseks

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle nimi on pikem kui 10 tähte
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle nimel on täht "b" (suur- ja suurtähtede tundlikkus)
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle nimi sisaldab vähemalt kahte a-tähte
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle palk on 1000-kordne
otsus

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

Töötajate tabel. Hankige töötaja telefoninumbri esimene 3-kohaline number, kui tema number on vormingus ХХХ.ХХХ.ХХХХ
otsus

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

Osakondade tabel. Hankige esimene sõna osakonna nimest neile, kelle nimes on rohkem kui üks sõna
otsus

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

Töötajate tabel. Hankige töötajate nimed ilma ees- ja viimasetäheta
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle nime viimane täht on võrdne "m" ja nime pikkus on suurem kui 5
otsus

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

Kahekordne laud. Hankige kuupäev järgmisel reedel
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kes on ettevõttes töötanud üle 17 aasta
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle telefoninumbri viimane number on paaritu ja koosneb kolmest punktiga eraldatud numbrist
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kelle job_id väärtus pärast märki '_' sisaldab vähemalt 3 tähemärki, kuid see väärtus pärast '_' ei võrdu väärtusega 'CLERK'
otsus

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. Hankige kõigi töötajate loend, asendades numbri PHONE_NUMBER väärtuses kõik ".". peal '-'
otsus

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

Teisendusfunktsioonide ja tingimusavaldiste kasutamine

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kes tulid tööle kuu esimesel päeval (mis tahes)
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kes tulid tööle 2008. aastal
otsus

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

DUAL laud. Näita homset kuupäeva formaadis: Homme on jaanuari teine ​​päev
otsus

SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month')     info
  FROM DUAL;

Töötajate tabel. Hankige kõigi töötajate nimekiri ja nende alguskuupäev kujul: 21. juuni 2007
otsus

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

Töötajate tabel. Hankige nimekiri töötajatest, kelle palk on 20%. Näita palka dollarimärgiga
otsus

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

Töötajate tabel. Hankige nimekiri kõigist töötajatest, kes tulid tööle 2007. aasta veebruaris.
otsus

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 laud. Ekspordi praegune kuupäev, + sekund, + minut, + tund, + päev, + kuu, + aasta
otsus

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. Hankige nimekiri kõigist töötajatest, kellel on täispalk (palk + vahendustasu_protsent(%)) kujul: 24,000.00 XNUMX $
otsus

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

Töötajate tabel. Hankige kõigi töötajate nimekiri ja teave palgalisade olemasolu kohta (jah/ei)
otsus

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

Töötajate tabel. Hankige iga töötaja palgatase: alla 5000 loetakse madalaks, suurem või võrdne 5000 ja alla 10000 10000 loetakse normaalseks, suurem või võrdne XNUMX XNUMX loetakse kõrgeks.
otsus

SELECT first_name,
       salary,
       CASE
           WHEN salary < 5000 THEN 'Low'
           WHEN salary >= 5000 AND salary < 10000 THEN 'Normal'
           ELSE 'High'
       END salary_level
  FROM employees;

Riikide tabel. Näidake iga riigi kohta piirkonda, kus see asub: 1-Euroopa, 2-Ameerika, 3-Aasia, 4-Aafrika (ilma liitumiseta)
otsus

SELECT country_name country,
       DECODE (region_id,
               1, 'Europe',
               2, 'America',
               3, 'Asia',
               4, 'Africa',
               'Unknown')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Europe'
           WHEN 2 THEN 'America'
           WHEN 3 THEN 'Asia'
           WHEN 4 THEN 'Africa'
           ELSE 'Unknown'
       END
           region
  FROM countries;

Koondandmete aruandlus rühmafunktsioonide abil

Töötajate tabel. Hankige osakond_id järgi aruanne miinimum- ja maksimumpalga, varajase ja hilise saabumise kuupäevade ning töötajate arvuga. Sorteeri töötajate arvu järgi (kahanemine)
otsus

  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 on töötajaid, kelle nimi algab sama tähega? Sorteeri koguse järgi. Näidake ainult neid, mille arv on suurem kui 1
otsus

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 saavad sama palka?
otsus

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

Töötajate tabel. Hankige aruanne selle kohta, kui palju töötajaid igal nädalapäeval palgati. Sorteeri koguse järgi
otsus

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

Töötajate tabel. Hankige aruanne selle kohta, kui palju töötajaid aasta lõikes palgati. Sorteeri koguse järgi
otsus

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

Töötajate tabel. Hankige töötajatega osakondade arv
otsus

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

Töötajate tabel. Hankige rohkem kui 30 töötajaga osakonna ID loend
otsus

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

Töötajate tabel. Hankige osakonna ID-de loend ja iga osakonna töötajate ümardatud keskmine palk.
otsus

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

Riikide tabel. Hankige loendi region_id summa kõigi riiginimede tähtedest, milles on rohkem kui 60
otsus

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

Töötajate tabel. Hankige osakonna_id loend, milles töötavad mitme (> 1) töö_id töötajad
otsus

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

Töötajate tabel. Hankige nimekiri manager_id, mille alluvate arv on suurem kui 5 ja tema alluvate kõigi palkade summa on suurem kui 50000 XNUMX
otsus

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

Töötajate tabel. Hankige nimekiri manager_id-st, kelle kõigi tema alluvate keskmine palk on vahemikus 6000 kuni 9000, kes ei saa lisatasusid (vahendustasu_pct on tühi)
otsus

  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 kõigi töötajate maksimaalne palk job_id, mis lõpeb sõnaga "CLERK"
otsus

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

Töötajate tabel. Hankige maksimaalne palk kõigi osakonna keskmiste palkade hulgast
otsus

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

Töötajate tabel. Hankige töötajate arv, kelle nimes on sama arv tähti. Samal ajal näidata ainult neid, kelle nimi on pikem kui 5 ja samanimeliste töötajate arv on üle 20. Sorteeri nime pikkuse järgi
otsus

  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 ühenduste abil

Tabeli töötajad, osakonnad, asukohad, riigid, piirkonnad. Hankige piirkondade loend ja töötajate arv igas piirkonnas
otsus

  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;

Tabeli töötajad, osakonnad, asukohad, riigid, piirkonnad. Hankige üksikasjalikku teavet iga töötaja kohta:
Eesnimi, Perekonnanimi, Osakond, Töökoht, Tänav, Riik, Piirkond
otsus

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

Töötajate tabel. Kuva kõik juhid, kellel on rohkem kui 6 töötajat
otsus

  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;

Töötajate tabel. Näidake kõiki töötajaid, kes ei anna kellelegi aru
otsus

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;

Töötajate tabel, tööajalugu. Töötajate tabel salvestab kõik töötajad. Tabelis Job_history on salvestatud ettevõttest lahkunud töötajad. Hankige aruanne kõigi töötajate ja nende staatuse kohta ettevõttes (töötanud või ettevõttest lahkunud koos lahkumiskuupäevaga)
Näide:
eesnimi | olek
jennifer | Lahkus ettevõttest 31. detsembril 2006
Clara | Hetkel Töötab
otsus

SELECT first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Left the company at"" DD ""of"" Month, YYYY'),
           'Currently Working')
           status
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

Tabeli töötajad, osakonnad, asukohad, riigid, piirkonnad. Hankige nimekiri töötajatest, kes elavad Euroopas (region_name)
otsus

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

Tabeli töötajad, osakonnad. Kuva kõik osakonnad, kus on rohkem kui 30 töötajat
otsus

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

Tabeli töötajad, osakonnad. Näidake kõiki töötajaid, kes pole üheski osakonnas
otsus

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;

Tabeli töötajad, osakonnad. Kuva kõik osakonnad, kus pole töötajaid
otsus

SELECT 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äidake kõiki töötajaid, kellel pole alluvaid
otsus

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

Tabeli töötajad, töökohad, osakonnad. Kuva töötajad vormingus: eesnimi, ametinimetus, osakonna_nimi.
Näide:
eesnimi | ametinimetus | Osakonna nimi
Donald | saatmine | Laevandusametnik
otsus

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

Töötajate tabel. Hankige nimekiri töötajatest, kelle juhid said tööd 2005. aastal, kuid samal ajal said need töötajad ise tööd enne 2005. aastat
otsus

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

Töötajate tabel. Hankige nimekiri töötajatest, kelle juhid said tööle mis tahes aasta jaanuaris ja nende töötajate ametinimetuse pikkus on üle 15 tähemärgi
otsus

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;

Alampäringute kasutamine päringute lahendamiseks

Töötajate tabel. Hankige pikima nimega töötajate nimekiri.
otsus

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

Töötajate tabel. Hankige nimekiri töötajatest, kelle palk on suurem kui kõigi töötajate keskmine palk.
otsus

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

Tabeli töötajad, osakonnad, asukohad. Hankige linn, kus töötajad kokku teenivad kõige vähem.
otsus

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. Hankige nimekiri töötajatest, kelle juht saab palka üle 15000 XNUMX.
otsus

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

Tabeli töötajad, osakonnad. Kuva kõik osakonnad, kus pole töötajaid
otsus

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
otsus

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

Töötajate tabel. Kuva kõik juhid, kellel on rohkem kui 6 töötajat
otsus

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

Tabeli töötajad, osakonnad. Näidake IT-osakonnas töötavaid töötajaid
otsus

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

Tabeli töötajad, töökohad, osakonnad. Kuva töötajad vormingus: eesnimi, ametinimetus, osakonna_nimi.
Näide:
eesnimi | ametinimetus | Osakonna nimi
Donald | saatmine | Laevandusametnik
otsus

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;

Töötajate tabel. Hankige nimekiri töötajatest, kelle juhid said tööd 2005. aastal, kuid samal ajal said need töötajad ise tööd enne 2005. aastat
otsus

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

Töötajate tabel. Hankige nimekiri töötajatest, kelle juhid said tööle mis tahes aasta jaanuaris ja nende töötajate ametinimetuse pikkus on üle 15 tähemärgi
otsus

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;

Praeguseks kõik.

Loodan, et ülesanded olid huvitavad ja põnevad.
Täiendan seda nimekirja nii palju kui võimalik.
Samuti võtan hea meelega kõik kommentaarid ja ettepanekud.

PS: Kui kellelgi tuleb SELECTis mõni huvitav ülesanne, kirjutage kommentaaridesse, lisan selle nimekirja.

Aitäh.

Allikas: www.habr.com

Lisa kommentaar