SQL. Puzzle dibertigarriak

Kaixo Habr!

3 urte baino gehiago daramatzat SQL irakasten hainbat prestakuntza-zentrotan, eta nire behaketa bat da ikasleek SQL hobeto menperatzen eta ulertzen dutela zeregin bat ematen bazaie, eta ez bakarrik aukerei eta oinarri teorikoei buruz hitz egiten.

Artikulu honetan, zurekin partekatuko dut ikasleei etxerako lan gisa ematen dizkiedan zereginen zerrenda eta hainbat burutazio-mota egiten ditugunak, eta horrek SQLren ulermen sakon eta argia dakar.

SQL. Puzzle dibertigarriak

SQL (ΛˆΙ›sˈkjuΛˆΙ›l; eng. egituratutako kontsulta-lengoaia) deklaraziozko programazio-lengoaia bat da, datu-basea kudeatzeko sistema egoki batek kudeatzen duen erlazio-datu-base batean datuak sortzeko, aldatzeko eta kudeatzeko erabiltzen dena. Irakurri gehiago…

SQLri buruz irakur dezakezu desberdinetatik iturriak.
Artikulu honek ez du SQL hutsetik irakastea.

Goazen, beraz.

Ezagunak erabiliko ditugu HR eskema Oracle-n bere taulekin (Gehiago):

SQL. Puzzle dibertigarriak
Ohartu naiz SELECT-en zereginak bakarrik hartuko ditugula kontuan. Ez dago zereginik DML eta DDL-n.

zereginak

Datuak mugatzea eta ordenatzea

Langileen mahaia. Lortu zerrenda bat langile guztiei buruzko informazioarekin
Erabaki

SELECT * FROM employees

Langileen mahaia. Lortu 'David' izeneko langile guztien zerrenda
Erabaki

SELECT *
  FROM employees
 WHERE first_name = 'David';

Langileen mahaia. Lortu 'IT_PROG'-ren job_id berdina duten langile guztien zerrenda
Erabaki

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Langileen mahaia. Lortu 50 baino gehiagoko soldata (soldata) duten 4000. saileko (department_id) langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu 20. eta 30. saileko langile guztien zerrenda (department_id)
Erabaki

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

Langileen mahaia. Lortu bere izenaren azken letra 'a' duten langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu hobaria duten 50. eta 80. saileko (department_id) langile guztien zerrenda ( commission_pct zutabeko balioa ez dago hutsik)
Erabaki

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

Langileen mahaia. Lortu izenak gutxienez 2 hizki "n" dituen langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu izena 4 letra baino luzeagoa duten langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu 8000 eta 9000 bitarteko soldata duten langile guztien zerrenda (biak barne)
Erabaki

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Langileen mahaia. Lortu izenak '%' ikurra duten langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu kudeatzaileen ID guztien zerrenda
Erabaki

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Langileen mahaia. Lortu langileen zerrenda beren postuekin formatuan: Donald(sh_clerk)
Erabaki

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

Errenkada bakarreko funtzioak erabiltzea irteera pertsonalizatzeko

Langileen mahaia. Lortu izena 10 letra baino luzeagoa duten langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu izenean 'b' hizkia duten langile guztien zerrenda (minuskulak eta minuskulak bereiztea)
Erabaki

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

Langileen mahaia. Lortu izenak gutxienez 2 hizki "a" dituen langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu soldata 1000ren multiploa duten langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu langilearen telefono-zenbakiaren lehen 3 digituko zenbakia bere zenbakia Π₯Π₯Π₯.Π₯Π₯Π₯.Π₯Π₯Π₯Π₯ formatuan badago
Erabaki

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

Sailen taula. Lortu lehen hitza sailaren izenetik izenean hitz bat baino gehiago dutenentzat
Erabaki

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

Langileen mahaia. Lortu langileen izenak izenaren lehenengo eta azken letrarik gabe
Erabaki

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

Langileen mahaia. Lortu izenaren azken letra 'm' berdina duten eta izenaren luzera 5 baino handiagoa duten langile guztien zerrenda.
Erabaki

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

Mahai bikoitza. Lortu hurrengo ostiraleko data
Erabaki

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

Langileen mahaia. Lortu enpresan 17 urte baino gehiago daramatzaten langile guztien zerrenda
Erabaki

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

Langileen mahaia. Lortu telefono-zenbakiaren azken zifra bakoitia eta puntu batez bereizitako 3 zenbakiz osatuta duten langile guztien zerrenda.
Erabaki

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

Langileen mahaia. Lortu '_' zeinuaren ondoko job_id balioa gutxienez 3 karaktere dituen langile guztien zerrenda, baina '_' ondorengo balio hori ez da 'CLERK'-ren berdina
Erabaki

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

Langileen mahaia. Lortu langile guztien zerrenda PHONE_NUMBER balioko "." guztiak ordezkatuta '-'-n
Erabaki

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

Bihurketa-funtzioak eta baldintzazko adierazpenak erabiltzea

Langileen mahaia. Lortu hileko lehen egunean lanera etorri ziren langile guztien zerrenda (edozein)
Erabaki

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

Langileen mahaia. Lortu 2008an lanera etorri ziren langile guztien zerrenda
Erabaki

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

Mahai DUALA. Erakutsi biharko data formatuan: Bihar urtarrilaren bigarren eguna da
Erabaki

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

Langileen mahaia. Lortu langile guztien zerrenda eta hasiera data formatuan: 21ko ekainaren 2007a
Erabaki

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

Langileen mahaia. Lortu soldatak %20 igo dituzten langileen zerrenda. Erakutsi soldata dolarraren seinalearekin
Erabaki

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

Langileen mahaia. Lortu 2007ko otsailean lanera etorri ziren langile guztien zerrenda.
Erabaki

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

Mahai DUALA. Esportatu uneko data, + segundo, + minutu, + ordu, + eguna, + hilabetea, + urtea
Erabaki

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;

Langileen mahaia. Lortu soldata osoa duten langile guztien zerrenda (soldata + commission_pct(%)) formatuan: 24,000.00 $
Erabaki

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

Langileen mahaia. Lortu langile guztien zerrenda eta soldata-sarien erabilgarritasunari buruzko informazioa (Bai/Ez)
Erabaki

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

Langileen mahaia. Lortu langile bakoitzaren soldata-maila: 5000 baino gutxiago maila baxutzat hartzen da, 5000 baino handiagoa edo berdina eta 10000 baino gutxiago maila normaltzat, 10000 baino handiagoa edo berdina maila altua da.
Erabaki

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;

Herrialdeen taula. Herrialde bakoitzeko, erakutsi zein eskualdetan dagoen: 1-Europa, 2-Amerika, 3-Asia, 4-Afrika (Batu gabe)
Erabaki

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;

Datu agregatuak jakinaraztea Taldearen funtzioak erabiliz

Langileen mahaia. Lortu txosten bat departamentuaren arabera, gutxieneko eta gehienezko soldata, goiz eta berandu iristeko datak eta langile kopuruarekin. Ordenatu langile kopuruaren arabera (desk)
Erabaki

  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;

Langileen mahaia. Zenbat langile izenak letra berdinarekin hasten dira? Ordenatu kantitatearen arabera. Erakutsi zenbakia 1 baino handiagoa denak bakarrik
Erabaki

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;

Langileen mahaia. Zenbat langile lan egiten dute sail berean eta soldata bera jasotzen dute?
Erabaki

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

Langileen mahaia. Lortu asteko egun bakoitzean zenbat langile kontratatu ziren txostena. Ordenatu kantitatearen arabera
Erabaki

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

Langileen mahaia. Lortu txostena zenbat langile kontratatu ziren urtean. Ordenatu kantitatearen arabera
Erabaki

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

Langileen mahaia. Lortu langileak dituzten sailen kopurua
Erabaki

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

Langileen mahaia. Lortu 30 langile baino gehiago dituen sail_id zerrenda
Erabaki

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

Langileen mahaia. Lortu departamentu_id-en zerrenda eta sail bakoitzeko langileen batez besteko soldata biribildua.
Erabaki

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

Herrialdeen taula. Lortu 60 baino gehiago herrialde_izen guztien hizki guztien batura eskualde_id-en zerrenda
Erabaki

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

Langileen mahaia. Lortu hainbat (>1) job_id langileek lan egiten duten sail_id zerrenda
Erabaki

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

Langileen mahaia. Lortu menpekoen kopurua 5 baino handiagoa eta bere menpekoen soldata guztien batura 50000 baino handiagoa den manager_id zerrenda bat
Erabaki

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

Langileen mahaia. Lortu manager_id-en zerrenda, bere menpeko guztien batez besteko soldata 6000 eta 9000 artekoa den, hobariak jasotzen ez dituztenak (commission_pct hutsik dago)
Erabaki

  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;

Langileen mahaia. Lortu 'CLERK' hitzarekin amaitzen den lan_id-a langile guztien gehienezko soldata
Erabaki

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

Langileen mahaia. Lortu gehienezko soldata saileko batez besteko soldata guztien artean
Erabaki

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

Langileen mahaia. Lortu bere izenean letra kopuru bera duten langile kopurua. Aldi berean, bistaratu izena 5 baino luzeagoa eta izen bera duten langile kopurua 20 baino gehiago dutenak soilik. Ordenatu izenaren luzeraren arabera.
Erabaki

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

Taula anitzetako datuak bistaratzea juntadurak erabiliz

Taula Langileak, Sailak, Kokalekuak, Herrialdeak, Eskualdeak. Eskuratu eskualdeen zerrenda eta eskualde bakoitzeko langile kopurua
Erabaki

  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;

Taula Langileak, Sailak, Kokalekuak, Herrialdeak, Eskualdeak. Lortu langile bakoitzari buruzko informazio zehatza:
Izena, Abizena, Saila, Lanpostua, Kalea, Herrialdea, Eskualdea
Erabaki

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

Langileen mahaia. Erakutsi 6 langile baino gehiago dituzten zuzendari guztiak
Erabaki

  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;

Langileen mahaia. Erakutsi inori berri ematen ez dioten langile guztiak
Erabaki

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;

Langileen taula, Job_historia. Langileen taulak langile guztiak gordetzen ditu. Job_history taulak enpresa utzi duten langileak gordetzen ditu. Lortu langile guztien eta enpresan duten egoerari buruzko txostena (Enplegatua edo enpresatik irtendako datarekin)
Adibidea:
izen_abizenak | egoera
jennifer | 31ko abenduaren 2006n utzi zuen enpresa
Klara | Gaur egun Lan egiten
Erabaki

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

Taula Langileak, Sailak, Kokalekuak, Herrialdeak, Eskualdeak. Lortu Europan bizi diren langileen zerrenda (region_name)
Erabaki

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

Mahaiko Langileak, Sailak. Erakutsi 30 langile baino gehiago dituzten sail guztiak
Erabaki

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

Mahaiko Langileak, Sailak. Erakutsi edozein sailetan ez dauden langile guztiak
Erabaki

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;

Mahaiko Langileak, Sailak. Erakutsi langilerik gabeko sail guztiak
Erabaki

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

Langileen mahaia. Erakutsi menpekorik ez duten langile guztiak
Erabaki

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

Mahaia Langileak, Lanpostuak, Sailak. Erakutsi langileak formatuan: Izen_izena, Lanpostuaren izena, Sailaren izena.
Adibidea:
izen_abizenak | lanpostuaren izena | Sail_izena
Donald | bidalketa | Bidalketa idazkaria
Erabaki

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

Langileen mahaia. Lortu 2005ean kudeatzaileek lana lortu zuten langileen zerrenda, baina, aldi berean, langile horiek 2005 baino lehen lortu zuten lana.
Erabaki

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

Langileen mahaia. Lortu edozein urteko urtarrilean kudeatzaileek lana lortu duten langileen zerrenda eta langile hauen job_title-ren luzera 15 karaktere baino gehiagokoa da.
Erabaki

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;

Azpikontsultak erabiltzea Kontsultak ebazteko

Langileen mahaia. Lortu izen luzeena duten langileen zerrenda.
Erabaki

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

Langileen mahaia. Lortu langile guztien batez besteko soldata baino soldata handiagoa duten langileen zerrenda.
Erabaki

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

Mahaia Langileak, Sailak, Kokalekuak. Lortu langileek guztira gutxien irabazten duten hiria.
Erabaki

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

Langileen mahaia. Lortu kudeatzaileak 15000 baino gehiagoko soldata jasotzen duten langileen zerrenda.
Erabaki

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

Mahaiko Langileak, Sailak. Erakutsi langilerik gabeko sail guztiak
Erabaki

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

Langileen mahaia. Erakutsi kudeatzaileak ez diren langile guztiak
Erabaki

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

Langileen mahaia. Erakutsi 6 langile baino gehiago dituzten zuzendari guztiak
Erabaki

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

Mahaiko Langileak, Sailak. Erakutsi informatika sailean lan egiten duten langileak
Erabaki

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

Mahaia Langileak, Lanpostuak, Sailak. Erakutsi langileak formatuan: Izen_izena, Lanpostuaren izena, Sailaren izena.
Adibidea:
izen_abizenak | lanpostuaren izena | Sail_izena
Donald | bidalketa | Bidalketa idazkaria
Erabaki

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;

Langileen mahaia. Lortu 2005ean kudeatzaileek lana lortu zuten langileen zerrenda, baina, aldi berean, langile horiek 2005 baino lehen lortu zuten lana.
Erabaki

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

Langileen mahaia. Lortu edozein urteko urtarrilean kudeatzaileek lana lortu duten langileen zerrenda eta langile hauen job_title-ren luzera 15 karaktere baino gehiagokoa da.
Erabaki

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;

Hori da guztia oraingoz.

Zereginak interesgarriak eta zirraragarriak izatea espero dut.
Ahalik eta gehien gehituko dut zerrenda honi.
Pozik egongo naiz edozein iruzkin eta iradokizunekin ere.

PS: Norbaiti SELECT ataza interesgarri bat bururatzen bazaio, idatzi iruzkinetan, zerrendara gehituko dut.

Eskerrik asko.

Iturria: www.habr.com

Gehitu iruzkin berria