SQL. Érdekes feladatok

Helló, Habr!

Már több mint 3 éve tanítok SQL-t különböző képző központokban, és az egyik megfigyelésem az, hogy a hallgatók jobban elsajátítják és értik az SQL-t, ha feladatot adunk nekik, nem pedig csak mesélünk a lehetőségekről és a teoretikus alapokról.

Ebben a cikkben megosztom veletek az általam hallgatóknak házi feladatként adott feladatok listáját, és azokat a brainstormingokat, amelyeken együtt dolgozunk, ami mély és világos megértéshez vezet az SQL kapcsán.

SQL. Érdekes feladatok

Az SQL (ˈɛsˈkjuˈɛl; angolul structured query language — „strukturált lekérdezési nyelv”) egy deklaratív programozási nyelv, amelyet relációs adatbázisban való adatok létrehozására, módosítására és kezelésére használnak, a megfelelő adatbázis-kezelő rendszer által irányítva. További részletek…

Az SQL-ről különböző forrásokból lehet olvasni forrásból.
Ez a cikk nem célja, hogy SQL-t tanítson nektek a nulláról.

Nos, lássuk.

Használjuk a jól ismert HR sémát az Oracle-ben a táblázataival (További információ):

SQL. Érdekes feladatok
Megjegyzem, hogy csak SELECT feladatokat fogunk vizsgálni. Itt nincsenek DML és DDL feladatok.

Feladatok

Adatok korlátozása és rendezése

Employees tábla. Lista készítése az összes alkalmazott információjáról
Megoldás

SELECT * FROM employees

Employees tábla. Minden alkalmazott listájának lekérdezése, akinek a neve ‘David’
Megoldás

SELECT *
  FROM employees
 WHERE first_name = 'David';

Employees tábla. Minden alkalmazott listájának lekérdezése, akinek a job_id-ja ‘IT_PROG’
Megoldás

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Employees tábla. Minden alkalmazott listájának lekérdezése az 50-es osztályból (department_id), akiknél a fizetés (salary) nagyobb mint 4000
Megoldás

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

Employees tábla. Minden alkalmazott listájának lekérdezése a 20-as és a 30-as osztályból (department_id)
Megoldás

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

Employees tábla. Minden alkalmazott listájának lekérdezése, akinek a nevében az utolsó betű ‘a’
Megoldás

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

Employees tábla. Minden alkalmazott listájának lekérdezése az 50-es és 80-as osztályból (department_id), akiknek van jutalma (az commission_pct oszlop nem üres)
Megoldás

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

Employees tábla. Minden alkalmazott listájának lekérdezése, akinek a nevében legalább 2 ‘n’ betű található
Megoldás

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

Employees tábla. Minden alkalmazott listájának lekérdezése, akinek a neve hosszabb mint 4 betű
Megoldás

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

Employees tábla. Kérje le az összes munkavállaló listáját, akinek a fizetése 8000 és 9000 között van (beleértve).
Megoldás

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Employees tábla. Kérje le az összes munkavállaló listáját, akinek nevében szerepel a ‘%’ karakter.
Megoldás

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

Employees tábla. Kérje le az összes menedzser azonosítóját.
Megoldás

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Employees tábla. Kérje le a munkavállalók listáját pozícióik szerint a következő formátumban: Donald(sh_clerk).
Megoldás

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

Egysoros függvények használata az output testreszabásához.

Employees tábla. Kérje le az összes munkavállaló listáját, akinek a neve hosszabb, mint 10 karakter.
Megoldás

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

Employees tábla. Kérje le az összes munkavállaló listáját, akinek nevében szerepel a ‘b’ betű (nagy- és kisbetű érzéketlenül).
Megoldás

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

Employees tábla. Kérje le az összes munkavállalót, akinek a nevében legalább 2 darab ‘a’ betű szerepel.
Megoldás

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

Employees tábla. Kérje le az összes munkavállalót, akinek a fizetése 1000-re osztható.
Megoldás

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

Employees tábla. Kérje le a munkavállaló telefonjának első három számjegyét, ha a száma XXX.XXX.XXXX formátumú.
Megoldás

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

Departments tábla. Kérje le a részleg nevén belül az első szót, azok számára, akiknek a nevükben több mint egy szó szerepel.
Megoldás

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

Employees tábla. Kérje le a munkavállalók neveit az első és az utolsó betű nélkül.
Megoldás

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

Employees tábla. Kérje le az összes munkavállalót, akinek a neve ‘m’ betűre végződik és a neve hosszabb, mint 5 karakter.
Megoldás

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

Dual tábla. Kérje le a következő pénteki dátumot.
Megoldás

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

Employees tábla. Kérje le az összes munkavállalót, akik több mint 17 éve dolgoznak a cégnél.
Megoldás

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

Employees tábla. Kérje le az összes munkavállalót, akinek a telefonjának utolsó számjegye páratlan és három számjegyből áll, amelyeket pont választ el.
Megoldás

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

Employees táblázat. Szerezze meg az összes alkalmazott listáját, akiknél a job_id értékének ‘_’ utáni része legalább 3 karakter hosszú, de ez a érték nem egyenlő ‘CLERK’-kel.
Megoldás

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

Employees táblázat. Szerezze meg az összes alkalmazott listáját, kicserélve a PHONE_NUMBER értékében az összes ‘.’-t ‘-’-re.
Megoldás

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

Átalakító függvények és feltételes kifejezések használata

Employees táblázat. Szerezze meg az összes alkalmazott listáját, akik az hónap első napján (bármelyik) kezdték meg a munkát.
Megoldás

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

Employees táblázat. Szerezze meg az összes alkalmazott listáját, akik 2008-ban kezdtek el dolgozni.
Megoldás

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

DUAL táblázat. Mutassa a holnapi dátumot a következő formátumban: Holnap van a hónap második napja.
Megoldás

SELECT TO_CHAR (SYSDATE, 'fm""Holnap van ""Ddspth ""napja a"" Hónap')     info
  FROM DUAL;

Employees táblázat. Szerezze meg az összes alkalmazott listáját és mindegyik belépési dátumát a következő formátumban: június 21.
Megoldás

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""a"" Hónap, YYYY') hire_date
  FROM employees;

Employees táblázat. Szerezze meg az összes alkalmazott listáját, akiknek a fizetését 20%-kal megemelték. A fizetést dollárjelként mutassa.
Megoldás

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

Employees táblázat. Szerezze meg az összes alkalmazott listáját, akik 2007 februárjában kezdtek el dolgozni.
Megoldás

SELECT *
  FROM employees
 WHERE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')
                     AND LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));

SELECT *
  FROM employees
 WHERE to_char(hire_date,'MM.YYYY') = '02.2007'; 

DUAL táblázat. Kérje le a jelenlegi dátumot, + másodperc, + perc, + óra, + nap, + hónap, + év.
Megoldás

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;

Employees táblázat. Szerezze meg az összes alkalmazott listáját a teljes fizetésekkel (salary + commission_pct(%)) a következő formátumban: $24,000.00.
Megoldás

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

Employees táblázat. Szerezze meg az összes alkalmazott listáját és az információkat a bónuszfizetésről (Igen/Nem).
Megoldás

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

Employees táblázat. Szerezze meg minden alkalmazott bérszintjeit: 5000 alatti = Alacsony szint, 5000 vagy annál nagyobb és 10000 alatti = Normál szint, 10000 vagy annál nagyobb = Magas szint.
Megoldás

VÁLASSZ first_name,
       salary,
       ESET
           AMIKOR salary = 5000 ÉS salary < 10000 AKKOR 'Normál'
           EGYÉBKÉNT 'Magas'
       VÉGE salary_level
  A employees-ből;

Countries táblázat. Minden ország esetében mutasd meg a régiót, amelyben található: 1-Európa, 2-Amerika, 3-Ázsia, 4-Afrika (Join nélkül)
Megoldás

VÁLASSZ country_name country,
       DECODE (region_id,
               1, 'Európa',
               2, 'Amerika',
               3, 'Ázsia',
               4, 'Afrika',
               'Ismeretlen')
           region
  A countries-ből;

VÁLASSZ country_name
           country,
       ESET region_id
           AMIKOR 1 AKKOR 'Európa'
           AMIKOR 2 AKKOR 'Amerika'
           AMIKOR 3 AKKOR 'Ázsia'
           AMIKOR 4 AKKOR 'Afrika'
           EGYÉBKÉNT 'Ismeretlen'
       VÉGE
           region
  A countries-ből;

Aggregált Adatok Jelentése Csoport Funkciókkal

Employees táblázat. Készíts jelentést department_id alapján a legkisebb és legnagyobb fizetéssel, a legkorábbi és legkésőbbi munkába állás dátumával és a dolgozók számával. Rendezés a dolgozók száma szerint (csökkenő sorrendben)
Megoldás

  VÁLASSZ department_id,
         MIN (salary) min_salary,
         MAX (salary) max_salary,
         MIN (hire_date) min_hire_date,
         MAX (hire_date) max_hire_Date,
         COUNT (*) count
    A employees-ből
GROUP BY department_id
order by count(*) desc;

Employees táblázat. Hány dolgozó van, akinek a neve egy és ugyanazon betűvel kezdődik? Rendezés a szám szerint. Csak azok jelenjenek meg, ahol a szám nagyobb mint 1
Megoldás

VÁLASSZ SUBSTR (first_name, 1, 1) first_char, COUNT (*)
    A employees-ből
GROUP BY SUBSTR (first_name, 1, 1)
  HAVING COUNT (*) > 1
ORDER BY 2 DESC;

Employees táblázat. Hány dolgozó van, aki ugyanabban az osztályban dolgozik és azonos fizetést kap?
Megoldás

VÁLASSZ department_id, salary, COUNT (*)
    A employees-ből
GROUP BY department_id, salary
  HAVING COUNT (*) > 1;

Employees táblázat. Készíts jelentést arról, hány dolgozót vettek fel minden héten. Rendezés a szám szerint
Megoldás

VÁLASSZ TO_CHAR (hire_Date, 'Napi') nap, COUNT (*)
    A employees-ből
GROUP BY TO_CHAR (hire_Date, 'Napi')
ORDER BY 2 DESC;

Employees táblázat. Készíts jelentést arról, hány dolgozót vettek fel évenként. Rendezés a szám szerint
Megoldás

VÁLASSZ TO_CHAR (hire_date, 'Év') év, COUNT (*)
    A employees-ből
GROUP BY TO_CHAR (hire_date, 'Év');

Employees táblázat. Hány osztály van, ahol dolgozók vannak
Megoldás

VÁLASSZ COUNT (COUNT (*))     department_count
    A employees-ből
   WHERE department_id IS NOT NULL
GROUP BY department_id;

Employees táblázat. Készíts egy listát department_id-ról, ahol több mint 30 dolgozó dolgozik.
Megoldás

  VÁLASSZ department_id
    A employees-ből
GROUP BY department_id
  HAVING COUNT (*) > 30;

Employees táblázat. Készíts egy listát department_id-ról és a kerekített átlagfizetésről minden osztályban.
Megoldás

  VÁLASSZ department_id, ROUND (AVG (salary)) avg_salary
    A employees-ből
GROUP BY department_id;

Countries táblázat. Készíts egy listát region_id-ról, ahol az országnevek összes betűje több mint 60.
Megoldás

  Válassza ki a region_id-t a countries táblázatból, csoportosítva region_id szerint, HAVING SUM (LENGTH (country_name)) > 60;

Employees táblázat. Kérje el az összes department_id-t, ahol több (>1) job_id-jú munkavállalók dolgoznak.
Megoldás

  Válassza ki a department_id-t az employees táblázatból, csoportosítva department_id szerint, HAVING COUNT (DISTINCT job_id) > 1;

Employees táblázat. Kérje el azoknak a manager_id-knek a listáját, akiknek a közvetlen beosztottjaik száma több mint 5, és a beosztottjaik összes fizetése meghaladja az 50000-et.
Megoldás

  Válassza ki a manager_id-t az employees táblázatból, csoportosítva manager_id szerint, HAVING COUNT (*) > 5 AND SUM (salary) > 50000;

Employees táblázat. Kérje el azoknak a manager_id-knek a listáját, akiknek a közvetlen beosztottjaik átlagos fizetése 6000 és 9000 közé esik, és nem kapnak jutalmat (commission_pct üres).
Megoldás

  Válassza ki a manager_id-t és az AVG (salary) avg_salary-t az employees táblázatból, ahol commission_pct IS NULL, csoportosítva manager_id szerint, HAVING AVG (salary) BETWEEN 6000 AND 9000;

Employees táblázat. Kérje el a legnagyobb fizetést az összes munkavállaló között, akinek a job_id-ja a 'CLERK' szóra végződik.
Megoldás

Válassza ki a MAX (salary) max_salary-t az employees táblázatból, ahol job_id LIKE '%CLERK'; Válassza ki a MAX (salary) max_salary-t az employees táblázatból, ahol SUBSTR (job_id, -5) = 'CLERK';

Employees táblázat. Kérje el a legnagyobb fizetést az összes department átlagos fizetése között.
Megoldás

  Válassza ki a MAX (AVG (salary))-t az employees táblázatból, csoportosítva department_id szerint.

Employees táblázat. Kérje el a munkavállalók számát, akiknek azonos számú betű van a nevükben. Csak azokat mutassa, akiknek a neve hosszabb, mint 5, és a hasonló nevű munkavállalók száma több mint 20. Rendezze a neveket hosszúság szerint.
Megoldás

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

Több táblázat adatainak megjelenítése JOIN-ok segítségével.

Employees, Departments, Locations, Countries, Regions táblázat. Kérje el a régiók listáját és az egyes régiókban dolgozó munkavállalók számát.
Megoldás

  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;

Employees, Departments, Locations, Countries, Regions táblázat. Kérje el minden munkavállaló részletes információit:
First_name, Last_name, Department, Job, Street, Country, Region.
Megoldás

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

Employees táblázat. Mutassa meg azokat a menedzsereket, akiknek több mint 6 beosztottjuk van.
Megoldás

  VÁLASZ m.first_name, COUNT (*)
    A munkatársak emp csatlakozása a munkatársak man-on (emp.manager_id = man.employee_id)
GROUP BY man.first_name
  HAVING COUNT (*) > 6;

Munkatársak táblázata. Mutassa meg az összes munkatársat, akiknek nincs felettese.
Megoldás

VÁLASZ emp.first_name
  A munkatársak emp
       BAL OLDALI CSATLAKOZÁS a munkatársak man ON (emp.manager_id = man.employee_id)
 HOL man.FIRST_NAME IS NULL;

VÁLASZ first_name
  A munkatársak
 HOL manager_id IS NULL;

Munkatársak, Munka-történet táblázata. A Munkatársak táblázatban található az összes munkatárs. A Munka-történet táblázatban találhatók azok a munkatársak, akik elhagyták a céget. Készítsen jelentést az összes munkatársról és státuszukról a cégben (Jelenleg dolgozik vagy távozott a cégből a távozás dátumával).
Példa:
first_name | státusz
Jennifer | Kilépett a cégből 2006. december 31-én
Clara | Jelenleg dolgozik
Megoldás

VÁLASZ first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Kilépett a cégből"" DD ""-án"" Hónap, YYYY'),
           'Jelenleg dolgozik')
           státusz
  A munkatársak e BAL OLDALI CSATLAKOZÁS munka_történet j ON (e.employee_id = j.employee_id);

Munkatársak, Osztályok, Helyek, Országok, Régiók táblázata. Készítsen listát az európai (region_name) munkatársakról.
Megoldás

 VÁLASZ first_name
  A munkatársak
       CSATLAKOZÁS az osztályokkal a department_id-n keresztül
       CSATLAKOZÁS a helyekkel a location_id-n keresztül
       CSATLAKOZÁS az országokkal a country_id-n keresztül
       CSATLAKOZÁS a régiókkal a region_id-n keresztül
 HOL region_name = 'Európa';
 
 VÁLASZ first_name
  A munkatársak e
       CSATLAKOZÁS az osztályokkal d ON (e.department_id = d.department_id)
       CSATLAKOZÁS a helyekkel l ON (d.location_id = l.location_id)
       CSATLAKOZÁS az országokkal c ON (l.country_id = c.country_id)
       CSATLAKOZÁS a régiókkal r ON (c.region_id = r.region_id)
 HOL region_name = 'Európa';

Munkatársak, Osztályok táblázata. Mutassa meg azokat az osztályokat, ahol több mint 30 munkatárs dolgozik.
Megoldás

VÁLASZ department_name, COUNT (*)
    A munkatársak e CSATLAKOZÁS az osztályokkal d ON (e.department_id = d.department_id)
GROUP BY department_name
  HAVING COUNT (*) > 30;

Munkatársak, Osztályok táblázata. Mutassa meg az összes munkatársat, akik nem tartoznak egyetlen osztályhoz sem.
Megoldás

VÁLASZ first_name
  A munkatársak e
       BAL OLDALI CSATLAKOZÁS az osztályokkal d ON (e.department_id = d.department_id)
 HOL d.department_name IS NULL;

VÁLASZ first_name
  A munkatársak
 HOL department_id IS NULL;

Munkatársak, Osztályok táblázata. Mutassa meg az összes osztályt, ahol nincs egyetlen munkatársa sem.
Megoldás

VÁLASZ department_name
  A munkatársak e
       JOBB OLDALI CSATLAKOZÁS az osztályokkal d ON (e.department_id = d.department_id)
 HOL first_name IS NULL;

Munkatársak táblázata. Mutassa meg az összes munkatársat, akiknek nincs senki, aki alárendeltje legyen.
Megoldás

VÁLASZ man.first_name
  A munkatársak emp
       JOBB OLDALI CSATLAKOZÁS a munkatársak man ON (emp.manager_id = man.employee_id)
 HOL emp.FIRST_NAME IS NULL;

Munkatársak, Munkakörök, Osztályok táblázata. Mutassa meg a munkatársakat a következő formátumban: First_name, Job_title, Department_name.
Példa:
First_name | Munkakör | Osztály neve
Donald | Szállítás | Raktáros
Megoldás

VÁLASZ first_name, job_title, department_name
  A munkatársak e
       CSATLAKOZÁS a munkakörökkel j ON (e.job_id = j.job_id)
       CSATLAKOZÁS az osztályokkal d ON (d.department_id = e.department_id);

Munkatársak táblázata. Készítsen listát azokról a munkatársakról, akiknek a menedzserei 2005-ben kezdtek dolgozni, de ők maguk 2005 előtt vettek fel állást.
Megoldás

VÁLASZ emp.*
  A munkavállalók emp JOIN munkavállalók man ON (emp.manager_id = man.employee_id)
 HOL A TO_CHAR (man.hire_date, 'YYYY') = '2005'
       ÉS emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Munkavállalói táblázat. Készítsen listát azokról a munkavállalókról, akiknek a menedzsere január hónapban állt munkába, és a munkakör megnevezése (job_title) hosszabb mint 15 karakter.
Megoldás

VÁLASZ emp.*
  A munkavállalók emp
       JOIN munkavállalók man ON (emp.manager_id = man.employee_id)
       JOIN munkakörök j ON (emp.job_id = j.job_id)
 HOL A TO_CHAR (man.hire_date, 'MM') = '01' ÉS A HOSSZ (j.job_title) > 15;

Alkérdések használata a lekérdezések megoldására

Munkavállalói táblázat. Készítsen listát azokról a munkavállalókról, akiknek a neve a leghosszabb.
Megoldás

VÁLASZ *
  A munkavállalókból
 HOL A HOSSZ (first_name) =
       (VÁLASZ MAX (HOSSZ (first_name)) A munkavállalókból);

Munkavállalói táblázat. Készítsen listát azokról a munkavállalókról, akiknek a fizetése meghaladja az összes munkavállaló átlagfizetését.
Megoldás

VÁLASZ *
  A munkavállalókból
 HOL a fizetés > (VÁLASZ AVG (salary) A munkavállalókból);

Munkavállalói, Osztályok, Helyszínek táblázata. Készítsen listát azokról a városokról, ahol a munkavállalók összesített jövedelme a legalacsonyabb.
Megoldás

VÁLASZ city
    A munkavállalók e
         JOIN osztályok d ON (e.department_id = d.department_id)
         JOIN helyszínek l ON (d.location_id = l.location_id)
Csoportosítás város szerint
  HAVING ÖSSZESÍTÉS (salary) =
         (  VÁLASZ MIN (ÖSSZESÍTÉS (salary))
              A munkavállalók e
                   JOIN osztályok d ON (e.department_id = d.department_id)
                   JOIN helyszínek l ON (d.location_id = l.location_id)
          Csoportosítás város szerint);

Munkavállalói táblázat. Készítsen listát azokról a munkavállalókról, akiknek a menedzsere 15000-nél magasabb fizetést kap.
Megoldás

VÁLASZ *
  A munkavállalókból
 HOL a manager_id A (VÁLASZ employee_id
                        A munkavállalókból
                       HOL a fizetés > 15000)

Munkatársak, Osztályok táblázata. Mutassa meg az összes osztályt, ahol nincs egyetlen munkatársa sem.
Megoldás

VÁLASZ *
  A osztályokból
 HOL a department_id NEM A (VÁLASZ department_id
                               A munkavállalókból
                              HOL a department_id NEM NULL);

Munkavállalói táblázat. Mutassa be az összes munkavállalót, akik nem menedzserek.
Megoldás

VÁLASZ *
  A munkavállalókból
 HOL a employee_id NEM A (VÁLASZ manager_id
                             A munkavállalókból
                            HOL a manager_id NEM NULL)

Employees táblázat. Mutassa meg azokat a menedzsereket, akiknek több mint 6 beosztottjuk van.
Megoldás

VÁLASZ *
  A munkavállalókból e
 HOL (VÁLASZ COUNT (*)
          A munkavállalókból
         HOL a manager_id = e.employee_id) > 6;

Munkavállalói, Osztályok táblázata. Mutassa meg azokat a munkavállalókat, akik az IT osztályban dolgoznak.
Megoldás

VÁLASZ *
  A munkavállalókból
 HOL a department_id = (VÁLASZ department_id
                          A osztályokból
                         HOL a department_name = 'IT');

Munkatársak, Munkakörök, Osztályok táblázata. Mutassa meg a munkatársakat a következő formátumban: First_name, Job_title, Department_name.
Példa:
First_name | Munkakör | Osztály neve
Donald | Szállítás | Raktáros
Megoldás

VÁLASZ first_name,
       (VÁLASZ job_title
          A munkakörökből
         HOL a job_id = e.job_id)
           job_title,
       (VÁLASZ department_name
          A osztályokból
         HOL a department_id = e.department_id)
           department_name
  A munkavállalókból e;

Munkatársak táblázata. Készítsen listát azokról a munkatársakról, akiknek a menedzserei 2005-ben kezdtek dolgozni, de ők maguk 2005 előtt vettek fel állást.
Megoldás

VÁLASZ *
  A munkavállalókból
 HOL     manager_id A (VÁLASZ employee_id
                            A munkavállalókból
                           HOL A TO_CHAR (hire_date, 'YYYY') = '2005')
       ÉS hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Munkavállalói táblázat. Készítsen listát azokról a munkavállalókról, akiknek a menedzsere január hónapban állt munkába, és a munkakör megnevezése (job_title) hosszabb mint 15 karakter.
Megoldás

VÁLASZ *
  A munkavállalókból e
 HOL     manager_id A (VÁLASZ employee_id
                            A munkavállalókból
                           HOL A TO_CHAR (hire_date, 'MM') = '01')
       ÉS (VÁLASZ HOSSZ (job_title)
              A munkakörökből
             HOL a job_id = e.job_id) > 15;

Eddig tart.

Remélem, a feladatok érdekesek és szórakoztatóak voltak.
Ahogy lehet, kiegészítem ezt a feladatlokat.
Szívesen fogadom a megjegyzéseket és javaslatokat is.

P.S.: Ha valakinek eszébe jut egy érdekes SELECT feladat, írjon a megjegyzésekbe, hozzáteszem a listához.

Köszönöm.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster