SQL. Linksmi galvosūkiai

Sveiki, Habr!

Jau daugiau nei 3 metus dėstau SQL įvairiuose mokymo centruose ir vienas iš mano pastebėjimų, kad studentai geriau įsisavina ir supranta SQL, jei duoda užduotį, o ne tik kalba apie galimybes ir teorinius pagrindus.

Šiame straipsnyje pasidalinsiu su jumis savo užduočių, kurias mokiniams duodu kaip namų darbus ir kurių metu atliekame įvairias minčių audras, kurios padeda giliai ir aiškiai suprasti SQL, sąrašą.

SQL. Linksmi galvosūkiai

SQL (ˈɛsˈkjuˈɛl; eng. struktūrinės užklausos kalba) yra deklaratyvi programavimo kalba, naudojama duomenims kurti, modifikuoti ir valdyti reliacinėje duomenų bazėje, valdomoje atitinkamos duomenų bazių valdymo sistemos. Sužinokite daugiau

Apie SQL galite skaityti iš įvairių šaltiniai.
Šis straipsnis nėra skirtas išmokyti jus naudoti SQL nuo nulio.

Taigi, eikime.

Naudosime gerai žinomą HR schema Oracle su jo lentelėmis (Daugiau):

SQL. Linksmi galvosūkiai
Atkreipiu dėmesį, kad mes svarstysime tik SELECT užduotis. DML ir DDL užduočių nėra.

užduotys

Duomenų ribojimas ir rūšiavimas

Darbuotojų stalas. Gaukite sąrašą su informacija apie visus darbuotojus
sprendimas

SELECT * FROM employees

Darbuotojų stalas. Gaukite visų darbuotojų sąrašą pavadinimu „Deividas“
sprendimas

SELECT *
  FROM employees
 WHERE first_name = 'David';

Darbuotojų stalas. Gaukite visų darbuotojų, kurių job_id lygus IT_PROG, sąrašą
sprendimas

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Darbuotojų stalas. Gaukite visų 50-ojo skyriaus darbuotojų sąrašą (department_id), kurių atlyginimas (atlyginimas) didesnis nei 4000
sprendimas

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

Darbuotojų stalas. Gaukite visų 20 ir 30 skyrių darbuotojų sąrašą (department_id)
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurių paskutinė vardo raidė yra „a“
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų iš 50 ir 80 skyrių (department_id), kurie turi premiją (vertė stulpelyje Commission_pct nėra tuščia)
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurių varduose yra bent 2 raidės „n“
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų, kurių vardas ilgesnis nei 4 raidės, sąrašą
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurių atlyginimas yra nuo 8000 iki 9000 (imtinai)
sprendimas

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurių varduose yra simbolis „%“
sprendimas

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

Darbuotojų stalas. Gaukite visų valdytojų ID sąrašą
sprendimas

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Darbuotojų stalas. Gaukite darbuotojų sąrašą su jų pareigomis tokiu formatu: Donald(sh_clerk)
sprendimas

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

Vienos eilutės funkcijų naudojimas išvesties tinkinimui

Darbuotojų stalas. Gaukite visų darbuotojų, kurių vardas ilgesnis nei 10 raidės, sąrašą
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų, kurių varduose yra raidė „b“, sąrašą (didžiosios ir mažosios raidės neskiriamos)
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurių varduose yra bent 2 raidės „a“
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų, kurių atlyginimas yra 1000 kartotinis, sąrašą
sprendimas

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

Darbuotojų stalas. Gaukite pirmąjį 3 skaitmenų darbuotojo telefono numerį, jei jo numeris yra formatu ХХХ.ХХХ.ХХХХ
sprendimas

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

Skyrių lentelė. Gaukite pirmąjį žodį iš skyriaus pavadinimo tiems, kurių pavadinime yra daugiau nei vienas žodis
sprendimas

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

Darbuotojų stalas. Gaukite darbuotojų vardus be pirmosios ir paskutinės vardo raidžių
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurių paskutinė vardo raidė yra lygi „m“ ir vardo ilgis yra didesnis nei 5
sprendimas

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

Dvigubas stalas. Gaukite kito penktadienio datą
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų, kurie įmonėje dirba daugiau nei 17 metų, sąrašą
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurių paskutinis telefono numerio skaitmuo yra nelyginis ir susideda iš 3 skaičių, atskirtų tašku
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurių job_id reikšmė po ženklo „_“ turi mažiausiai 3 simbolius, bet ši reikšmė po „_“ nėra lygi „CLERK“
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų sąrašą pakeisdami visus „.“ PHONE_NUMBER reikšmėje ant '-'
sprendimas

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

Konversijos funkcijų ir sąlyginių išraiškų naudojimas

Darbuotojų stalas. Gaukite sąrašą visų darbuotojų, kurie atėjo į darbą pirmą mėnesio dieną (bet kurią)
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų, kurie atėjo dirbti 2008 m., sąrašą
sprendimas

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

DUAL stalas. Rodyti rytojaus datą tokiu formatu: Rytoj yra antra sausio diena
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų sąrašą ir jų pradžios datą tokiu formatu: 21 m. birželio 2007 d
sprendimas

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

Darbuotojų stalas. Gaukite 20% padidintų darbuotojų sąrašą. Rodyti atlyginimą su dolerio ženklu
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų, kurie atėjo dirbti 2007 m. vasario mėn., sąrašą.
sprendimas

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

DUAL stalas. Eksportuoti dabartinę datą, + sekundę, + minutę, + valandą, + dieną, + mėnesį, + metus
sprendimas

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;

Darbuotojų stalas. Gaukite visų darbuotojų, turinčių visą atlyginimą (atlyginimas + komisiniai_proc.(%)), sąrašą tokiu formatu: 24,000.00 XNUMX USD
sprendimas

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

Darbuotojų stalas. Gaukite visų darbuotojų sąrašą ir informaciją apie priedus prie atlyginimo (taip/ne)
sprendimas

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

Darbuotojų stalas. Gaukite kiekvieno darbuotojo atlyginimo lygį: mažesnis nei 5000 5000 laikomas žemu lygiu, didesnis arba lygus 10000 10000 ir mažesnis nei XNUMX XNUMX laikomas normaliu lygiu, didesnis arba lygus XNUMX XNUMX laikomas aukštu lygiu
sprendimas

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;

Šalių lentelė. Kiekvienai šaliai nurodykite regioną, kuriame ji yra: 1-Europa, 2-Amerika, 3-Azija, 4-Afrika (be prisijungimo)
sprendimas

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;

Suvestinių duomenų teikimas naudojant grupės funkcijas

Darbuotojų stalas. Gaukite departamento id ataskaitą su minimaliu ir maksimaliu atlyginimu, ankstyvo ir vėlyvo atvykimo datomis ir darbuotojų skaičiumi. Rūšiuoti pagal darbuotojų skaičių (mažėjimas)
sprendimas

  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;

Darbuotojų stalas. Kiek darbuotojų, kurių vardai prasideda ta pačia raide? Rūšiuoti pagal kiekį. Rodyti tik tuos, kurių skaičius didesnis nei 1
sprendimas

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;

Darbuotojų stalas. Kiek darbuotojų dirba tame pačiame skyriuje ir gauna vienodą atlyginimą?
sprendimas

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

Darbuotojų stalas. Gaukite ataskaitą, kiek darbuotojų buvo pasamdyta kiekvieną savaitės dieną. Rūšiuoti pagal kiekį
sprendimas

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

Darbuotojų stalas. Gaukite ataskaitą, kiek darbuotojų buvo pasamdyta per metus. Rūšiuoti pagal kiekį
sprendimas

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

Darbuotojų stalas. Gaukite skyrių, kuriuose yra darbuotojų, skaičių
sprendimas

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

Darbuotojų stalas. Gaukite departamento ID sąrašą, kuriame dirba daugiau nei 30 darbuotojų
sprendimas

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

Darbuotojų stalas. Gaukite departamento ID sąrašą ir suapvalintą vidutinį kiekvieno skyriaus darbuotojų atlyginimą.
sprendimas

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

Šalių lentelė. Gaukite visų šalies_pavadinimų, kuriuose yra daugiau nei 60, raidžių sumos region_id sąrašą
sprendimas

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

Darbuotojų stalas. Gaukite departamento_id sąrašą, kuriame dirba kelių (>1) job_id darbuotojai
sprendimas

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

Darbuotojų stalas. Gaukite vadovą_id sąrašą, kurio pavaldinių skaičius yra didesnis nei 5, o visų jo pavaldinių atlyginimų suma yra didesnė nei 50000 XNUMX
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą vadovo_id, kurio vidutinis visų jo pavaldinių atlyginimas yra nuo 6000 iki 9000, kurie negauna priedų (komission_pct tuščia)
sprendimas

  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;

Darbuotojų stalas. Gaukite didžiausią atlyginimą iš visų darbuotojų job_id, kuris baigiasi žodžiu „CLERK“
sprendimas

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

Darbuotojų stalas. Gaukite maksimalų atlyginimą tarp visų skyriaus vidutinių atlyginimų
sprendimas

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

Darbuotojų stalas. Gaukite darbuotojų, kurių varde yra tiek pat raidžių, skaičių. Tuo pačiu rodyti tik tuos, kurių vardas ilgesnis nei 5, o darbuotojų tuo pačiu vardu daugiau nei 20. Rūšiuoti pagal vardo ilgį
sprendimas

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

Duomenų rodymas iš kelių lentelių naudojant sujungimus

Lentelės darbuotojai, skyriai, vietos, šalys, regionai. Gaukite regionų sąrašą ir darbuotojų skaičių kiekviename regione
sprendimas

  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;

Lentelės darbuotojai, skyriai, vietos, šalys, regionai. Gaukite išsamią informaciją apie kiekvieną darbuotoją:
Vardas_vardas, Pavardė, Skyrius, Darbas, Gatvė, Šalis, Regionas
sprendimas

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

Darbuotojų stalas. Rodyti visus vadovus, kurie turi daugiau nei 6 darbuotojus
sprendimas

  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;

Darbuotojų stalas. Rodyti visus darbuotojus, kurie niekam neatsiskaito
sprendimas

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;

Darbuotojų lentelė, Job_history. Darbuotojų lentelėje saugomi visi darbuotojai. Lentelėje Job_history saugomi darbuotojai, kurie paliko įmonę. Gauti ataskaitą apie visus darbuotojus ir jų statusą įmonėje (įdarbintas arba išėjęs iš įmonės su išvykimo data)
Pavyzdys:
vardas_vardas | statusą
jennifer | Iš įmonės išėjo 31 m. gruodžio 2006 d
Klara | Šiuo metu Dirba
sprendimas

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

Lentelės darbuotojai, skyriai, vietos, šalys, regionai. Gaukite Europoje gyvenančių darbuotojų sąrašą (region_name)
sprendimas

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

Stalo darbuotojai, skyriai. Rodyti visus skyrius, kuriuose dirba daugiau nei 30 darbuotojų
sprendimas

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

Stalo darbuotojai, skyriai. Rodyti visus darbuotojus, kurie nėra jokiame skyriuje
sprendimas

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;

Stalo darbuotojai, skyriai. Rodyti visus skyrius, kuriuose nėra darbuotojų
sprendimas

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

Darbuotojų stalas. Rodyti visus darbuotojus, kurie neturi pavaldinių
sprendimas

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

Stalo darbuotojai, darbai, skyriai. Rodyti darbuotojus tokiu formatu: Vardas_vardas, Pareigos_pavadinimas, Skyriaus_pavadinimas.
Pavyzdys:
vardas_vardas | pareigų pavadinimas | Departamento pavadinimas
Donaldas | siuntimas | Siuntimo tarnautojas
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą darbuotojų, kurių vadovai įsidarbino 2005 m., tačiau tuo pačiu metu šie darbuotojai įsidarbino iki 2005 m.
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą darbuotojų, kurių vadovai įsidarbino bet kurių metų sausio mėnesį ir šių darbuotojų pareigų_pavadinimai yra ilgesni nei 15 simbolių
sprendimas

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;

Papildomų užklausų naudojimas užklausoms spręsti

Darbuotojų stalas. Gaukite darbuotojų sąrašą ilgiausiu vardu.
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą darbuotojų, kurių atlyginimas didesnis nei vidutinis visų darbuotojų atlyginimas.
sprendimas

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

Stalo darbuotojai, skyriai, vietos. Gaukite miestą, kuriame darbuotojai iš viso uždirba mažiausiai.
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą darbuotojų, kurių vadovas gauna didesnį nei 15000 tūkst.
sprendimas

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

Stalo darbuotojai, skyriai. Rodyti visus skyrius, kuriuose nėra darbuotojų
sprendimas

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

Darbuotojų stalas. Rodyti visus darbuotojus, kurie nėra vadovai
sprendimas

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

Darbuotojų stalas. Rodyti visus vadovus, kurie turi daugiau nei 6 darbuotojus
sprendimas

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

Stalo darbuotojai, skyriai. Parodykite darbuotojus, kurie dirba IT skyriuje
sprendimas

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

Stalo darbuotojai, darbai, skyriai. Rodyti darbuotojus tokiu formatu: Vardas_vardas, Pareigos_pavadinimas, Skyriaus_pavadinimas.
Pavyzdys:
vardas_vardas | pareigų pavadinimas | Departamento pavadinimas
Donaldas | siuntimas | Siuntimo tarnautojas
sprendimas

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;

Darbuotojų stalas. Gaukite sąrašą darbuotojų, kurių vadovai įsidarbino 2005 m., tačiau tuo pačiu metu šie darbuotojai įsidarbino iki 2005 m.
sprendimas

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

Darbuotojų stalas. Gaukite sąrašą darbuotojų, kurių vadovai įsidarbino bet kurių metų sausio mėnesį ir šių darbuotojų pareigų_pavadinimai yra ilgesni nei 15 simbolių
sprendimas

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;

Tai kol kas viskas.

Tikiuosi, kad užduotys buvo įdomios ir įdomios.
Papildysiu šį sąrašą kiek įmanoma.
Taip pat bus malonu gauti bet kokias pastabas ir pasiūlymus.

PS: Jei kas nors sugalvos įdomią užduotį SELECT, rašykite komentaruose, įtrauksiu į sąrašą.

Ačiū.

Šaltinis: www.habr.com

Добавить комментарий