SQL. Vermakelijke puzzels

Hallo Habr!

Ik geef al meer dan 3 jaar les in SQL in verschillende trainingscentra, en een van mijn observaties is dat studenten SQL beter beheersen en begrijpen als ze een taak krijgen, en niet alleen praten over de mogelijkheden en theoretische onderbouwingen.

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

SQL. Vermakelijke puzzels

SQL (ΛˆΙ›skjuΛˆΙ›l; eng. Structured Query Language) is een declaratieve programmeertaal die wordt gebruikt voor het maken, wijzigen en beheren van gegevens in een relationele database die wordt beheerd door een geschikt databasebeheersysteem. Meer details ...

U kunt op verschillende manieren over SQL lezen bronnen.
Dit artikel is niet bedoeld om u vanaf het begin SQL te leren.

Dus laten we gaan.

We zullen de bekende gebruiken HR regeling in Oracle met zijn tabellen (Meer):

SQL. Vermakelijke puzzels
Ik merk op dat we alleen taken op SELECT zullen overwegen. Er zijn geen taken op DML en DDL.

taken

Gegevens beperken en sorteren

Medewerkers tafel. Ontvang een lijst met informatie over alle werknemers
beslissing

SELECT * FROM employees

Medewerkers tafel. Krijg een lijst van alle werknemers met de naam 'David'
beslissing

SELECT *
  FROM employees
 WHERE first_name = 'David';

Medewerkers tafel. Krijg een lijst van alle werknemers met job_id gelijk aan 'IT_PROG'
beslissing

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Medewerkers tafel. Krijg een lijst van alle werknemers van de 50e afdeling (department_id) met een salaris (salaris) hoger dan 4000
beslissing

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

Medewerkers tafel. Krijg een lijst van alle medewerkers van de 20e en van de 30e afdeling (department_id)
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers waarvan de laatste letter in hun naam een ​​'a' is
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers van de 50e en van de 80e afdeling (department_id) die een bonus hebben (de waarde in de kolom commission_pct is niet leeg)
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers waarvan de naam minstens 2 letters 'n' bevat
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers waarvan de naam langer is dan 4 letters
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers met een salaris tussen 8000 en 9000 (inclusief)
beslissing

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Medewerkers tafel. Krijg een lijst van alle werknemers waarvan de naam het symbool '%' bevat
beslissing

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

Medewerkers tafel. Krijg een lijst met alle manager-ID's
beslissing

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Medewerkers tafel. Krijg een lijst van werknemers met hun posities in het formaat: Donald(sh_clerk)
beslissing

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

Functies met één rij gebruiken om de uitvoer aan te passen

Medewerkers tafel. Krijg een lijst van alle werknemers waarvan de naam langer is dan 10 letters
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers die de letter 'b' in hun naam hebben (niet hoofdlettergevoelig)
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers waarvan de naam minstens 2 letters 'a' bevat
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers van wie het salaris een veelvoud is van 1000
beslissing

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

Medewerkers tafel. Ontvang het eerste 3-cijferige nummer van het telefoonnummer van de werknemer als zijn nummer de notatie Π₯Π₯Π₯.Π₯Π₯Π₯.Π₯Π₯Π₯Π₯ heeft
beslissing

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

Afdelingen tabel. Haal het eerste woord uit de afdelingsnaam voor degenen met meer dan één woord in de naam
beslissing

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

Medewerkers tafel. Krijg werknemersnamen zonder de eerste en laatste letter in de naam
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers waarvan de laatste letter in de naam gelijk is aan 'm' en de lengte van de naam groter is dan 5
beslissing

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

Dubbele tafel. Ontvang de datum van aanstaande vrijdag
beslissing

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

Medewerkers tafel. Ontvang een lijst van alle werknemers die al meer dan 17 jaar bij het bedrijf werken
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers waarvan het laatste cijfer van het telefoonnummer oneven is en bestaat uit 3 cijfers gescheiden door een punt
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers wiens job_id waarde na het '_' teken minstens 3 karakters heeft, maar deze waarde na de '_' is niet gelijk aan 'CLERK'
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers door alle '.' in de waarde PHONE_NUMBER te vervangen op '-'
beslissing

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

Conversiefuncties en voorwaardelijke uitdrukkingen gebruiken

Medewerkers tafel. Krijg een lijst van alle werknemers die op de eerste dag van de maand (willekeurig) zijn komen werken
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers die in 2008 zijn komen werken
beslissing

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

DUBBELE tafel. Toon de datum van morgen in het formaat: Morgen is de tweede dag van januari
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers en hun startdatum in het formaat: 21 juni 2007
beslissing

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

Medewerkers tafel. Ontvang een lijst met werknemers met een salarisverhoging van 20%. Toon salaris met dollarteken
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers die in februari 2007 zijn komen werken.
beslissing

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

DUBBELE tafel. Exporteer huidige datum, + seconde, + minuut, + uur, + dag, + maand, + jaar
beslissing

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;

Medewerkers tafel. Krijg een lijst van alle werknemers met volledige salarissen (salaris + commissie_pct(%)) in het formaat: $ 24,000.00
beslissing

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

Medewerkers tafel. Krijg een lijst van alle werknemers en informatie over de beschikbaarheid van salarisbonussen (Ja/Nee)
beslissing

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

Medewerkers tafel. Krijg het salarisniveau van elke werknemer: minder dan 5000 wordt beschouwd als laag niveau, groter dan of gelijk aan 5000 en minder dan 10000 wordt beschouwd als normaal niveau, groter dan of gelijk aan 10000 wordt beschouwd als hoog niveau
beslissing

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;

Landen tabel. Toon voor elk land de regio waarin het zich bevindt: 1-Europa, 2-Amerika, 3-AziΓ«, 4-Afrika (zonder Join)
beslissing

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;

Geaggregeerde gegevens rapporteren met behulp van de groepsfuncties

Medewerkers tafel. Krijg een rapport van department_id met minimum en maximum salaris, vroege en late aankomstdata en aantal werknemers. Sorteren op aantal medewerkers (desc)
beslissing

  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;

Medewerkers tafel. Hoeveel werknemers waarvan de naam met dezelfde letter begint? Sorteer op aantal. Toon alleen die waarvan het getal groter is dan 1
beslissing

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;

Medewerkers tafel. Hoeveel werknemers werken op dezelfde afdeling en ontvangen hetzelfde salaris?
beslissing

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

Medewerkers tafel. Ontvang een rapport van het aantal werknemers dat op elke dag van de week is aangenomen. Sorteer op aantal
beslissing

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

Medewerkers tafel. Ontvang een rapport over het aantal werknemers dat per jaar is aangenomen. Sorteer op aantal
beslissing

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

Medewerkers tafel. Krijg het aantal afdelingen dat werknemers heeft
beslissing

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

Medewerkers tafel. Krijg een lijst van department_id met meer dan 30 werknemers
beslissing

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

Medewerkers tafel. Krijg een lijst met department_ids en het afgeronde gemiddelde salaris van werknemers in elke afdeling.
beslissing

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

Landen tabel. Krijg een lijst van region_id som van alle letters van alle country_names waarin meer dan 60
beslissing

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

Medewerkers tafel. Krijg een lijst met department_id waarin medewerkers van meerdere (>1) job_id werken
beslissing

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

Medewerkers tafel. Krijg een lijst van manager_id waarvan het aantal ondergeschikten groter is dan 5 en de som van alle salarissen van zijn ondergeschikten groter is dan 50000
beslissing

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

Medewerkers tafel. Krijg een lijst van manager_id wiens gemiddelde salaris van al zijn ondergeschikten tussen de 6000 en 9000 ligt die geen bonussen ontvangen (commission_pct is leeg)
beslissing

  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;

Medewerkers tafel. Haal het maximale salaris van alle werknemers job_id die eindigt op het woord 'CLERK'
beslissing

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

Medewerkers tafel. Haal het maximale salaris op van alle gemiddelde salarissen voor de afdeling
beslissing

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

Medewerkers tafel. Krijg het aantal werknemers met hetzelfde aantal letters in hun naam. Toon tegelijkertijd alleen degenen wiens naam langer is dan 5 en het aantal werknemers met dezelfde naam is meer dan 20. Sorteer op naamlengte
beslissing

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

Tabel Medewerkers, Afdelingen, Locaties, Landen, Regio's. Krijg een lijst met regio's en het aantal werknemers in elke regio
beslissing

  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 Medewerkers, Afdelingen, Locaties, Landen, Regio's. Krijg gedetailleerde informatie over elke werknemer:
Voornaam, Achternaam, Afdeling, Functie, Straat, Land, Regio
beslissing

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

Medewerkers tafel. Toon alle managers die meer dan 6 medewerkers hebben
beslissing

  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;

Medewerkers tafel. Toon alle medewerkers die aan niemand rapporteren
beslissing

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;

Werknemerstabel, Job_history. In de tabel Werknemer worden alle werknemers opgeslagen. In de tabel Job_history worden werknemers opgeslagen die het bedrijf hebben verlaten. Ontvang een rapport over alle werknemers en hun status in het bedrijf (in dienst of verliet het bedrijf met de datum van vertrek)
Voorbeeld:
voornaam | toestand
Jennifer | Verliet het bedrijf op 31 december 2006
Klara | Momenteel aan het werk
beslissing

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 Medewerkers, Afdelingen, Locaties, Landen, Regio's. Krijg een lijst van werknemers die in Europa wonen (region_name)
beslissing

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

Tafelmedewerkers, Afdelingen. Toon alle afdelingen met meer dan 30 medewerkers
beslissing

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

Tafelmedewerkers, Afdelingen. Toon alle medewerkers die niet op een afdeling zitten
beslissing

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;

Tafelmedewerkers, Afdelingen. Toon alle afdelingen zonder medewerkers
beslissing

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

Medewerkers tafel. Toon alle medewerkers die geen ondergeschikten hebben
beslissing

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

Tafelmedewerkers, Banen, Afdelingen. Toon werknemers in het formaat: First_name, Job_title, Department_name.
Voorbeeld:
voornaam | functietitel | Afdelingsnaam
Donald | verzending | Bediende verzending
beslissing

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

Medewerkers tafel. Krijg een lijst van werknemers waarvan de managers in 2005 een baan kregen, maar tegelijkertijd kregen deze werknemers zelf een baan voor 2005
beslissing

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

Medewerkers tafel. Krijg een lijst van werknemers wiens managers een baan hebben gekregen in de maand januari van een willekeurig jaar en de lengte van de functietitel van deze werknemers is meer dan 15 tekens
beslissing

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;

Subquery's gebruiken om query's op te lossen

Medewerkers tafel. Krijg een lijst met werknemers met de langste naam.
beslissing

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

Medewerkers tafel. Krijg een lijst van werknemers met een salaris dat hoger is dan het gemiddelde salaris van alle werknemers.
beslissing

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

Tabel Medewerkers, Afdelingen, Locaties. Verkrijg de stad waarin werknemers in totaal het minst verdienen.
beslissing

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

Medewerkers tafel. Krijg een lijst van werknemers waarvan de manager een salaris van meer dan 15000 ontvangt.
beslissing

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

Tafelmedewerkers, Afdelingen. Toon alle afdelingen zonder medewerkers
beslissing

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

Medewerkers tafel. Toon alle medewerkers die geen leidinggevende zijn
beslissing

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

Medewerkers tafel. Toon alle managers die meer dan 6 medewerkers hebben
beslissing

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

Tafelmedewerkers, Afdelingen. Laat medewerkers zien die op de IT-afdeling werken
beslissing

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

Tafelmedewerkers, Banen, Afdelingen. Toon werknemers in het formaat: First_name, Job_title, Department_name.
Voorbeeld:
voornaam | functietitel | Afdelingsnaam
Donald | verzending | Bediende verzending
beslissing

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;

Medewerkers tafel. Krijg een lijst van werknemers waarvan de managers in 2005 een baan kregen, maar tegelijkertijd kregen deze werknemers zelf een baan voor 2005
beslissing

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

Medewerkers tafel. Krijg een lijst van werknemers wiens managers een baan hebben gekregen in de maand januari van een willekeurig jaar en de lengte van de functietitel van deze werknemers is meer dan 15 tekens
beslissing

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 het voor nu.

Ik hoop dat de taken interessant en opwindend waren.
Ik zal deze lijst zoveel mogelijk aanvullen.
Ik zal ook blij zijn met eventuele opmerkingen en suggesties.

PS: Als iemand met een interessante taak op SELECT komt, schrijf dan in de comments, ik zal het aan de lijst toevoegen.

Dank u.

Bron: www.habr.com

Voeg een reactie