SQL. Puzzles zbavitëse

Përshëndetje, Habr!

Prej më shumë se 3 vitesh unë jap mësim SQL në qendra të ndryshme trajnimi dhe një nga vëzhgimet e mia është se studentët e zotërojnë dhe kuptojnë më mirë SQL nëse u jepet një detyrë, dhe jo vetëm u tregohet për mundësitë dhe bazat teorike.

Në këtë artikull, unë do të ndaj me ju listën time të problemeve që u jap studentëve si detyra shtëpie dhe mbi të cilat ne kryejmë lloje të ndryshme stuhish idesh, gjë që çon në një kuptim të thellë dhe të qartë të SQL.

SQL. Puzzles zbavitëse

SQL (ˈɛsˈkjuˈɛl; gjuha e strukturuar e pyetjeve në anglisht) është një gjuhë programimi deklarative e përdorur për të krijuar, modifikuar dhe menaxhuar të dhënat në një bazë të dhënash relacionale të menaxhuar nga një sistem i duhur i menaxhimit të bazës së të dhënave. Mësoni më shumë

Ju mund të lexoni rreth SQL nga të ndryshme burimet.
Ky artikull nuk ka për qëllim t'ju mësojë SQL nga e para.

Le të shkojmë.

Ne do të përdorim të njohurit Diagrami i burimeve njerëzore në Oracle me tabelat e tij (më shumë):

SQL. Puzzles zbavitëse
Vërej se do të shqyrtojmë vetëm detyrat SELECT. Këtu nuk ka detyra DML ose DDL.

detyrat

Kufizimi dhe renditja e të dhënave

Tabela e punonjësve. Merrni një listë me informacione për të gjithë punonjësit
vendim

SELECT * FROM employees

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve të quajtur "David"
vendim

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve me job_id të barabartë me 'IT_PROG'
vendim

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve nga departamenti i 50-të (departament_id) me një pagë (rrogë) më të madhe se 4000
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve nga departamenti i 20-të dhe i 30-të (department_id)
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, germa e fundit e të cilëve në emrin e tyre është 'a'
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve nga departamenti i 50-të dhe i 80-të (department_id) që kanë një bonus (vlera në kolonën komision_pct nuk është bosh)
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, emrat e të cilëve përmbajnë të paktën 2 shkronja 'n'
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, emrat e të cilëve janë më të gjatë se 4 shkronja
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, paga e të cilëve varion nga 8000 në 9000 (përfshirë)
vendim

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve emri i të cilëve përmban simbolin '%'
vendim

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

Tabela e punonjësve. Merrni një listë të të gjitha ID-ve të menaxherit
vendim

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabela e punonjësve. Merrni një listë të punonjësve me pozicionet e tyre në formatin: Donald(sh_clerk)
vendim

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

Përdorimi i funksioneve me një rresht për të personalizuar daljen

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, emrat e të cilëve janë më të gjatë se 10 shkronja
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që kanë shkronjën 'b' në emrin e tyre (pa ndjeshmërinë e shkronjave)
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, emrat e të cilëve përmbajnë të paktën 2 shkronja "a"
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, paga e të cilëve është shumëfish i 1000
vendim

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

Tabela e punonjësve. Merrni numrin e parë 3-shifror të numrit të telefonit të një punonjësi nëse numri i tij është në formatin XXX.XXX.XXXX
vendim

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

Tabela e departamenteve. Merrni fjalën e parë nga emri i departamentit për ata që kanë më shumë se një fjalë në emër
vendim

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

Tabela e punonjësve. Merrni emrat e punonjësve pa shkronjën e parë dhe të fundit në emër
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, germa e fundit e të cilëve në emrin e tyre është 'm' dhe emri i të cilëve është më i gjatë se 5
vendim

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

Tabela e dyfishtë. Merrni datën e së Premtes së ardhshme
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që kanë punuar për kompaninë për më shumë se 17 vjet
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, shifra e fundit e numrit të tyre të telefonit është tek dhe përbëhet nga 3 numra të ndarë me një pikë
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, vlera e job_id të të cilëve pas shenjës '_' ka të paktën 3 karaktere, por kjo vlerë pas '_' nuk është e barabartë me 'CLERK'
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve duke zëvendësuar të gjithë '.' në vlerën PHONE_NUMBER në '-'
vendim

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

Përdorimi i funksioneve të konvertimit dhe shprehjeve të kushtëzuara

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që erdhën në punë ditën e parë të muajit (ndonjë)
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që erdhën në punë në 2008
vendim

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

Tabela DUAL. Shfaq datën e nesërme në formatin: Nesër është dita e dytë e janarit
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve dhe datën e mbërritjes së secilit punonjës në punë në formatin: 21 qershor 2007
vendim

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

Tabela e punonjësve. Merrni një listë të punonjësve me paga të rritura me 20%. Trego pagën me shenjën e dollarit
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që filluan të punojnë në shkurt 2007.
vendim

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

Tabela DUAL. Sillni datën aktuale, + sekondë, + minutë, + orë, + ditë, + muaj, + vit
vendim

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;

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve me paga të plota (paga + komision_pct(%)) në formatin: $24,000.00
vendim

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

Tabela e punonjësve. Merrni një listë të të gjithë punonjësve dhe informacion në lidhje me disponueshmërinë e bonuseve të pagave (Po/Jo)
vendim

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

Tabela e punonjësve. Merrni nivelin e pagës së secilit punonjës: Më pak se 5000 konsiderohet nivel i ulët, më i madh se ose i barabartë me 5000 dhe më pak se 10000 konsiderohet nivel normal, më shumë se ose i barabartë me 10000 konsiderohet nivel i lartë.
vendim

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;

Vendet e tabelës. Për secilin vend, tregoni rajonin në të cilin ndodhet: 1-Evropa, 2-Amerika, 3-Azia, 4-Afrika (pa anëtarësim)
vendim

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;

Raportimi i të dhënave të grumbulluara duke përdorur funksionet e grupit

Tabela e punonjësve. Merrni një raport sipas departamentit_id me pagën minimale dhe maksimale, datat e hershme dhe të vonuara të mbërritjes në punë dhe numrin e punonjësve. Rendit sipas numrit të punonjësve (në rënie)
vendim

  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;

Tabela e punonjësve. Sa punonjës emrat e të cilëve fillojnë me të njëjtën shkronjë? Rendit sipas sasisë. Trego vetëm ato ku sasia është më e madhe se 1
vendim

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;

Tabela e punonjësve. Sa punonjës punojnë në të njëjtin departament dhe marrin të njëjtën pagë?
vendim

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

Tabela e punonjësve. Merrni një raport se sa punonjës janë punësuar në çdo ditë të javës. Rendit sipas sasisë
vendim

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

Tabela e punonjësve. Merrni një raport se sa punonjës janë punësuar në vit. Rendit sipas sasisë
vendim

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

Tabela e punonjësve. Merrni numrin e departamenteve që kanë punonjës
vendim

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

Tabela e punonjësve. Merrni një listë të departamenteve që kanë më shumë se 30 punonjës
vendim

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

Tabela e punonjësve. Merrni një listë të departamenteve_ids dhe pagën mesatare të rrumbullakosur të punonjësve në secilin departament.
vendim

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

Vendet e tabelës. Merrni listën region_id shumën e të gjitha shkronjave të të gjitha emrave të shteteve në të cilat ka më shumë se 60
vendim

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

Tabela e punonjësve. Merrni një listë të identifikimit të departamenteve në të cilat punojnë punonjës të disa (>1) job_ids
vendim

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

Tabela e punonjësve. Merrni një listë me menaxher_ids, numri i vartësve të të cilëve është më i madh se 5 dhe shuma e të gjitha pagave të vartësve të tij është më e madhe se 50000
vendim

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

Tabela e punonjësve. Merrni një listë me menaxher_ids, paga mesatare e të cilëve për të gjithë vartësit e tij është në rangun nga 6000 në 9000 dhe që nuk marrin bonuse (komisioni_pct është bosh)
vendim

  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 e punonjësve. Merr pagën maksimale nga të gjithë punonjësit job_id që mbaron me fjalën "NËNRFES"
vendim

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 e punonjësve. Merrni pagën maksimale midis të gjitha pagave mesatare për departamentin
vendim

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

Tabela e punonjësve. Merrni numrin e punonjësve me të njëjtin numër shkronjash në emrin e tyre. Në të njëjtën kohë, tregoni vetëm ata, gjatësia e emrave të të cilëve është më shumë se 5 dhe numri i punonjësve me të njëjtin emër është më shumë se 20. Rendit sipas gjatësisë së emrit
vendim

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

Shfaqja e të dhënave nga tabela të shumta duke përdorur lidhjet

Punonjësit e tabelës, departamentet, vendndodhjet, vendet, rajonet. Merrni një listë të rajoneve dhe numrin e punonjësve në secilin rajon
vendim

  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;

Punonjësit e tabelës, departamentet, vendndodhjet, vendet, rajonet. Merrni informacion të detajuar për çdo punonjës:
Emri, Mbiemri, Departamenti, Puna, Rruga, Vendi, Rajoni
vendim

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 e punonjësve. Trego të gjithë menaxherët që kanë më shumë se 6 punonjës në varësi të tyre
vendim

  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 e punonjësve. Trego të gjithë punonjësit që nuk i raportojnë askujt
vendim

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;

Punonjësit e tabelës, historia e punës. Tabela e punonjësve ruan të gjithë punonjësit. Tabela Job_history ruan punonjësit që janë larguar nga kompania. Merrni një raport për të gjithë punonjësit dhe statusin e tyre në kompani (Punon ose u largua nga kompania me datën e nisjes)
Shembull:
emri_i parë | statusi
Jennifer | U largua nga kompania më 31 dhjetor 2006
Klara | Aktualisht Punon
vendim

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

Punonjësit e tabelës, departamentet, vendndodhjet, vendet, rajonet. Merrni një listë të punonjësve që jetojnë në Evropë (region_name)
vendim

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

Punonjësit e Tavolinës, Departamentet. Trego të gjitha departamentet me më shumë se 30 punonjës
vendim

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

Punonjësit e Tavolinës, Departamentet. Trego të gjithë punonjësit që nuk janë në asnjë departament
vendim

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;

Punonjësit e Tavolinës, Departamentet. Trego të gjitha departamentet në të cilat nuk ka punonjës
vendim

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

Tabela e punonjësve. Tregojuni të gjithë punonjësve që nuk kanë askënd në varësi të tyre
vendim

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

Punonjes tavoline, pune, departamente. Trego punonjësit në formatin: Emri_emri, titulli_puna, emri_departamenti.
Shembull:
Emri_emri | Emri_pune | Emri i Departamentit
Donald | Transporti | Nëpunës i Transportit
vendim

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

Tabela e punonjësve. Merrni një listë të punonjësve, menaxherët e të cilëve morën një punë në 2005, por në të njëjtën kohë këta punonjës vetë morën një punë para 2005
vendim

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

Tabela e punonjësve. Merrni një listë të punonjësve, menaxherët e të cilëve morën një punë në janar të çdo viti dhe gjatësia e titullit_punës së këtyre punonjësve është më shumë se 15 karaktere
vendim

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;

Përdorimi i nënpyetjeve për zgjidhjen e pyetjeve

Tabela e punonjësve. Merrni një listë të punonjësve me emrin më të gjatë.
vendim

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

Tabela e punonjësve. Merrni një listë të punonjësve me një pagë më të madhe se paga mesatare e të gjithë punonjësve.
vendim

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

Tabela e punonjësve, departamenteve, vendndodhjeve. Gjeni qytetin në të cilin punonjësit në total fitojnë më pak.
vendim

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 e punonjësve. Merrni një listë të punonjësve, menaxheri i të cilëve merr një pagë prej më shumë se 15000.
vendim

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

Punonjësit e Tavolinës, Departamentet. Trego të gjitha departamentet në të cilat nuk ka punonjës
vendim

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

Tabela e punonjësve. Trego të gjithë punonjësit që nuk janë menaxherë
vendim

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

Tabela e punonjësve. Trego të gjithë menaxherët që kanë më shumë se 6 punonjës në varësi të tyre
vendim

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

Punonjësit e Tavolinës, Departamentet. Trego punonjësit që punojnë në departamentin e IT
vendim

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

Punonjes tavoline, pune, departamente. Trego punonjësit në formatin: Emri_emri, titulli_puna, emri_departamenti.
Shembull:
Emri_emri | Emri_pune | Emri i Departamentit
Donald | Transporti | Nëpunës i Transportit
vendim

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 e punonjësve. Merrni një listë të punonjësve, menaxherët e të cilëve morën një punë në 2005, por në të njëjtën kohë këta punonjës vetë morën një punë para 2005
vendim

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 e punonjësve. Merrni një listë të punonjësve, menaxherët e të cilëve morën një punë në janar të çdo viti dhe gjatësia e titullit_punës së këtyre punonjësve është më shumë se 15 karaktere
vendim

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;

Kjo është e gjitha për tani.

Shpresoj që detyrat të ishin interesante dhe emocionuese.
Unë do t'i shtoj kësaj liste detyrash sa më shumë që të jetë e mundur.
Gjithashtu do të jem i lumtur të marr çdo koment dhe sugjerim.

PS: Nëse dikush vjen me një detyrë interesante SELECT, shkruani në komente dhe unë do ta shtoj atë në listë.

Falemnderit.

Burimi: www.habr.com

Shto një koment