SQL. Engaging tasks

Zdravo, Habr!

Već više od 3 godine predajem SQL u različitim trening centrima, a jedno od mojih zapažanja je da studenti bolje savladaju i razumeju SQL kada im postavimo zadatak, a ne kada im samo pričamo o mogućnostima i teorijskim osnovama.

U ovom članku ću podeliti sa vama svoj spisak zadataka koje dajem studentima kao domaći zadatak i o kojima vršimo različite brainstorming sesije, što dovodi do dubokog i jasnog razumevanja SQL-a.

SQL. Engaging tasks

SQL (ˈɛsˈkjuˈɛl; eng. structured query language — „jezik strukturiranih upita“) — deklarativni programski jezik, koji se koristi za kreiranje, modifikaciju i upravljanje podacima u relacijskim bazama podataka, kojima upravlja odgovarajući sistem za upravljanje bazama podataka. Več…

O SQL-u se može čitati na različite virov.
Ovaj članak nije usmeren na to da vas nauči SQL od nule.

Izogibajte se na kilometrsko oddaljenosti državnim in pol državnim podjetjem ter podobnim ustanovam.

Koristićemo svima poznatu HR šemu u Oracle-u sa njenim tabelama (Več informacij):

SQL. Engaging tasks
Napominjem da ćemo razmatrati samo zadatke na SELECT. Ovdje nema zadataka na DML i DDL.

Zadaci

Ograničavanje i sortiranje podataka

Tabela Employees. Dobiti spisak sa informacijama o svim zaposlenima
Solution

SELECT * FROM employees

Tabela Employees. Dobiti spisak svih zaposlenih sa imenom 'David'
Solution

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabela Employees. Dobiti spisak svih zaposlenih čiji je job_id 'IT_PROG'
Solution

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabela Employees. Dobiti spisak svih zaposlenih iz 50. odeljenja (department_id) sa platom (salary) većom od 4000
Solution

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

Tabela Employees. Dobiti spisak svih zaposlenih iz 20. i 30. odeljenja (department_id)
Solution

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

Tabela Employees. Dobiti spisak svih zaposlenih čija poslednja slova u imenu su 'a'
Solution

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

Tabela Employees. Dobiti spisak svih zaposlenih iz 50. i 80. odeljenja (department_id) koji imaju bonus (vrednost u koloni commission_pct nije prazna)
Solution

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

Tabela Employees. Dobiti spisak svih zaposlenih čije ime sadrži minimum 2 slova 'n'
Solution

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

Tabela Employees. Dobiti spisak svih zaposlenih čije ime ima više od 4 slova
Solution

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

Tabela Employees. Dobiti spisak svih zaposlenih čija plata se kreće između 8000 i 9000 (uključivo)
Solution

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabela Employees. Pridobite seznam vseh zaposlenih, katerih ime vsebuje simbol ‘%’
Solution

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

Tabela Employees. Pridobite seznam vseh ID-jev managerjev
Solution

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabela Employees. Pridobite seznam delavcev s pozicijami v formatu: Donald(sh_clerk)
Solution

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

Uporaba enovrstičnih funkcij za prilagoditev izhoda

Tabela Employees. Pridobite seznam vseh zaposlenih, katerih dolžina imena je večja od 10 črk
Solution

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

Tabela Employees. Pridobite seznam vseh zaposlenih, katerih ime vsebuje črko ‘b’ (neobčutno za velike/majhne črke)
Solution

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

Tabela Employees. Pridobite seznam vseh zaposlenih, katerih ime vsebuje vsaj 2 črki ‘a’
Solution

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

Tabela Employees. Pridobite seznam vseh zaposlenih, katerih plača je deljiva z 1000
Solution

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

Tabela Employees. Pridobite prvih 3 številke telefonske številke zaposlenega, če je njegov številka v formatu XXX.XXX.XXXX
Solution

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

Tabela Departments. Pridobite prvo besedo iz imena oddelka za tiste, katerih ime vsebuje več kot eno besedo
Solution

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

Tabela Employees. Pridobite imena zaposlenih brez prve in zadnje črke v imenu
Solution

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

Tabela Employees. Pridobite seznam vseh zaposlenih, katerih zadnja črka v imenu je ‘m’ in dolžina imena je večja od 5
Solution

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

Tabela Dual. Pridobite datum naslednjega petka
Solution

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

Tabela Employees. Pridobite seznam vseh zaposlenih, ki delajo v podjetju več kot 17 let
Solution

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

Tabela Employees. Pridobite seznam vseh zaposlenih, katerih zadnja cifra telefonske številke je liha in je sestavljena iz 3 številk, ločenih s piko
Solution

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

Tabela Employees. Pridobite seznam vseh zaposlenih, katerih vrednost job_id po znaku ‘_’ vsebuje vsaj 3 simbole, vendar ta vrednost po ‘_’ ni ‘CLERK’
Solution

IZABERITE *
  IZ zaposlenici
 GDE     DUŽINA (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       I SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Tabela Zaposlenici. Prikazati spisak svih zaposlenih menjajući u vrednosti PHONE_NUMBER sve ‘.’ u ‘-‘
Solution

IZABERITE telefon_broj, ZAMENITI (telefon_broj, '.', '-') novi_telefon_broj
  IZ zaposlenici;

Korišćenje funkcija konverzije i uslovnih izraza

Tabela Zaposlenici. Prikazati spisak svih zaposlenih koji su počeli da rade prvog dana meseca (bilo kog)
Solution

IZABERITE *
  IZ zaposlenici
 GDE TO_CHAR (datum_zapošljavanja, 'DD') = '01';

Tabela Zaposlenici. Prikazati spisak svih zaposlenih koji su počeli da rade 2008. godine
Solution

IZABERITE *
  IZ zaposlenici
 GDE TO_CHAR (datum_zapošljavanja, 'YYYY') = '2008';

Tabela DUAL. Prikazati sutrašnji datum u formatu: Sutra je Drugi dan Januara
Solution

IZABERITE TO_CHAR (SYSDATE, 'fm""Sutra je ""Ddspth ""dan od"" Mesec')     info
  IZ DUAL;

Tabela Zaposlenici. Prikazati spisak svih zaposlenih i datum početka rada svakog u formatu: 21. jun 2007.
Solution

IZABERITE ime, TO_CHAR (datum_zapošljavanja, 'fmddth ""od"" Mesec, YYYY') datum_zapošljavanja
  IZ zaposlenici;

Tabela Zaposlenici. Prikazati spisak zaposlenih sa povećanjem plata od 20%. Platu prikazati sa znakom dolara
Solution

IZABERITE ime, TO_CHAR (plata + plata * 0.20, 'fm$999,999.00') nova_plata
  IZ zaposlenici;

Tabela Zaposlenici. Prikazati spisak svih zaposlenih koji su počeli da rade u februaru 2007. godine.
Solution

IZABERITE *
  IZ zaposlenici
 GDE datum_zapošljavanja BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')
                     I POSLEDNJI_DAN (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));

IZABERITE *
  IZ zaposlenici
 GDE to_char(datum_zapošljavanja,'MM.YYYY') = '02.2007'; 

Tabela DUAL. Prikazati trenutni datum, + sekunda, + minuta, + sat, + dan, + mesec, + godina
Solution

IZABERITE SYSDATE                          sada,
       SYSDATE + 1 / (24 * 60 * 60)     plus_sekunda,
       SYSDATE + 1 / (24 * 60)          plus_minuta,
       SYSDATE + 1 / 24                 plus_sati,
       SYSDATE + 1                      plus_dan,
       ADD_MONTHS (SYSDATE, 1)          plus_mesec,
       ADD_MONTHS (SYSDATE, 12)         plus_godina
  IZ DUAL;

Tabela Zaposlenici. Prikazati spisak svih zaposlenih sa ukupnim platama (plata + commission_pct(%)) u formatu: $24,000.00
Solution

IZABERITE ime, plata, TO_CHAR (plata + plata * NVL (commission_pct, 0), 'fm$99,999.00') puna_plata
  IZ zaposlenici;

Tabela Zaposlenici. Prikazati spisak svih zaposlenih i informaciju o prisutnosti bonusa na platu (Da/Ne)
Solution

IZABERITE ime, commission_pct, NVL2 (commission_pct, 'Da', 'Ne') ima_bonus
  IZ zaposlenici;

Tabela Zaposlenici. Prikazati nivo plate svakog zaposlenog: Manje od 5000 smatra se Niskim nivoom, Veće ili jednako 5000 i manje od 10000 smatra se Normalnim nivoom, Veće ili jednako 10000 smatra se Visokim nivoom
Solution

IZABERITE ime,
       plata,
       SLUČAJ
           KADA plata = 5000 I plata < 10000 THEN 'Normalan'
           DRUGA 'Visok'
       KRAJ nivo_plate
  IZ zaposlenici;

Tabela Države. Za svaku zemlju prikazati region u kojem se nalazi: 1-Evropa, 2-Amerika, 3-Asija, 4-Afrika (bez Join)
Solution

SELECT country_name country,
       DECODE (region_id,
               1, 'Eвропа',
               2, 'Америка',
               3, 'Азия',
               4, 'Африка',
               'Неизвестно')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Eвропа'
           WHEN 2 THEN 'Америка'
           WHEN 3 THEN 'Азия'
           WHEN 4 THEN 'Африка'
           ELSE 'Неизвестно'
       END
           region
  FROM countries;

Отчет агрегированных данных, используя групповые функции

Таблица Сотрудники. Получить отчет по department_id с минимальной и максимальной зарплатой, с ранней и поздней датой приема на работу и с количеством сотрудников. Сортировать по количеству сотрудников (по убыванию)
Solution

  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;

Таблица Сотрудники. Сколько сотрудников, имена которых начинаются с одной и той же буквы? Сортировать по количеству. Показывать только те, где количество больше 1
Solution

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;

Таблица Сотрудники. Сколько сотрудников, которые работают в одном и том же отделе и получают одинаковую зарплату?
Solution

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

Таблица Сотрудники. Получить отчет сколько сотрудников приняли на работу в каждый день недели. Сортировать по количеству
Solution

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

Таблица Сотрудники. Получить отчет сколько сотрудников приняли на работу по годам. Сортировать по количеству
Solution

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

Таблица Сотрудники. Получить количество департаментов, в которых есть сотрудники
Solution

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

Таблица Сотрудники. Получить список department_id, в которых работают больше 30 сотрудников
Solution

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

Таблица Сотрудники. Получить список department_id и округленную среднюю зарплату работников в каждом департаменте.
Solution

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

Таблица Страны. Получить список region_id, сумма всех букв всех country_name, в которых больше 60-ти
Solution

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

Таблица Сотрудники. Получить список department_id, в которых работают работники нескольких (>1) job_id
Solution

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

Tabela Zaposlenih. Pribavite listu manager_id koji imaju više od 5 podređenih i zbir svih plata njihovih podređenih veći od 50000
Solution

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

Tabela Zaposlenih. Pribavite listu manager_id čija prosečna plata svih podređenih nalazi se u opsegu od 6000 do 9000 i koji ne primaju bonuse (commission_pct je prazan)
Solution

  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;

Tabela Zaposlenih. Pribavite maksimalnu platu svih zaposlenih čiji job_id se završava rečju ‘CLERK’
Solution

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

Tabela Zaposlenih. Pribavite maksimalnu platu među svim prosečnim platama po departmanu
Solution

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

Tabela Zaposlenih. Pribavite broj zaposlenih sa istim brojem slova u imenu. Prikazati samo one čije ime ima više od 5 slova i broj zaposlenih sa tim imenom veći od 20. Sortirati po dužini imena
Solution

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

Prikazivanje podataka iz više tabela koristeći spoj

Tabela Zaposlenih, Departamenti, Lokacije, Države, Regioni. Pribavite listu regiona i broj zaposlenih u svakom regionu
Solution

  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;

Tabela Zaposlenih, Departamenti, Lokacije, Države, Regioni. Pribavite detaljne informacije o svakom zaposlenom:
First_name, Last_name, Departament, Job, Ulica, Država, Region
Solution

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

Tabela Zaposlenih. Prikazati sve menadžere koji imaju više od 6 zaposlenih podredjenih
Solution

  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;

Tabela Zaposlenih. Prikazati sve zaposlene koji nikome ne podređuju
Solution

IZBERITE emp.first_name
  IZ zaposleni emp
       LEVO PRIDRUŽI zaposlenega man NA (emp.manager_id = man.employee_id)
 KJER man.FIRST_NAME JE NULL;

IZBERITE first_name
  IZ zaposleni
 KJER manager_id JE NULL;

Tabela Zaposleni, Job_history. V tabeli Zaposleni so shranjeni vsi zaposleni. V tabeli Job_history so zaposleni, ki so zapustili podjetje. Pridobite poročilo o vseh zaposlenih in o njihovem statusu v podjetju (Aktivni ali zapustili podjetje z datumom odhoda).
Primer:
first_name | status
Jennifer | Zapustila podjetje 31. decembra 2006
Clara | Trenutno zaposleni
Solution

IZBERITE first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Zapustil podjetje na"" DD ""v"" Mesec, YYYY'),
           'Trenutno zaposleni')
           status
  IZ zaposleni e LEVO PRIDRUŽI zgodovini dela j NA (e.employee_id = j.employee_id);

Tabela Zaposleni, Oddelki, Lokacije, Države, Regije. Pridobite seznam zaposlenih, ki živijo v Evropi (region_name).
Solution

 IZBERITE first_name
  IZ zaposleni
       PRIDRUŽITE oddelki UPORABNI (department_id)
       PRIDRUŽITE lokacije UPORABNI (location_id)
       PRIDRUŽITE države UPORABNI (country_id)
       PRIDRUŽITE regije UPORABNI (region_id)
 KJER region_name = 'Evropa';
 
 IZBERITE first_name
  IZ zaposleni e
       PRIDRUŽITE oddelki d NA (e.department_id = d.department_id)
       PRIDRUŽITE lokacije l NA (d.location_id = l.location_id)
       PRIDRUŽITE države c NA (l.country_id = c.country_id)
       PRIDRUŽITE regije r NA (c.region_id = r.region_id)
 KJER region_name = 'Evropa';

Tabela Zaposleni, Oddelki. Prikazati vse oddelke, v katerih dela več kot 30 zaposlenih.
Solution

IZBERITE department_name, COUNT (*)
    IZ zaposleni e PRIDRUŽITE oddelki d NA (e.department_id = d.department_id)
GROUP BY department_name
  IMATE COUNT (*) > 30;

Tabela Zaposleni, Oddelki. Prikazati vse zaposlene, ki niso povezani z nobenim oddelkom.
Solution

IZBERITE first_name
  IZ zaposleni e
       LEVO PRIDRUŽI oddelki d NA (e.department_id = d.department_id)
 KJER d.department_name JE NULL;

IZBERITE first_name
  IZ zaposleni
 KJER department_id JE NULL;

Tabela Zaposleni, Oddelki. Prikazati vse oddelke, v katerih ni nobenega zaposlenega.
Solution

IZBERITE department_name
  IZ zaposleni e
       DESNO PRIDRUŽI oddelki d NA (e.department_id = d.department_id)
 KJER first_name JE NULL;

Tabela Zaposleni. Prikazati vse zaposlene, ki nimajo nikogar v podrejenem položaju.
Solution

IZBERITE man.first_name
  IZ zaposleni emp
       DESNO PRIDRUŽI zaposleni man NA (emp.manager_id = man.employee_id)
 KJER emp.FIRST_NAME JE NULL;

Tabela Zaposleni, Delovna mesta, Oddelki. Prikazati zaposlene v formatu: First_name, Job_title, Department_name.
Primer:
First_name | Job_title | Department_name
Donald | Pošiljanje | Ključavničar
Solution

IZBERITE first_name, job_title, department_name
  IZ zaposleni e
       PRIDRUŽITE delovna mesta j NA (e.job_id = j.job_id)
       PRIDRUŽITE oddelki d NA (d.department_id = e.department_id);

Tabela Zaposleni. Pridobite seznam zaposlenih, katerih managerji so se zaposlili leta 2005, vendar so ti zaposleni začeli delati pred letom 2005.
Solution

IZBERITE emp.*
  IZ zaposleni emp PRIDRUŽITE zaposlene man NA (emp.manager_id = man.employee_id)
 KJER     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       IN emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabela Zaposleni. Dobiti popis zaposlenika čiji su menadžeri zaposleni u januaru bilo koje godine i čija dužina job_title prelazi 15 karaktera
Solution

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;

Korišćenje podupita za rešavanje upita

Tabela Zaposleni. Dobiti popis zaposlenika sa najdužim imenom.
Solution

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

Tabela Zaposleni. Dobiti popis zaposlenika čija plata je veća od prosečne plate svih zaposlenih.
Solution

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

Tabela Zaposleni, Odeljenja, Lokacije. Dobiti grad u kojem zaposleni ukupno zarađuju najmanje.
Solution

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

Tabela Zaposleni. Dobiti popis zaposlenika čiji menadžer zarađuje više od 15000.
Solution

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

Tabela Zaposleni, Oddelki. Prikazati vse oddelke, v katerih ni nobenega zaposlenega.
Solution

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

Tabela Zaposleni. Prikazati sve zaposlene koji nisu menadžeri
Solution

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

Tabela Zaposlenih. Prikazati sve menadžere koji imaju više od 6 zaposlenih podredjenih
Solution

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

Tabela Zaposleni, Odeljenja. Prikazati zaposlenike koji rade u IT odeljenju
Solution

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

Tabela Zaposleni, Delovna mesta, Oddelki. Prikazati zaposlene v formatu: First_name, Job_title, Department_name.
Primer:
First_name | Job_title | Department_name
Donald | Pošiljanje | Ključavničar
Solution

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;

Tabela Zaposleni. Pridobite seznam zaposlenih, katerih managerji so se zaposlili leta 2005, vendar so ti zaposleni začeli delati pred letom 2005.
Solution

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

Tabela Zaposleni. Dobiti popis zaposlenika čiji su menadžeri zaposleni u januaru bilo koje godine i čija dužina job_title prelazi 15 karaktera
Solution

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;

To je zasad sve.

Nadam se da su zadaci bili zanimljivi i uzbudljivi.
Nastaviću da dodajem ovaj spisak zadataka koliko budem mogao.
Tudi bom vesel vseh pripomb in predlogov.

P.S.: Če komu pade na pamet zanimiva naloga za SELECT, mi pišite v komentarjih, dodal bom na seznam.

Hvala.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster