SQL. Boeiende puzzels

Hallo, Habr!

Al meer dan 3 jaar geef ik SQL-trainingen bij verschillende trainingscentra. Een van mijn observaties is dat studenten SQL beter beheersen en begrijpen als ze taken krijgen, in plaats van alleen informatie over de mogelijkheden en de theoretische basis te horen.

In dit artikel deel ik mijn lijst met taken die ik aan studenten geef als huiswerk en waar we verschillende brainstormsessies over houden, wat leidt tot een diepgaand en duidelijk begrip van SQL.

SQL. Boeiende puzzels

SQL (ĖˆÉ›sˈkjuĖˆÉ›l; Engels: structured query language – 'gestructureerde querytaal') is een declaratieve programmeertaal die wordt gebruikt voor het creĆ«ren, wijzigen en beheren van gegevens in een relationele database, beheerd door een overeenkomstig databasebeheersysteem. Meer informatie…

Je kunt meer over SQL lezen uit verschillende bronnen. bronnen.
Dit artikel heeft niet als doel je SQL vanaf nul te leren.

Laten we beginnen.

We zullen gebruikmaken van de bekende HR-schema in Oracle met zijn tabellen (Meer informatie):

SQL. Boeiende puzzels
Ik wil opmerken dat we alleen SELECT-taken zullen bekijken. Er zijn geen taken voor DML en DDL.

Taken

Data Beperken en Sorteren

Tabel Employees. Verkrijg een lijst met informatie over alle medewerkers.
Oplossing

SELECT * FROM employees

Tabel Employees. Verkrijg een lijst van alle medewerkers met de naam 'David'.
Oplossing

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabel Employees. Verkrijg een lijst van alle medewerkers met job_id gelijk aan 'IT_PROG'.
Oplossing

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabel Employees. Verkrijg een lijst van alle medewerkers van afdeling 50 (department_id) met een salaris (salary) hoger dan 4000.
Oplossing

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

Tabel Employees. Verkrijg een lijst van alle medewerkers van afdeling 20 en afdeling 30 (department_id).
Oplossing

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

Tabel Employees. Verkrijg een lijst van alle medewerkers waarvan de laatste letter van de naam 'a' is.
Oplossing

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

Tabel Employees. Verkrijg een lijst van alle medewerkers van afdeling 50 en afdeling 80 (department_id) die een bonus hebben (waarde in de kolom commission_pct is niet leeg).
Oplossing

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

Tabel Employees. Verkrijg een lijst van alle medewerkers met minimaal 2 letters 'n' in hun naam.
Oplossing

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

Tabel Employees. Verkrijg een lijst van alle medewerkers waarvan de naam langer is dan 4 letters.
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens salaris tussen 8000 en 9000 ligt (inclusief)
Oplossing

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens naam een symbool ā€˜%’ bevat
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van alle ID's van managers
Oplossing

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabel Medewerkers. Verkrijg een lijst van werknemers met hun functies in het formaat: Donald(sh_clerk)
Oplossing

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

Gebruik van Single-Row Functies om Output aan te passen

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens naam langer is dan 10 letters
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens naam de letter ā€˜b’ bevat (zonder hoofdletters)
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens naam minimaal 2 letters ā€˜a’ bevat
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens salaris een veelvoud van 1000 is
Oplossing

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

Tabel Medewerkers. Verkrijg de eerste 3 cijfers van het telefoonnummer van de medewerker als het nummer in het formaat XXX.XXX.XXXX is
Oplossing

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

Tabel Afdelingen. Verkrijg het eerste woord van de naam van de afdeling voor degenen wiens naam meer dan ƩƩn woord bevat
Oplossing

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

Tabel Medewerkers. Verkrijg de namen van medewerkers zonder de eerste en laatste letter van de naam
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens laatste letter in de naam een ā€˜m’ is en die langer zijn dan 5 letters
Oplossing

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

Tabel Dual. Verkrijg de datum van de volgende vrijdag
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers die langer dan 17 jaar in het bedrijf werken
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens laatste cijfer van het telefoonnummer oneven is en bestaat uit 3 cijfers gescheiden door een punt
Oplossing

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

Tabel Werknemers. Verkrijg een lijst van alle werknemers waarvan de waarde van job_id na het teken '_' minimaal 3 karakters heeft, maar deze waarde na '_' is niet gelijk aan 'CLERK'
Oplossing

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

Tabel Werknemers. Verkrijg een lijst van alle werknemers door in de waarde PHONE_NUMBER alle '.' te vervangen door '-'
Oplossing

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

Gebruik Conversiefuncties en Voorwaardelijke Expressies

Tabel Werknemers. Verkrijg een lijst van alle werknemers die op de eerste dag van de maand (om het even welke) zijn begonnen
Oplossing

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

Tabel Werknemers. Verkrijg een lijst van alle werknemers die in 2008 zijn begonnen
Oplossing

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

Tabel DUAL. Toon de datum van morgen in het formaat: Morgen is de tweede dag van januari
Oplossing

SELECT TO_CHAR (SYSDATE, 'fm""Morgen is ""Ddspth ""dag van"" Maand') info
  FROM DUAL;

Tabel Werknemers. Verkrijg een lijst van alle werknemers en de datum waarop ze zijn begonnen in het formaat: 21e van juni 2007
Oplossing

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""van"" Maand, YYYY') hire_date
  FROM employees;

Tabel Werknemers. Verkrijg een lijst van werknemers met verhoogde salarissen met 20%. Toon het salaris met het dollar teken
Oplossing

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

Tabel Werknemers. Verkrijg een lijst van alle werknemers die in februari 2007 zijn begonnen.
Oplossing

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. Toon de actuele datum, + seconde, + minuut, + uur, + dag, + maand, + jaar
Oplossing

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;

Tabel Werknemers. Verkrijg een lijst van alle werknemers met volledige salarissen (salary + commission_pct(%)) in het formaat: $24,000.00
Oplossing

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

Tabel Werknemers. Verkrijg een lijst van alle werknemers en informatie over de aanwezigheid van bonussen bij het salaris (Ja/Nee)
Oplossing

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

Tabel Werknemers. Verkrijg het salarispunt van elke werknemer: Minder dan 5000 wordt als laag niveau beschouwd, 5000 of meer en minder dan 10000 wordt als normaal niveau beschouwd, 10000 of meer wordt als hoog niveau beschouwd
Oplossing

SELECT first_name,
       salary,
       CASE
           WHEN salary = 5000 AND salary < 10000 THEN 'Normaal'
           ELSE 'Hoog'
       END salary_level
  FROM employees;

Tabel Countries. Toon voor elk land de regio waarin het zich bevindt: 1-Europa, 2-Amerika, 3-Aziƫ, 4-Afrika (zonder Join)
Oplossing

SELECT country_name country,
       DECODE (region_id,
               1, 'Europa',
               2, 'Amerika',
               3, 'Aziƫ',
               4, 'Afrika',
               'Onbekend')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Europa'
           WHEN 2 THEN 'Amerika'
           WHEN 3 THEN 'Aziƫ'
           WHEN 4 THEN 'Afrika'
           ELSE 'Onbekend'
       END
           region
  FROM countries;

Rapporteren van Geaggregeerde Gegevens met behulp van Groeperingsfuncties

Tabel Employees. Verkrijg een rapport per department_id met het minimum en maximum salaris, de vroegste en laatste datum van indiensttreding en het aantal medewerkers. Sorteer op het aantal medewerkers (aflopend)
Oplossing

  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. Hoeveel medewerkers hebben een naam die met dezelfde letter begint? Sorteer op aantal. Toon alleen die met een aantal groter dan 1
Oplossing

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. Hoeveel medewerkers werken in dezelfde afdeling en hebben hetzelfde salaris?
Oplossing

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

Tabel Employees. Verkrijg een rapport over hoeveel medewerkers elke dag van de week zijn aangenomen. Sorteer op aantal
Oplossing

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

Tabel Employees. Verkrijg een rapport over hoeveel medewerkers per jaar zijn aangenomen. Sorteer op aantal
Oplossing

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

Tabel Employees. Verkrijg het aantal afdelingen waarin medewerkers zijn.
Oplossing

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

Tabel Employees. Verkrijg een lijst van department_id waarin meer dan 30 medewerkers werken
Oplossing

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

Tabel Employees. Verkrijg een lijst van department_id en het afgeronde gemiddelde salaris van medewerkers in elke afdeling.
Oplossing

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

Tabel Countries. Verkrijg een lijst van region_id en de som van alle letters van country_name waarbij meer dan 60 zijn.
Oplossing

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

Tabel Werknemers. Verkrijg een lijst van department_id's waar werknemers met meerdere (>1) job_id's werken.
Oplossing

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

Tabel Werknemers. Verkrijg een lijst van manager_id's met meer dan 5 ondergeschikten en een totaal salaris van die ondergeschikten hoger dan 50000.
Oplossing

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

Tabel Werknemers. Verkrijg een lijst van manager_id's waarvan het gemiddelde salaris van alle ondergeschikten tussen 6000 en 9000 ligt en die geen bonussen ontvangen (commission_pct is leeg).
Oplossing

  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;

Tabel Werknemers. Verkrijg het maximale salaris van alle medewerkers met een job_id die eindigt op het woord 'CLERK'.
Oplossing

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

Tabel Werknemers. Verkrijg het maximale salaris van alle gemiddelde salarissen per afdeling.
Oplossing

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

Tabel Werknemers. Verkrijg het aantal medewerkers met hetzelfde aantal letters in de naam. Toon alleen diegenen met een naam langer dan 5 en meer dan 20 medewerkers met dezelfde naam. Sorteer op naamlengte.
Oplossing

  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 weergeven van meerdere tabellen met behulp van joins.

Tabel Werknemers, Afdelingen, Locaties, Landen, Regio's. Verkrijg een lijst van regio's en het aantal medewerkers in elke regio.
Oplossing

  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 Werknemers, Afdelingen, Locaties, Landen, Regio's. Verkrijg gedetailleerde informatie over elke medewerker:
Voornaam, Achternaam, Afdeling, Baan, Straat, Land, Regio.
Oplossing

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

Tabel Werknemers. Toon alle managers die meer dan 6 ondergeschikten hebben.
Oplossing

  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;

Tabel Medewerkers. Toon alle medewerkers die aan niemand rapporteren
Oplossing

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 Medewerkers, Job_history. In de tabel Employee worden alle medewerkers opgeslagen. In de tabel Job_history staan medewerkers die het bedrijf hebben verlaten. Verkrijg een rapport over alle medewerkers en hun status in het bedrijf (Werkt nog of heeft het bedrijf verlaten met vertrekdatum)
Voorbeeld:
first_name | status
Jennifer | Heeft het bedrijf verlaten op 31 december 2006
Clara | Huidig werkzaam
Oplossing

SELECT first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Heeft het bedrijf verlaten op"" DD ""van"" Maand, YYYY'),
           'Huidig werkzaam')
           status
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

Tabel Medewerkers, Afdelingen, Locaties, Landen, Regio's. Verkrijg een lijst van medewerkers die in Europa wonen (region_name)
Oplossing

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

Tabel Medewerkers, Afdelingen. Toon alle afdelingen waar meer dan 30 medewerkers werken
Oplossing

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 Medewerkers, Afdelingen. Toon alle medewerkers die in geen enkele afdeling zijn opgenomen
Oplossing

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 Medewerkers, Afdelingen. Toon alle afdelingen zonder enkele medewerker
Oplossing

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

Tabel Medewerkers. Toon alle medewerkers die niemand onder zich hebben
Oplossing

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 Medewerkers, Banen, Afdelingen. Toon medewerkers in het formaat: First_name, Job_title, Department_name.
Voorbeeld:
First_name | Job_title | Department_name
Donald | Verzendafdeling | Verzendmedewerker
Oplossing

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

Tabel Medewerkers. Verkrijg een lijst van medewerkers wiens managers in 2005 zijn aangenomen, terwijl deze medewerkers zelf voor 2005 zijn aangenomen
Oplossing

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

Tabel Employees. Verkrijg een lijst van werknemers wiens managers in januari van elk jaar zijn begonnen en wiens job_title langer is dan 15 tekens.
Oplossing

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 gebruiken om queries op te lossen

Tabel Employees. Verkrijg een lijst van werknemers met de langste naam.
Oplossing

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

Tabel Employees. Verkrijg een lijst van werknemers wiens salaris hoger is dan het gemiddelde salaris van alle werknemers.
Oplossing

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

Tabel Employees, Departments, Locations. Verkrijg de stad waar werknemers gezamenlijk het minste verdienen.
Oplossing

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

Tabel Employees. Verkrijg een lijst van werknemers wiens manager meer dan 15000 verdient.
Oplossing

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

Tabel Medewerkers, Afdelingen. Toon alle afdelingen zonder enkele medewerker
Oplossing

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

Tabel Employees. Toon alle werknemers die geen managers zijn.
Oplossing

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

Tabel Werknemers. Toon alle managers die meer dan 6 ondergeschikten hebben.
Oplossing

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

Tabel Employees, Departaments. Toon werknemers die in de IT-afdeling werken
Oplossing

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

Tabel Medewerkers, Banen, Afdelingen. Toon medewerkers in het formaat: First_name, Job_title, Department_name.
Voorbeeld:
First_name | Job_title | Department_name
Donald | Verzendafdeling | Verzendmedewerker
Oplossing

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;

Tabel Medewerkers. Verkrijg een lijst van medewerkers wiens managers in 2005 zijn aangenomen, terwijl deze medewerkers zelf voor 2005 zijn aangenomen
Oplossing

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

Tabel Employees. Verkrijg een lijst van werknemers wiens managers in januari van elk jaar zijn begonnen en wiens job_title langer is dan 15 tekens.
Oplossing

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 voorlopig alles.

Ik hoop dat de taken interessant en boeiend waren.
Ik zal proberen deze lijst met taken aan te vullen waar mogelijk.
Ik sta ook open voor opmerkingen en suggesties.

P.S.: Als iemand een interessante SELECT-opdracht in gedachten heeft, laat het dan weten in de reacties, ik voeg het toe aan de lijst.

We wachten op je in onze

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster