SQL. Underholdende opgaver

Hej, Habr!

I over 3 år har jeg undervist i SQL på forskellige træningscentre, og en af mine observationer er, at studerende tilegner sig og forstår SQL bedre, når de får stillet opgaver, i stedet for blot at høre om mulighederne og de teoretiske grundlag.

I denne artikel vil jeg dele min liste over opgaver, som jeg giver til studerende som hjemmearbejde, og som vi laver forskellige former for brainstorming ud fra, hvilket fører til en dyb og klar forståelse af SQL.

SQL. Underholdende opgaver

SQL (ˈɛsˈkjuˈɛl; eng. structured query language – 'strukturert forespørgselssprog') – er et deklarativt programmeringssprog, der anvendes til at oprette, ændre og administrere data i en relationsdatabase, der styres af et passende databasehåndteringssystem. Læs mere…

Du kan finde information om SQL fra forskellige kilder.
Denne artikel har ikke til hensigt at lære dig SQL fra bunden.

Så lad os komme i gang.

Vi vil benytte den velkendte HR-skema i Oracle med dens tabeller (Mere information):

SQL. Underholdende opgaver
Jeg vil bemærke, at vi kun vil se på opgaver om SELECT. Her er der ikke opgaver om DML og DDL.

Opgaver

Begrænsning og sortering af data

Tabel Employees. Få en liste med information om alle ansatte
Løsning

SELECT * FROM employees

Tabel Employees. Få en liste over alle ansatte med navnet 'David'
Løsning

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabel Employees. Få en liste over alle ansatte med job_id lig med 'IT_PROG'
Løsning

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabel Employees. Få en liste over alle ansatte fra afdeling 50 (department_id) med løn (salary) over 4000
Løsning

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

Tabel Employees. Få en liste over alle ansatte fra 20. og 30. afdeling (department_id)
Løsning

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

Tabel Employees. Få en liste over alle ansatte, hvis sidste bogstav i navnet er 'a'
Løsning

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

Tabel Employees. Få en liste over alle ansatte fra afdeling 50 og afdeling 80 (department_id), som har en bonus (værdien i kolonnen commission_pct er ikke tom)
Løsning

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

Tabel Employees. Få en liste over alle ansatte, hvis navn indeholder mindst 2 bogstaver 'n'
Løsning

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

Tabel Employees. Få en liste over alle ansatte, hvis navn er længere end 4 bogstaver
Løsning

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

Tabel over ansatte. Hent en liste over alle ansatte, hvis løn ligger mellem 8000 og 9000 (inklusive)
Løsning

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabel over ansatte. Hent en liste over alle ansatte, hvis navn indeholder tegnet ‘%’
Løsning

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

Tabel over ansatte. Hent en liste over alle ID'er for ledere
Løsning

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabel over ansatte. Hent en liste over medarbejdere med deres stillinger i formatet: Donald(sh_clerk)
Løsning

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

Brug af enkelt-række funktioner til at tilpasse output

Tabel over ansatte. Hent en liste over alle ansatte, hvis navn er længere end 10 bogstaver
Løsning

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

Tabel over ansatte. Hent en liste over alle ansatte, hvis navn indeholder bogstavet ‘b’ (uanset store eller små bogstaver)
Løsning

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

Tabel over ansatte. Hent en liste over alle ansatte, hvis navn indeholder mindst 2 bogstaver ‘a’
Løsning

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

Tabel over ansatte. Hent en liste over alle ansatte, hvis løn er delelig med 1000
Løsning

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

Tabel over ansatte. Hent det første 3-cifrede nummer fra medarbejderens telefonnummer, hvis nummeret er i formatet XXX.XXX.XXXX
Løsning

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

Tabel over afdelinger. Hent det første ord fra afdelingens navn for dem, der har mere end ét ord i navnet
Løsning

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

Tabel over ansatte. Hent medarbejdernes navne uden den første og sidste bogstav i navnet
Løsning

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

Tabel over ansatte. Hent en liste over alle ansatte, hvis sidste bogstav i navnet er ‘m’ og navnet er længere end 5
Løsning

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

Tabel over Dual. Hent datoen for næste fredag
Løsning

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

Tabel over ansatte. Hent en liste over alle ansatte, der har arbejdet i virksomheden i mere end 17 år
Løsning

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

Tabel over ansatte. Hent en liste over alle ansatte, hvis sidste cifre i telefonnummeret er ulige og består af 3 cifre adskilt af prikker
Løsning

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

Tabel Employees. Hent listen over alle medarbejdere, hvor værdien af job_id efter tegnet '_' har mindst 3 tegn, men dette værdien efter '_' ikke er lig med 'CLERK'
Løsning

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

Tabel Employees. Hent listen over alle medarbejdere ved at erstatte alle '.' i PHONE_NUMBER med '-'
Løsning

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

Brug af konverteringsfunktioner og betingede udtryk

Tabel Employees. Hent listen over alle medarbejdere, der startede den første dag i en måned (enhver måned)
Løsning

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

Tabel Employees. Hent listen over alle medarbejdere, der startede i 2008
Løsning

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

Tabel DUAL. Vis i morgen dato i format: Tomorrow is Second day of January
Løsning

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

Tabel Employees. Hent listen over alle medarbejdere og datoen for hver ansættelse i formatet: 21st of June, 2007
Løsning

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

Tabel Employees. Hent listen over medarbejdere med lønstigninger på 20%. Vis lønnen med dollar tegn
Løsning

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

Tabel Employees. Hent listen over alle medarbejdere, der startede i februar 2007.
Løsning

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. Vis den aktuelle dato, + sekund, + minut, + time, + dag, + måned, + år
Løsning

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 Employees. Hent listen over alle medarbejdere med totale lønninger (salary + commission_pct(%)) i formatet: $24,000.00
Løsning

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

Tabel Employees. Hent listen over alle medarbejdere og information om tilstedeværelsen af lønbonusser (Ja/Nej)
Løsning

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

Tabel Employees. Hent niveauet for hver medarbejders løn: Under 5000 betragtes som lavt niveau, Lige med eller over 5000 og under 10000 betragtes som normalt niveau, Lige med eller over 10000 betragtes som højt niveau
Løsning

SELECT first_name,
       salary,
       CASE
           WHEN salary = 5000 AND salary < 10000 THEN 'Normal'
           ELSE 'Høj'
       END salary_level
  FROM employees;

Tabel Countries. Vis regionen for hvert land: 1-Europe, 2-America, 3-Asia, 4-Africa (uden Join)
Løsning

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

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

Rapportering af aggregerede data ved brug af gruppefunktioner

Tabel Employees. Få en rapport over department_id med minimum og maksimum løn, tidlig og sen ansættelsesdato samt antallet af medarbejdere. Sorter efter antallet af medarbejdere (i faldende rækkefølge)
Løsning

  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. Hvor mange medarbejdere har navne der starter med samme bogstav? Sorter efter antal. Vis kun dem hvor antallet er større end 1
Løsning

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. Hvor mange medarbejdere arbejder i samme afdeling og får samme løn?
Løsning

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

Tabel Employees. Få en rapport om hvor mange medarbejdere der blev ansat på hver ugedag. Sorter efter antal
Løsning

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

Tabel Employees. Få en rapport om hvor mange medarbejdere der blev ansat hvert år. Sorter efter antal
Løsning

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

Tabel Employees. Få antallet af afdelinger med medarbejdere
Løsning

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

Tabel Employees. Få en liste over department_id med mere end 30 medarbejdere
Løsning

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

Tabel Employees. Få en liste over department_id og den afrundede gennemsnitlige løn for medarbejdere i hver afdeling.
Løsning

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

Tabel Countries. Få en liste over region_id med summen af alle tegn i country_name hvor der er mere end 60
Løsning

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

Tabel Employees. Hent listen over department_id, hvor medarbejdere arbejder med flere (>1) job_id
Løsning

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

Tabel Employees. Hent listen over manager_id, der har flere end 5 underordnede, og summen af alle lønninger for hans underordnede er over 50000
Løsning

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

Tabel Employees. Hent listen over manager_id, hvor den gennemsnitlige løn for alle hans underordnede ligger mellem 6000 og 9000, og som ikke modtager bonusser (commission_pct er tom)
Løsning

  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 Employees. Hent den højeste løn blandt alle medarbejdere, hvor job_id slutter med ordet ‘CLERK’
Løsning

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 Employees. Hent den højeste løn blandt alle gennemsnitlige lønninger pr. afdeling
Løsning

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

Tabel Employees. Hent antallet af medarbejdere med samme antal bogstaver i navnet. Vis kun dem, hvis længde af navnet er over 5 og antallet af medarbejdere med dette navn er over 20. Sorter efter længden af navnet
Løsning

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

Visning af data fra flere tabeller ved hjælp af joins

Tabel Employees, Departaments, Locations, Countries, Regions. Hent listen over regioner og antallet af medarbejdere i hver region
Løsning

  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 Employees, Departaments, Locations, Countries, Regions. Hent detaljerede oplysninger om hver medarbejder:
First_name, Last_name, Departament, Job, Street, Country, Region
Løsning

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 Employees. Vis alle ledere, der har flere end 6 medarbejdere under dem
Løsning

  VÆLG man.first_name, COUNT (*)
    FRA ansatte emp JOIN ansatte man ON (emp.manager_id = man.employee_id)
GRUPPER EFTER man.first_name
  HAVING COUNT (*) > 6;

Tabel Ansatte. Vis alle medarbejdere, der ikke rapporterer til nogen.
Løsning

VÆLG emp.first_name
  FRA ansatte emp
       VENSTRE JOIN ansatte man ON (emp.manager_id = man.employee_id)
 HVOR man.FIRST_NAME ER NULL;

VÆLG first_name
  FRA ansatte
 HVOR manager_id ER NULL;

Tabel Ansatte, Jobhistorik. I tabellen Ansatte gemmes alle medarbejdere. I tabellen Jobhistorik opbevares medarbejdere, der har forladt virksomheden. Få en rapport om alle medarbejdere og deres status i virksomheden (Ansat eller forladt med fratrædelsesdato).
Eksempel:
first_name | status
Jennifer | Forlod virksomheden den 31. december 2006
Clara | Arbejder for tiden
Løsning

VÆLG first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Forlod virksomheden den"" DD ""i"" Måned, YYYY'),
           'Arbejde i øjeblikket')
           status
  FRA ansatte e VENSTRE JOIN job_history j ON (e.employee_id = j.employee_id);

Tabel Ansatte, Afdelinger, Lokationer, Lande, Regioner. Få en liste over medarbejdere, der bor i Europa (region_name).
Løsning

 VÆLG first_name
  FRA ansatte
       JOIN afdelinger USING (department_id)
       JOIN lokationer USING (location_id)
       JOIN lande USING (country_id)
       JOIN regioner USING (region_id)
 HVOR region_name = 'Europa';
 
 VÆLG first_name
  FRA ansatte e
       JOIN afdelinger d ON (e.department_id = d.department_id)
       JOIN lokationer l ON (d.location_id = l.location_id)
       JOIN lande c ON (l.country_id = c.country_id)
       JOIN regioner r ON (c.region_id = r.region_id)
 HVOR region_name = 'Europa';

Tabel Ansatte, Afdelinger. Vis alle afdelinger, hvor der arbejder mere end 30 medarbejdere.
Løsning

VÆLG department_name, COUNT (*)
    FRA ansatte e JOIN afdelinger d ON (e.department_id = d.department_id)
GRUPPER EFTER department_name
  HAVING COUNT (*) > 30;

Tabel Ansatte, Afdelinger. Vis alle medarbejdere, der ikke er tilknyttet nogen afdeling.
Løsning

VÆLG first_name
  FRA ansatte e
       VENSTRE JOIN afdelinger d ON (e.department_id = d.department_id)
 HVOR d.department_name ER NULL;

VÆLG first_name
  FRA ansatte
 HVOR department_id ER NULL;

Tabel Ansatte, Afdelinger. Vis alle afdelinger, hvor der ikke er nogen medarbejdere.
Løsning

VÆLG department_name
  FRA ansatte e
       HØJRE JOIN afdelinger d ON (e.department_id = d.department_id)
 HVOR first_name ER NULL;

Tabel Ansatte. Vis alle medarbejdere, der ikke har nogen underordnede.
Løsning

VÆLG man.first_name
  FRA ansatte emp
       HØJRE JOIN ansatte man ON (emp.manager_id = man.employee_id)
 HVOR emp.FIRST_NAME ER NULL;

Tabel Ansatte, Jobs, Afdelinger. Vis medarbejdere i formatet: First_name, Job_title, Department_name.
Eksempel:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Løsning

VÆLG first_name, job_title, department_name
  FRA ansatte e
       JOIN jobs j ON (e.job_id = j.job_id)
       JOIN afdelinger d ON (d.department_id = e.department_id);

Tabel Ansatte. Få en liste over medarbejdere, hvis ledere blev ansat i 2005, men som selv blev ansat før 2005.
Løsning

VÆLG emp.*
  FRA ansatte emp JOIN ansatte man ON (emp.manager_id = man.employee_id)
 HVOR TO_CHAR (man.hire_date, 'YYYY') = '2005'
       OG emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabel for Ansatte. Få en liste over ansatte, hvis ledere blev ansat i januar måned i et hvilket som helst år, og længden af jobtitlen for disse ansatte er over 15 tegn.
Løsning

VÆLG emp.*
  FRA ansatte emp
       JOIN ansatte man ON (emp.manager_id = man.employee_id)
       JOIN jobs j ON (emp.job_id = j.job_id)
 HVOR TO_CHAR (man.hire_date, 'MM') = '01' OG LENGTH (j.job_title) > 15;

Brug af underforespørgsler til at løse forespørgsler

Tabel for Ansatte. Få en liste over ansatte med det længste navn.
Løsning

VÆLG *
  FRA ansatte
 HVOR LENGTH (first_name) =
       (VÆLG MAX (LENGTH (first_name)) FRA ansatte);

Tabel for Ansatte. Få en liste over ansatte med en løn højere end den gennemsnitlige løn for alle ansatte.
Løsning

VÆLG *
  FRA ansatte
 HVOR salary > (VÆLG AVG (salary) FRA ansatte);

Tabel for Ansatte, Afdelinger, Lokationer. Få byen, hvor de ansatte samlet set tjener mindst.
Løsning

VÆLG city
    FRA ansatte e
         JOIN afdelinger d ON (e.department_id = d.department_id)
         JOIN lokationer l ON (d.location_id = l.location_id)
GRUPPER EFTER city
  HAVING SUM (salary) =
         (  VÆLG MIN (SUM (salary))
              FRA ansatte e
                   JOIN afdelinger d ON (e.department_id = d.department_id)
                   JOIN lokationer l ON (d.location_id = l.location_id)
          GRUPPER EFTER city);

Tabel for Ansatte. Få en liste over ansatte, hvis leder tjener mere end 15000.
Løsning

VÆLG *
  FRA ansatte
 HVOR manager_id IN (VÆLG employee_id
                        FRA ansatte
                       HVOR salary > 15000)

Tabel Ansatte, Afdelinger. Vis alle afdelinger, hvor der ikke er nogen medarbejdere.
Løsning

VÆLG *
  FRA afdelinger
 HVOR department_id NOT IN (VÆLG department_id
                               FRA ansatte
                              HVOR department_id IS NOT NULL);

Tabel for Ansatte. Vis alle ansatte, som ikke er ledere.
Løsning

VÆLG *
  FRA ansatte
 HVOR employee_id NOT IN (VÆLG manager_id
                             FRA ansatte
                            HVOR manager_id IS NOT NULL)

Tabel Employees. Vis alle ledere, der har flere end 6 medarbejdere under dem
Løsning

VÆLG *
  FRA ansatte e
 HVOR (VÆLG COUNT (*)
          FRA ansatte
         HVOR manager_id = e.employee_id) > 6;

Tabel for Ansatte, Afdelinger. Vis ansatte, der arbejder i IT-afdelingen.
Løsning

VÆLG *
  FRA ansatte
 HVOR department_id = (VÆLG department_id
                          FRA afdelinger
                         HVOR department_name = 'IT');

Tabel Ansatte, Jobs, Afdelinger. Vis medarbejdere i formatet: First_name, Job_title, Department_name.
Eksempel:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Løsning

VÆLG first_name,
       (VÆLG job_title
          FRA jobs
         HVOR job_id = e.job_id)
           job_title,
       (VÆLG department_name
          FRA afdelinger
         HVOR department_id = e.department_id)
           department_name
  FRA ansatte e;

Tabel Ansatte. Få en liste over medarbejdere, hvis ledere blev ansat i 2005, men som selv blev ansat før 2005.
Løsning

VÆLG *
  FRA ansatte
 HVOR     manager_id IN (VÆLG employee_id
                            FRA ansatte
                           HVOR TO_CHAR (hire_date, 'YYYY') = '2005')
       OG hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabel for Ansatte. Få en liste over ansatte, hvis ledere blev ansat i januar måned i et hvilket som helst år, og længden af jobtitlen for disse ansatte er over 15 tegn.
Løsning

VÆLG *
  FRA ansatte e
 HVOR     manager_id IN (VÆLG employee_id
                            FRA ansatte
                           HVOR TO_CHAR (hire_date, 'MM') = '01')
       OG (VÆLG LENGTH (job_title)
              FRA jobs
             HVOR job_id = e.job_id) > 15;

Det er alt for nu.

Jeg håber, opgaverne var interessante og underholdende.
Jeg vil så vidt muligt opdatere denne liste med opgaver.
Jeg er også åben for eventuelle kommentarer og forslag.

P.S.: Hvis nogen får en interessant opgave til SELECT, så skriv i kommentarer, så tilføjer jeg den til listen.

Tak.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster