SQL. Problematika interesante

Përshëndetje, Habr!

Tani e më shumë se 3 vjet, unë jap mësime SQL në qendra të ndryshme trajnimi, dhe një nga vëzhgimet e mia është se studentët mësojnë dhe kuptojnë më mirë SQL nëse u jepet një detyrë, dhe jo thjesht u tregohen mundësitë dhe bazat teorike.

Në këtë artikull do të ndaj me ju listën time të detyrave që u jap studentëve si detyrë shtëpie dhe për të cilat zhvillojmë lloje të ndryshme brainstorming, gjë që çon në një kuptim të thellë dhe të qartë të SQL.

SQL. Problematika interesante

SQL (ˈɛsˈkjuˈɛl; anglisht: structured query language – 'gjuha e pyetjeve të strukturuara') është një gjuhë programimi deklarative, e cila përdoret për të krijuar, modifikuar dhe menaxhuar të dhënat në një bazë të dhënash relacionale, të menaxhuar nga një sistem për menaxhimin e bazave të të dhënave. Më shumë…

Mund të lexoni mbi SQL në të ndryshme burime.
Ky artikull nuk ka për qëllim t'ju mësojë SQL nga e para.

Pra, le të fillojmë.

Do të përdorim të njohurën skemën HR në Oracle me tabelat e saj (Më shumë):

SQL. Problematika interesante
Dua të theksoj se do të trajtojmë vetëm detyrat në SELECT. Nuk ka detyra për DML dhe DDL.

Detyrat

Kufizimi dhe Renditja e Të Dhënave

Tabela Employees. Merrni listën me informacion për të gjithë punonjësit
Zgjidhja

SELECT * FROM employees

Tabela Employees. Merrni listën e të gjithë punonjësve me emrin ‘David’
Zgjidhja

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabela Employees. Merrni listën e të gjithë punonjësve me job_id të barabartë me ‘IT_PROG’
Zgjidhja

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabela Employees. Merrni listën e të gjithë punonjësve nga departamenti i 50-të (department_id) me pagë (salary) më të madhe se 4000
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve nga departamenti i 20-të dhe ai i 30-të (department_id)
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve të cilët emri i fundit ka shkronjën ‘a’
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve nga departamenti i 50-të dhe ai i 80-të (department_id) të cilët kanë bonus (vlera në kolonën commission_pct nuk është e zbrazët)
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve të cilët kanë në emër të paktën 2 shkronja ‘n’
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve të cilët kanë një emër më të gjatë se 4 shkronja
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve të cilët pagat e tyre janë në intervalin nga 8000 deri në 9000 (përfshirë)
Zgjidhja

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilëve emri përmban simbolin ‘%’
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë ID menaxherëve
Zgjidhja

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabela Employees. Merrni listën e punonjësve me pozitat e tyre në formatin: Donald(sh_clerk)
Zgjidhja

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

Përdorimi i funksioneve të vetme të rreshtave për të personalizuar daljen

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilëve gjatësia e emrit është më e madhe se 10 shkronja
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilëve emri ka shkronjën ‘b’ (pavarësisht nga shkronja e madhe/më e vogël)
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilëve emri përmban të paktën 2 shkronja ‘a’
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilëve paga është shumëfish i 1000
Zgjidhja

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

Tabela Employees. Merrni numrin e parë 3-shkronjor të telefonit të punonjësit nëse numri i tij është në formatin XXX.XXX.XXXX
Zgjidhja

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

Tabela Departments. Merrni fjalën e parë nga emri i departamentit për ata, të cilëve emri ka më shumë se një fjalë
Zgjidhja

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

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

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

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilëve shkronja e fundit në emër është ‘m’ dhe gjatësia e emrit është më e madhe se 5
Zgjidhja

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

Tabela Dual. Merrni datën e së premtes së ardhshme
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilët punojnë në company më shumë se 17 vjet
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilëve shifra e fundit të numrit të telefonit është çifti dhe përbëhet nga 3 numra të ndarë me pikë
Zgjidhja

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

Tabela Employees. Merrni listën e të gjithë punonjësve, të cilëve në vlerën e job_id pas shenjës ‘_’ ka të paktën 3 simbole, por kjo vlerë pas ‘_’ nuk është e barabartë me ‘CLERK’
Zgjidhja

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

Tabela Employees. Merrni një listë të të gjithë punonjësve duke zëvendësuar në vlerën PHONE_NUMBER të gjitha ‘.’ me ‘-‘
Zgjidhja

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

Duke përdorur funksionet e konvertimit dhe shprehjet kondicionale

Tabela Employees. Merrni një listë të të gjithë punonjësve që filluan punë në ditën e parë të çdo muaji
Zgjidhja

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

Tabela Employees. Merrni një listë të të gjithë punonjësve që filluan punë në vitin 2008
Zgjidhja

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

Tabela DUAL. Trego datën e nesërme në formatin: Nesër është dita e dytë e Janarit
Zgjidhja

SELECT TO_CHAR (SYSDATE, 'fm""Nesër është ""Ddspth ""dita e"" Month')     info
  FROM DUAL;

Tabela Employees. Merrni një listë të të gjithë punonjësve dhe datën e nisjes së punës për secilin në formatin: 21st of June, 2007
Zgjidhja

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

Tabela Employees. Merrni një listë të punonjësve me rritje të pagave prej 20%. Trego pagën me shenjën e dollarit
Zgjidhja

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

Tabela Employees. Merrni një listë të të gjithë punonjësve që filluan punë në shkurt 2007.
Zgjidhja

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. Tregoni datën aktuale, + sekondë, + minutë, + orë, + ditë, + muaj, + vit
Zgjidhja

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 Employees. Merrni një listë të të gjithë punonjësve me pagat e plota (salary + commission_pct(%)) në formatin: $24,000.00
Zgjidhja

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

Tabela Employees. Merrni një listë të të gjithë punonjësve dhe informacionin mbi praninë e bonuseve në paga (Po/Jo)
Zgjidhja

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Po', 'Jo') has_bonus
  FROM employees;

Tabela Employees. Merrni nivelin e pagës për secilin punonjës: Më pak se 5000 konsiderohet Nivel i Ulët, Më shumë ose të barabarta me 5000 dhe më pak se 10000 konsiderohet Nivel Normal, Më shumë ose të barabarta me 10000 konsiderohet Nivel i Lartë
Zgjidhja

SELECT first_name,
       salary,
       CASE
           WHEN salary = 5000 AND salary < 10000 THEN 'Normal'
           ELSE 'I Lartë'
       END salary_level
  FROM employees;

Tabela Countries. Për çdo vend tregoni regjionin në të cilin ndodhet: 1-Evropa, 2-Amerika, 3-Azia, 4-Afrika (pa Join)
Zgjidhja

SELECT country_name country,
       DECODE (region_id,
               1, 'Evropa',
               2, 'Amerika',
               3, 'Asi',
               4, 'Afrika',
               'Të panjohura')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Evropa'
           WHEN 2 THEN 'Amerika'
           WHEN 3 THEN 'Asi'
           WHEN 4 THEN 'Afrika'
           ELSE 'Të panjohura'
       END
           region
  FROM countries;

Raportimi i të Dhënave të Grumbulluara duke Përdorur Funksionet e Grupit

Tabela Punonjësit. Merrni raport për department_id me pagën minimale dhe maksimale, me datën më herët dhe më vonë të fillimit të punës dhe me numrin e punonjësve. Rendisni sipas numrit të punonjësve (në rënie)
Zgjidhja

  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 Punonjësit. Sa punonjës ka emra të cilët fillojnë me të njëjtën shkronjë? Rendisni sipas numrit. Shfaqni vetëm ata ku numri është më shumë se 1
Zgjidhja

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 Punonjësit. Sa punonjës ka që punojnë në të njëjtin departament dhe marrin të njëjtën pagë?
Zgjidhja

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

Tabela Punonjësit. Merrni raportin se sa punonjës janë punësuar çdo ditë të javës. Rendisni sipas numrit
Zgjidhja

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

Tabela Punonjësit. Merrni raportin se sa punonjës janë punësuar sipas viteve. Rendisni sipas numrit
Zgjidhja

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

Tabela Punonjësit. Merrni numrin e departamenteve ku ka punonjës
Zgjidhja

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

Tabela Punonjësit. Merrni listën department_id ku punojnë më shumë se 30 punonjës
Zgjidhja

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

Tabela Punonjësit. Merrni listën department_id dhe pagën mesatare të rrethuar të punonjësve në çdo departament.
Zgjidhja

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

Tabela Vendet. Merrni listën region_id shumën e të gjitha karaktereve në të gjitha country_name që kanë më shumë se 60
Zgjidhja

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

Tabela Punonjësit. Merrni listën department_id ku punojnë punonjës me disa (>1) job_id
Zgjidhja

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

Tabeli Employees. Merrni listën e manager_id-ve që kanë më shumë se 5 nëntë punonjës dhe shuma e pagave të të gjithë nëntë punonjësve është mbi 50000
Zgjidhja

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

Tabeli Employees. Merrni listën e manager_id-ve që pagat mesatare të të gjithë nëntë punonjësve janë brenda intervalit nga 6000 deri në 9000 dhe që nuk marrin bonuse (commission_pct është bosh)
Zgjidhja

  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;

Tabeli Employees. Merrni pagën maksimale nga të gjithë punonjësit me job_id që përfundojnë me fjalën ‘CLERK’
Zgjidhja

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

Tabeli Employees. Merrni pagën maksimale mes të gjitha pagave mesatare për departamentin
Zgjidhja

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

Tabeli Employees. Merrni numrin e punonjësve me të njëjtin numër shkronjash në emër. Tregoni vetëm ata që kanë një emër më të gjatë se 5 dhe numri i punonjësve me atë emër është mbi 20. Renditni sipas gjatësi emri
Zgjidhja

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

Tregimi i të Dhënave nga Më shumë Tabela duke Përdorur Bashkime

Tabeli Employees, Departaments, Locations, Countries, Regions. Merrni listën e rajoneve dhe numrin e punonjësve në secilin rajon
Zgjidhja

  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;

Tabeli Employees, Departaments, Locations, Countries, Regions. Merrni informacion detal për secilin punonjës:
First_name, Last_name, Departament, Job, Street, Country, Region
Zgjidhja

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

Tabeli Employees. Tregoni të gjithë menaxherët që kanë më shumë se 6 punonjës në nënshtrim
Zgjidhja

  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;

Tabeli Employees. Tregoni të gjithë punonjësit që nuk kanë askënd nënshtruar
Zgjidhja

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;

Tabela Employees, Job_history. Tabela Employee mban të gjithë punonjësit. Në tabelën Job_history ruhen punonjësit që kanë lënë kompaninë. Merrni një raport për të gjithë punonjësit dhe statusin e tyre në kompani (Aktualisht Punon ose Eka lënë kompaninë me datën e largimit)
Shembulli:
first_name | status
Jennifer | Eka lënë kompaninë më 31 Dhjetor, 2006
Clara | Aktualisht Punon
Zgjidhja

SELECT first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Eka lënë kompaninë më"" DD ""në"" Muaj, YYYY'),
           'Aktualisht Punon')
           status
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

Tabela Employees, Departaments, Locations, Countries, Regions. Merrni një listë të punonjësve që jetojnë në Evropë (region_name)
Zgjidhja

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

Tabela Employees, Departaments. Tregon të gjithë departamentet ku punojnë më shumë se 30 punonjës
Zgjidhja

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

Tabela Employees, Departaments. Tregon të gjithë punonjësit që nuk janë anëtarë në asnjë departament
Zgjidhja

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;

Tabela Employees, Departaments. Tregon të gjithë departamentet ku nuk ka asnjë punonjës
Zgjidhja

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

Tabela Employees. Tregon të gjithë punonjësit që nuk kanë askënd në raportin e menaxhimit
Zgjidhja

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

Tabela Employees, Jobs, Departaments. Tregon punonjësit në format: First_name, Job_title, Department_name.
Shembulli:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Zgjidhja

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 Employees. Merrni një listë të punonjësve ku menaxherët e tyre janë punësuar në vitin 2005, ndërkohë që këta punonjës janë punësuar para vitit 2005
Zgjidhja

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 listën e punonjësve të menaxherëve të cilët kanë filluar punë në muajin janar të një viti të caktuar dhe gjatësia e job_title të këtyre punonjësve është më e madhe se 15 karaktere
Zgjidhja

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ënkuptimeve për të Zgjidhur Kërkesat

Tabela e Punonjësve. Merrni listën e punonjësve me emrin më të gjatë.
Zgjidhja

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

Tabela e Punonjësve. Merrni listën e punonjësve me pagë më të madhe se paga mesatare e të gjithë punonjësve.
Zgjidhja

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

Tabela e Punonjësve, Departamenteve, Lokacioneve. Merrni qytetin ku punonjësit gjithsej fitojnë më pak.
Zgjidhja

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 listën e punonjësve që menaxheri i tyre fitojnë më shumë se 15000.
Zgjidhja

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

Tabela Employees, Departaments. Tregon të gjithë departamentet ku nuk ka asnjë punonjës
Zgjidhja

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

Tabela e Punonjësve. Tregoni të gjithë punonjësit që nuk janë menaxherë
Zgjidhja

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

Tabeli Employees. Tregoni të gjithë menaxherët që kanë më shumë se 6 punonjës në nënshtrim
Zgjidhja

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

Tabela e Punonjësve, Departamentet. Tregoni punonjësit që punojnë në departamentin IT
Zgjidhja

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

Tabela Employees, Jobs, Departaments. Tregon punonjësit në format: First_name, Job_title, Department_name.
Shembulli:
First_name | Job_title | Department_name
Donald | Shipping | Clerk Shipping
Zgjidhja

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 Employees. Merrni një listë të punonjësve ku menaxherët e tyre janë punësuar në vitin 2005, ndërkohë që këta punonjës janë punësuar para vitit 2005
Zgjidhja

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 listën e punonjësve të menaxherëve të cilët kanë filluar punë në muajin janar të një viti të caktuar dhe gjatësia e job_title të këtyre punonjësve është më e madhe se 15 karaktere
Zgjidhja

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;

Këto ishin për momentin.

Shpresoj se detyrat ishin interesante dhe argëtuese.
Do të përpiqem të plotësoj këtë listë detyrash sipas mundësive.
I would also be glad to receive any comments and suggestions.

P.S.: If anyone comes up with an interesting task on SELECT, feel free to write in the comments, and I'll add it to the list.

Faleminderit.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster