SQL. Entertaining puzels

Hallo, Habr!

Al mear as 3 jier lear ik SQL yn ferskate trainingsintra, en ien fan myn observaasjes is dat studinten SQL better behearskje en begripe as se in taak krije, en net allinich ferteld wurde oer de mooglikheden en teoretyske fûneminten.

Yn dit artikel sil ik myn list mei problemen mei jo diele dy't ik as húswurk oan studinten jou en wêrop wy ferskate soarten brainstorms útfiere, wat liedt ta in djip en dúdlik begryp fan SQL.

SQL. Entertaining puzels

SQL (ˈɛsˈkjuˈɛl; Ingelsk strukturearre query-taal) is in deklarative programmeartaal dy't brûkt wurdt om gegevens te meitsjen, te wizigjen en te behearjen yn in relasjonele databank beheard troch in passend databankbehearsysteem. Learje mear

Jo kinne lêze oer SQL út ferskate boarnen.
Dit artikel is net bedoeld om jo SQL fanôf it begjin te learen.

Dat litte we gean.

Wy sille it bekende brûke HR diagram yn Oracle mei syn tabellen (Mear):

SQL. Entertaining puzels
Ik merk op dat wy allinich SELECT-taken sille beskôgje. D'r binne hjir gjin DML- of DDL-taken.

taken

Gegevens beheine en sortearje

Meiwurkers tabel. Krij in list mei ynformaasje oer alle meiwurkers
beslút

SELECT * FROM employees

Meiwurkers tabel. Krij in list mei alle meiwurkers mei de namme 'David'
beslút

SELECT *
  FROM employees
 WHERE first_name = 'David';

Meiwurkers tabel. Krij in list fan alle meiwurkers mei job_id lyk oan 'IT_PROG'
beslút

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Meiwurkers tabel. Krij in list fan alle meiwurkers fan 'e 50e ôfdieling (department_id) mei in salaris (salaris) grutter dan 4000
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers fan 'e 20e en 30e ôfdieling (department_id)
beslút

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

Meiwurkers tabel. Krij in list fan alle meiwurkers waans lêste letter yn har namme 'a' is
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers fan 'e 50e en 80e ôfdieling (department_id) dy't in bonus hawwe (de wearde yn' e kolom commission_pct is net leech)
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers waans nammen op syn minst 2 letters 'n' befetsje
beslút

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

Meiwurkers tabel. Krij in list fan alle meiwurkers waans nammen langer dan 4 letters binne
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers waans salaris yn it berik is fan 8000 oant 9000 (ynklusyf)
beslút

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Meiwurkers tabel. Krij in list mei alle meiwurkers waans namme it symboal '%' befettet
beslút

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

Meiwurkers tabel. Krij in list mei alle manager-ID's
beslút

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Meiwurkers tabel. Krij in list mei meiwurkers mei har posysjes yn it formaat: Donald(sh_clerk)
beslút

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

It brûken fan funksjes mei ien rige om útfier oan te passen

Meiwurkers tabel. Krij in list fan alle meiwurkers waans nammen langer dan 10 letters binne
beslút

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

Meiwurkers tabel. Krij in list fan alle meiwurkers dy't de letter 'b' yn har namme hawwe (gefoelich foar haadletters)
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers waans nammen op syn minst 2 letters 'a' befetsje
beslút

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

Meiwurkers tabel. Krij in list fan alle meiwurkers waans salaris in mearfâld fan 1000 is
beslút

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

Meiwurkers tabel. Krij it earste 3-sifersnûmer fan it telefoannûmer fan in meiwurker as syn nûmer yn it formaat XXX.XXX.XXXX is
beslút

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

Ofdielings tabel. Krij it earste wurd fan 'e ôfdielingsnamme foar dyjingen dy't mear as ien wurd yn' e namme hawwe
beslút

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

Meiwurkers tabel. Krij meiwurkersnammen sûnder foar- en lêste letter yn namme
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers waans lêste letter yn har namme 'm' is en waans namme langer is dan 5
beslút

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

Tabel Dual. Get folgjende freed datum
beslút

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

Meiwurkers tabel. Krij in list fan alle meiwurkers dy't mear as 17 jier foar it bedriuw wurke hawwe
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers waans lêste sifer fan har telefoannûmer ûneven is en bestiet út 3 nûmers skieden troch in stip
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers waans job_id-wearde nei it teken '_' op syn minst 3 tekens hat, mar dizze wearde nei de '_' is net gelyk oan 'CLERK'
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers troch alle '.' te ferfangen yn 'e PHONE_NUMBER-wearde op '-'
beslút

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

Gebrûk fan konverzjefunksjes en betingsten útdrukkingen

Meiwurkers tabel. Krij in list fan alle meiwurkers dy't op 'e earste dei fan' e moanne oan it wurk kamen (elke)
beslút

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

Meiwurkers tabel. Krij in list fan alle meiwurkers dy't yn 2008 oan it wurk kamen
beslút

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

Tabel DUAL. Lit de datum fan moarn sjen yn it formaat: Moarn is it twadde dei fan jannewaris
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers en de datum dat elke meiwurker oan it wurk kaam yn it formaat: 21 juny 2007
beslút

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

Meiwurkers tabel. Krij in list mei meiwurkers mei ferhege salarissen mei 20%. Lit salaris sjen mei dollarteken
beslút

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

Meiwurkers tabel. Krij in list fan alle meiwurkers dy't yn febrewaris 2007 begûnen te wurkjen.
beslút

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

Tabel DUAL. Bring de aktuele datum, + sekonde, + minút, + oere, + dei, + moanne, + jier út
beslút

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;

Meiwurkers tabel. Krij in list fan alle meiwurkers mei folsleine salarissen (salaris + commission_pct(%)) yn it formaat: $24,000.00
beslút

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

Meiwurkers tabel. Krij in list mei alle meiwurkers en ynformaasje oer de beskikberens fan salarisbonussen (Ja/Nee)
beslút

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

Meiwurkers tabel. Krij it salarisnivo fan elke meiwurker: Minder dan 5000 wurdt beskôge as leech nivo, grutter as of gelyk oan 5000 en minder dan 10000 wurdt beskôge as normaal nivo, Mear as of gelyk oan 10000 wurdt beskôge as heech nivo
beslút

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;

Tabel Lannen. Lit foar elk lân de regio sjen wêryn it leit: 1-Jeropa, 2-Amearika, 3-Aazje, 4-Afrika (sûnder lid)
beslút

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;

Aggregearre gegevens rapportearje mei de groepsfunksjes

Meiwurkers tabel. Untfang in rapport troch department_id mei it minimum en maksimum salaris, iere en lette datums fan oankomst op it wurk en it oantal meiwurkers. Sortearje op oantal meiwurkers (ôfnimmend)
beslút

  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;

Meiwurkers tabel. Hoefolle meiwurkers waans nammen begjinne mei deselde letter? Sortearje op kwantiteit. Lit allinich dejingen sjen wêr't de kwantiteit grutter is as 1
beslút

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;

Meiwurkers tabel. Hoefolle meiwurkers wurkje yn deselde ôfdieling en krije itselde salaris?
beslút

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

Meiwurkers tabel. Krij in rapport fan hoefolle meiwurkers waarden ynhierd op elke dei fan 'e wike. Sortearje op kwantiteit
beslút

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

Meiwurkers tabel. Krij in rapport fan hoefolle meiwurkers per jier ynhierd binne. Sortearje op kwantiteit
beslút

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

Meiwurkers tabel. Krij it oantal ôfdielingen dy't meiwurkers hawwe
beslút

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

Meiwurkers tabel. Krij in list mei department_ids dy't mear as 30 meiwurkers hawwe
beslút

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

Meiwurkers tabel. Krij in list mei department_ids en it ôfrûne gemiddelde salaris fan meiwurkers yn elke ôfdieling.
beslút

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

Tabel Lannen. Krij de list region_id de som fan alle letters fan alle lânnammen wêryn mear as 60 binne
beslút

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

Meiwurkers tabel. Krij in list mei ôfdielings-id's wêryn meiwurkers fan ferskate (>1) job_ids wurkje
beslút

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

Meiwurkers tabel. Krij in list mei manager_ids wêrfan it oantal ûndergeskikten grutter is as 5 en de som fan alle salarissen fan syn ûndergeskikten grutter is as 50000
beslút

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

Meiwurkers tabel. Krij in list mei manager_ids waans gemiddelde salaris fan al syn ûndergeskikten yn it berik fan 6000 oant 9000 is en dy't gjin bonussen ûntfange (commission_pct is leech)
beslút

  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;

Meiwurkers tabel. Krij it maksimale salaris fan alle wurknimmers job_id dat einiget mei it wurd 'CLERK'
beslút

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

Meiwurkers tabel. Krij it maksimale salaris ûnder alle gemiddelde salarissen foar de ôfdieling
beslút

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

Meiwurkers tabel. Krij it oantal meiwurkers mei itselde oantal letters yn har namme. Lit tagelyk allinnich dejingen sjen waans nammelange is mear as 5 en it oantal meiwurkers mei deselde namme is mear as 20. Sortearje op namme lingte
beslút

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

Gegevens werjaan fan meardere tabellen mei Joins

Tabel Meiwurkers, ôfdielings, lokaasjes, lannen, regio. Krij in list mei regio's en it oantal meiwurkers yn elke regio
beslút

  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;

Tabel Meiwurkers, ôfdielings, lokaasjes, lannen, regio. Krij detaillearre ynformaasje oer elke meiwurker:
First_name, Last_name, Department, Job, Street, Country, Region
beslút

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

Meiwurkers tabel. Lit alle managers sjen dy't mear as 6 meiwurkers hawwe ûndergeskikt oan harren
beslút

  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;

Meiwurkers tabel. Lit alle meiwurkers sjen dy't har net melde
beslút

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;

Tabel Meiwurkers, Job_history. De Employee tafel bewarret alle meiwurkers. De tabel Job_history bewarret meiwurkers dy't it bedriuw ferlitten hawwe. Krij in rapport oer alle meiwurkers en har status yn it bedriuw (wurket of ferliet it bedriuw mei de datum fan fertrek)
Foarbyld:
foarnamme | status
Jennifer | Ferliet it bedriuw op 31 desimber 2006
Clara | Op it stuit wurket
beslút

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

Tabel Meiwurkers, ôfdielings, lokaasjes, lannen, regio. Krij in list mei meiwurkers dy't yn Europa wenje (regio_namme)
beslút

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

Tabel Meiwurkers, ôfdielings. Lit alle ôfdielingen sjen mei mear as 30 meiwurkers
beslút

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

Tabel Meiwurkers, ôfdielings. Lit alle meiwurkers sjen dy't net yn elke ôfdieling binne
beslút

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;

Tabel Meiwurkers, ôfdielings. Lit alle ôfdielingen sjen wêryn gjin meiwurkers binne
beslút

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

Meiwurkers tabel. Lit alle meiwurkers sjen dy't gjinien ûndergeskikt hawwe oan har
beslút

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

Tabel Meiwurkers, banen, ôfdielings. Lit meiwurkers sjen yn it formaat: First_name, Job_title, Department_name.
Foarbyld:
Foarnamme | Job_title | Department_name
Donald | Skipfeart | Klerk Shipping
beslút

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

Meiwurkers tabel. Krij in list mei meiwurkers waans managers yn 2005 in baan krigen, mar tagelyk krigen dizze meiwurkers sels foar 2005 in baan
beslút

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

Meiwurkers tabel. Krij in list mei meiwurkers waans managers in baan krigen hawwe yn jannewaris fan elk jier en de job_title lingte fan dizze meiwurkers is mear dan 15 karakters
beslút

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;

Subqueries brûke om fragen op te lossen

Meiwurkers tabel. Krij in list mei meiwurkers mei de langste namme.
beslút

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

Meiwurkers tabel. Krij in list mei meiwurkers mei in salaris grutter dan it gemiddelde salaris fan alle meiwurkers.
beslút

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

Meiwurkers, ôfdielings, lokaasjes tabel. Krij de stêd wêryn meiwurkers yn totaal it minste fertsjinje.
beslút

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

Meiwurkers tabel. Krij in list mei meiwurkers waans manager in salaris fan mear as 15000 krijt.
beslút

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

Tabel Meiwurkers, ôfdielings. Lit alle ôfdielingen sjen wêryn gjin meiwurkers binne
beslút

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

Meiwurkers tabel. Lit alle meiwurkers sjen dy't gjin managers binne
beslút

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

Meiwurkers tabel. Lit alle managers sjen dy't mear as 6 meiwurkers hawwe ûndergeskikt oan harren
beslút

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

Tabel Meiwurkers, ôfdielings. Lit meiwurkers sjen dy't wurkje yn 'e IT-ôfdieling
beslút

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

Tabel Meiwurkers, banen, ôfdielings. Lit meiwurkers sjen yn it formaat: First_name, Job_title, Department_name.
Foarbyld:
Foarnamme | Job_title | Department_name
Donald | Skipfeart | Klerk Shipping
beslút

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;

Meiwurkers tabel. Krij in list mei meiwurkers waans managers yn 2005 in baan krigen, mar tagelyk krigen dizze meiwurkers sels foar 2005 in baan
beslút

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

Meiwurkers tabel. Krij in list mei meiwurkers waans managers in baan krigen hawwe yn jannewaris fan elk jier en de job_title lingte fan dizze meiwurkers is mear dan 15 karakters
beslút

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;

Dat is alles foar no.

Ik hoopje dat de taken ynteressant en spannend wiene.
Ik sil safolle mooglik tafoegje oan dizze list mei taken.
Ik sil ek bliid wêze om alle opmerkingen en suggestjes te ûntfangen.

PS: As immen komt mei in nijsgjirrige SELECT taak, skriuw dan yn 'e opmerkingen en ik sil it tafoegje oan' e list.

Спасибо.

Boarne: www.habr.com

Add a comment