SQL. Izklaidējošas mīklas

Sveiks, Habr!

Jau vairāk kā 3 gadus pasniedzu SQL dažādos mācību centros, un viens no maniem novērojumiem ir tas, ka skolēni labāk apgūst un saprot SQL, ja viņiem tiek dots uzdevums, nevis tikai stāsta par iespējām un teorētiskajiem pamatiem.

Šajā rakstā es dalīšos ar jums savu problēmu sarakstu, kuras es uzdodu studentiem kā mājasdarbu un kurās mēs veicam dažāda veida prāta vētras, kas ved uz dziļu un skaidru izpratni par SQL.

SQL. Izklaidējošas mīklas

SQL (ˈɛsˈkjuˈɛl; angļu strukturētā vaicājuma valoda) ir deklaratīva programmēšanas valoda, ko izmanto, lai izveidotu, modificētu un pārvaldītu datus relāciju datu bāzē, ko pārvalda atbilstoša datu bāzes pārvaldības sistēma. Lasīt vairāk…

Jūs varat lasīt par SQL no dažādiem avotiem.
Šis raksts nav paredzēts, lai mācītu jums SQL no nulles.

Tātad, ejam.

Izmantosim labi zināmo HR diagramma Oracle ar tās tabulām (vairāk):

SQL. Izklaidējošas mīklas
Es atzīmēju, ka mēs izskatīsim tikai SELECT uzdevumus. Šeit nav DML vai DDL uzdevumu.

uzdevumi

Datu ierobežošana un kārtošana

Darbinieku galds. Iegūstiet sarakstu ar informāciju par visiem darbiniekiem
Šķīdums

SELECT * FROM employees

Darbinieku galds. Iegūstiet visu darbinieku sarakstu ar nosaukumu "David"
Šķīdums

SELECT *
  FROM employees
 WHERE first_name = 'David';

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru job_id ir vienāds ar “IT_PROG”
Šķīdums

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem no 50. nodaļas (department_id), kuru alga (alga) pārsniedz 4000
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem no 20. un 30. nodaļas (department_id)
Šķīdums

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

Darbinieku galds. Saņemiet visu darbinieku sarakstu, kuru pēdējais burts viņu vārdā ir "a"
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem no 50. un 80. nodaļas (department_id), kuriem ir piemaksa (vērtība ailē Commission_pct nav tukša)
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdos ir vismaz divi burti "n"
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdi ir garāki par 4 burtiem
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru alga ir robežās no 8000 līdz 9000 (ieskaitot)
Šķīdums

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārds satur simbolu "%"
Šķīdums

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

Darbinieku galds. Iegūstiet visu pārvaldnieku ID sarakstu
Šķīdums

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Darbinieku galds. Iegūstiet darbinieku sarakstu ar viņu amatiem šādā formātā: Donald(sh_clerk)
Šķīdums

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

Vienas rindas funkciju izmantošana, lai pielāgotu izvadi

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdi ir garāki par 10 burtiem
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdā ir burts “b” (reģistrjutīgs)
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdos ir vismaz 2 burti “a”
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru alga ir 1000 reizināta
Šķīdums

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

Darbinieku galds. Iegūstiet darbinieka tālruņa numura pirmo 3 ciparu numuru, ja viņa numurs ir šādā formātā: XXX.XXX.XXXX
Šķīdums

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

Nodaļu tabula. Iegūstiet pirmo vārdu no nodaļas nosaukuma tiem, kuru nosaukumā ir vairāk nekā viens vārds
Šķīdums

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

Darbinieku galds. Iegūstiet darbinieku vārdus bez vārda pirmā un pēdējā burta
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārda pēdējais burts ir “m” un kuru vārds ir garāks par 5
Šķīdums

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

Dual tabula. Iegūstiet nākamās piektdienas datumu
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuri uzņēmumā strādājuši vairāk nekā 17 gadus
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru tālruņa numura pēdējais cipars ir nepāra un sastāv no 3 cipariem, kas atdalīti ar punktu
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru darba_id vērtībai pēc zīmes “_” ir vismaz 3 rakstzīmes, bet šī vērtība pēc “_” nav vienāda ar “CLERK”.
Šķīdums

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

Darbinieku galds. Iegūstiet visu darbinieku sarakstu, aizstājot visus “.” PHONE_NUMBER vērtībā uz '-'
Šķīdums

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

Pārvēršanas funkciju un nosacīto izteiksmju izmantošana

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuri ieradās darbā mēneša pirmajā dienā (jebkurā)
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuri ieradās darbā 2008. gadā
Šķīdums

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

Tabula DUAL. Rādīt rītdienas datumu šādā formātā: Rīt ir janvāra otrā diena
Šķīdums

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

Darbinieku galds. Saņemiet visu darbinieku sarakstu un datumu, kad katrs darbinieks ieradās darbā šādā formātā: 21. gada 2007. jūnijs
Šķīdums

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

Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuriem algas palielinātas par 20%. Parādiet algu ar dolāra zīmi
Šķīdums

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

Darbinieku galds. Saņemiet visu darbinieku sarakstu, kuri sāka strādāt 2007. gada februārī.
Šķīdums

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

Tabula DUAL. Parādiet pašreizējo datumu + sekundi, + minūti, + stundu, + dienu, + mēnesi, + gadu
Šķīdums

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;

Darbinieku galds. Iegūstiet visu darbinieku sarakstu ar pilnām algām (alga + komisijas_procenti(%)) šādā formātā: $24,000.00 XNUMX
Šķīdums

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

Darbinieku galds. Saņemiet visu darbinieku sarakstu un informāciju par algu piemaksu pieejamību (Jā/Nē)
Šķīdums

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

Darbinieku galds. Iegūstiet katra darbinieka algas līmeni: mazāks par 5000 tiek uzskatīts par zemu līmeni, lielāks vai vienāds ar 5000 un mazāks par 10000 tiek uzskatīts par normālu līmeni, lielāks vai vienāds ar 10000 tiek uzskatīts par augstu līmeni
Šķīdums

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;

Tabulas valstis. Katrai valstij norādiet reģionu, kurā tā atrodas: 1-Eiropa, 2-Amerika, 3-Āzija, 4-Āfrika (bez pievienošanās)
Šķīdums

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;

Apkopoto datu ziņošana, izmantojot grupas funkcijas

Darbinieku galds. Saņemiet ziņojumu pēc departamenta_id ar minimālo un maksimālo algu, agrajiem un vēlajiem ierašanās datumiem darbā un darbinieku skaitu. Kārtot pēc darbinieku skaita (dilstošā secībā)
Šķīdums

  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;

Darbinieku galds. Cik darbinieku, kuru vārdi sākas ar vienu un to pašu burtu? Kārtot pēc daudzuma. Rādīt tikai tos, kuru daudzums ir lielāks par 1
Šķīdums

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;

Darbinieku galds. Cik darbinieku strādā vienā nodaļā un saņem vienādu algu?
Šķīdums

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

Darbinieku galds. Saņemiet pārskatu par to, cik darbinieku tika pieņemti darbā katrā nedēļas dienā. Kārtot pēc daudzuma
Šķīdums

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

Darbinieku galds. Saņemiet pārskatu par to, cik darbinieku tika pieņemti darbā pa gadiem. Kārtot pēc daudzuma
Šķīdums

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

Darbinieku galds. Iegūstiet to nodaļu skaitu, kurās ir darbinieki
Šķīdums

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

Darbinieku galds. Iegūstiet to departamentu_id sarakstu, kuros ir vairāk nekā 30 darbinieku
Šķīdums

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

Darbinieku galds. Iegūstiet departamentu_ids sarakstu un katras nodaļas darbinieku noapaļoto vidējo algu.
Šķīdums

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

Tabulas valstis. Iegūstiet sarakstu region_id visu valsts_nosaukumu burtu summa, kurā ir vairāk nekā 60
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar departamenta_id, kuros strādā vairāku (>1) job_id darbinieki
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar vadītājiem_id, kuru padoto skaits ir lielāks par 5 un visu viņa padoto algu summa ir lielāka par 50000 XNUMX
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar vadītājiem_id, kuru vidējā alga visiem viņa padotajiem ir robežās no 6000 līdz 9000 un kuri nesaņem prēmijas (komisijas_pct ir tukšs)
Šķīdums

  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;

Darbinieku galds. Saņemiet maksimālo algu no visiem darbiniekiem job_id, kas beidzas ar vārdu "CLERK"
Šķīdums

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

Darbinieku galds. Saņemiet maksimālo algu starp visām departamenta vidējām algām
Šķīdums

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

Darbinieku galds. Iegūstiet darbinieku skaitu, kuru vārdā ir vienāds burtu skaits. Tajā pašā laikā rādīt tikai tos, kuru vārda garums ir lielāks par 5 un darbinieku skaits ar tādu pašu vārdu ir lielāks par 20. Kārtot pēc vārda garuma
Šķīdums

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

Datu parādīšana no vairākām tabulām, izmantojot savienojumus

Galda darbinieki, nodaļas, atrašanās vietas, valstis, reģioni. Iegūstiet reģionu sarakstu un darbinieku skaitu katrā reģionā
Šķīdums

  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;

Galda darbinieki, nodaļas, atrašanās vietas, valstis, reģioni. Iegūstiet detalizētu informāciju par katru darbinieku:
Vārds_vārds, uzvārds, nodaļa, darbs, iela, valsts, reģions
Šķīdums

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

Darbinieku galds. Parādiet visus vadītājus, kuriem ir vairāk nekā 6 darbinieki
Šķīdums

  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;

Darbinieku galds. Parādiet visus darbiniekus, kuri nevienam neatskaitās
Šķīdums

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;

Tabula Darbinieki, Darba_vēsture. Darbinieku tabulā tiek saglabāti visi darbinieki. Tabulā Job_history tiek glabāti darbinieki, kuri pametuši uzņēmumu. Saņemt atskaiti par visiem darbiniekiem un viņu statusu uzņēmumā (Strādā vai atstāja uzņēmumu ar aizbraukšanas datumu)
Piemērs:
vārds_vārds | statusu
Dženifera | Pameta uzņēmumu 31. gada 2006. decembrī
Klāra | Šobrīd Strādā
Šķīdums

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

Galda darbinieki, nodaļas, atrašanās vietas, valstis, reģioni. Saņemiet sarakstu ar darbiniekiem, kuri dzīvo Eiropā (region_name)
Šķīdums

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

Galda darbinieki, nodaļas. Rādīt visas nodaļas ar vairāk nekā 30 darbiniekiem
Šķīdums

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

Galda darbinieki, nodaļas. Parādiet visus darbiniekus, kuri nav nevienā nodaļā
Šķīdums

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;

Galda darbinieki, nodaļas. Rādīt visas nodaļas, kurās nav darbinieku
Šķīdums

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

Darbinieku galds. Parādiet visus darbiniekus, kuriem nav neviena pakļauta
Šķīdums

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

Galda darbinieki, darba vietas, nodaļas. Rādīt darbiniekus šādā formātā: First_name, Job_title, Department_name.
Piemērs:
Vārds | Darba_nosaukums | Nodaļas_nosaukums
Donalds | Piegāde | Piegādes ierēdnis
Šķīdums

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

Darbinieku galds. Iegūstiet sarakstu ar darbiniekiem, kuru vadītāji ieguva darbu 2005. gadā, bet tajā pašā laikā šie darbinieki paši ieguva darbu pirms 2005. gada
Šķīdums

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

Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuru vadītāji ieguva darbu jebkura gada janvārī, un šo darbinieku job_title garums ir vairāk nekā 15 rakstzīmes
Šķīdums

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;

Apakšvaicājumu izmantošana vaicājumu risināšanai

Darbinieku galds. Iegūstiet darbinieku sarakstu ar garāko vārdu.
Šķīdums

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

Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuru alga ir lielāka par visu darbinieku vidējo algu.
Šķīdums

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

Darbinieku, departamentu, atrašanās vietu tabula. Iegūstiet pilsētu, kurā darbinieki kopumā pelna vismazāk.
Šķīdums

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

Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuru vadītājs saņem algu vairāk nekā 15000 XNUMX.
Šķīdums

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

Galda darbinieki, nodaļas. Rādīt visas nodaļas, kurās nav darbinieku
Šķīdums

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

Darbinieku galds. Parādiet visus darbiniekus, kuri nav vadītāji
Šķīdums

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

Darbinieku galds. Parādiet visus vadītājus, kuriem ir vairāk nekā 6 darbinieki
Šķīdums

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

Galda darbinieki, nodaļas. Parādiet darbiniekus, kuri strādā IT nodaļā
Šķīdums

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

Galda darbinieki, darba vietas, nodaļas. Rādīt darbiniekus šādā formātā: First_name, Job_title, Department_name.
Piemērs:
Vārds | Darba_nosaukums | Nodaļas_nosaukums
Donalds | Piegāde | Piegādes ierēdnis
Šķīdums

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;

Darbinieku galds. Iegūstiet sarakstu ar darbiniekiem, kuru vadītāji ieguva darbu 2005. gadā, bet tajā pašā laikā šie darbinieki paši ieguva darbu pirms 2005. gada
Šķīdums

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

Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuru vadītāji ieguva darbu jebkura gada janvārī, un šo darbinieku job_title garums ir vairāk nekā 15 rakstzīmes
Šķīdums

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;

Tas pagaidām ir viss.

Ceru, ka uzdevumi bija interesanti un aizraujoši.
Es papildināšu šo uzdevumu sarakstu, cik vien iespējams.
Priecāšos saņemt arī jebkādus komentārus un ieteikumus.

PS: Ja kāds izdomā kādu interesantu SELECT uzdevumu, rakstiet komentāros un es to pievienošu sarakstam.

Paldies.

Avots: www.habr.com

Pievieno komentāru