Tere, Habr!
Juba rohkem kui 3 aastat olen õpetanud SQL-i erinevates koolituskeskustes ning üks minu tähelepanekutest on see, et õpilased omandavad ja mõistavad SQL-i paremini, kui seada neile ülesanne, mitte lihtsalt rääkida võimalustest ja teoreetilistest alustest.
Selles artiklis jagan teiega oma nimekirja ülesannetest, mida ma õpilastele kodutööks annan ja mille üle me erinevaid ajurünnakuid peame, mis viib sügava ja selge SQL-i mõistmiseni.

SQL (ˈɛsˈkjuˈɛl; inglise keeles structured query language — ‘struktureeritud päringute keel’) on deklaratiivne programmeerimiskeel, mida kasutatakse andmete loomisel, muutmisel ja haldamisel rälatsioonilises andmebaasis, mida haldab vastav andmebaasi haldussüsteem.
SQL-i kohta saab lugeda erinevatest .
Selle artikli eesmärk ei ole õpetada teid SQL-i nullist.
Nii et, lähme!
Kasutame kõigile tuntud Oracle'is koos selle tabelitega ():

Tahan märkida, et vaatame ainult SELECT ülesandeid. Siin pole DML ja DDL ülesandeid.
Ülesanded
Andmete piiramine ja järjestamine
Tabel Employees. Saage teave kõigi töötajate kohta.
Lahendus
SELECT * FROM employees
Tabel Employees. Saage nimekirja kõigist töötajatest, kelle nimi on ‘David’.
Lahendus
SELECT * FROM employees WHERE first_name = 'David';
Tabel Employees. Saage nimekirja kõigist töötajatest, kelle job_id on ‘IT_PROG’.
Lahendus
SELECT * FROM employees WHERE job_id = 'IT_PROG';
Tabel Employees. Saage nimekirja kõigist töötajatest 50. osakonnast (department_id) koos palgaga (salary), mis on üle 4000.
Lahendus
SELECT * FROM employees WHERE department_id = 50 AND salary > 4000;
Tabel Employees. Saage nimekirja kõigist töötajatest 20. ja 30. osakonnast (department_id).
Lahendus
SELECT * FROM employees WHERE department_id = 20 OR department_id = 30;
Tabel Employees. Saage nimekirja kõigist töötajatest, kelle nime viimane täht on ‘a’.
Lahendus
SELECT * FROM employees WHERE first_name LIKE '%a';
Tabel Employees. Saage nimekirja kõigist töötajatest 50. ja 80. osakonnast (department_id), kellel on boonus (komisjoniprotsendi veerus ei ole väärtus tühi).
Lahendus
SELECT * FROM employees WHERE (department_id = 50 OR department_id = 80) AND commission_pct IS NOT NULL;
Tabel Employees. Saage nimekirja kõigist töötajatest, kelle nimedes on vähemalt 2 tähte ‘n’.
Lahendus
SELECT * FROM employees WHERE first_name LIKE '%n%n%';
Tabel Employees. Saage nimekirja kõigist töötajatest, kelle nime pikkus on üle 4 tähe.
Lahendus
SELECT * FROM employees WHERE first_name LIKE '%_____%';
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle palk on vahemikus 8000 kuni 9000 (kaasa arvatud)
Lahendus
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nimes on sümbol ‘%’
Lahendus
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Töötajate tabel. Saada nimekiri kõigist juhtide ID-dest
Lahendus
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Töötajate tabel. Saada nimekiri töötajatest koos nende ametikohtadega formaadis: Donald(sh_clerk)
Lahendus
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Kasutades ühekordseid funktsioone väljundi kohandamiseks
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nime pikkus on üle 10 tähe
Lahendus
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nimes on täht ‘b’ (ilma suur-tähtedeta)
Lahendus
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nimedes on vähemalt 2 tähte ‘a’
Lahendus
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle palk on 1000 võrra jaotatav
Lahendus
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Töötajate tabel. Saada kontakttelefoni numbrist töötaja esimene 3-numbriline number, kui tema number on formaadis XXX.XXX.XXXX
Lahendus
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Osakondade tabel. Saada osakonna nime esimeses sõnast need, kelle nimedes on rohkem kui üks sõna
Lahendus
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Töötajate tabel. Saada töötajate nimed, eemaldades esimesed ja viimased tähed nimest
Lahendus
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle nime viimane täht on ‘m’ ja nimetähe pikkus on suurem kui 5
Lahendus
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name) > 5;
Dual tabel. Saada järgmise reede kuupäev
Lahendus
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kes on ettevõttes töötanud üle 17 aasta
Lahendus
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle telefoninumbri viimane number on paaritu ja koosneb 3 numbrist, mis on eraldatud punktiga
Lahendus
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle job_id väärtuses pärast ' _ ' on vähemalt 3 tähte, kuid see väärtus ei ole 'CLERK'
Lahendus
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Töötajate tabel. Saada nimekiri kõigist töötajatest, asendades PHONE_NUMBER väärtuses kõik '.' tähised '-' tähistega
Lahendus
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Kasutades konversioonifunktsioone ja tingimuslikke väljendeid
Töötajate tabel. Saada nimekiri kõigist töötajatest, kes alustasid tööd kuu esimesel päeval (ükskõik millisel)
Lahendus
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Töötajate tabel. Saada nimekiri kõigist töötajatest, kes alustasid tööd 2008. aastal
Lahendus
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
DUAL tabel. Kuvage homne kuupäev formaadis: Homme on kuu teine päev jaanuaris
Lahendus
SELECT TO_CHAR (SYSDATE, 'fm""Homme on ""Ddspth ""päev ""Kuu') info
FROM DUAL;
Töötajate tabel. Saada nimekiri kõigist töötajatest ja igaühe tööle asumise kuupäev formaadis: 21. juuni 2007
Lahendus
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""päev ""Kuu, YYYY') hire_date
FROM employees;
Töötajate tabel. Saada nimekiri töötajatest, kelle palka on suurendatud 20%. Palga kuvamine dollarimärgis
Lahendus
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kes alustasid tööd 2007. aasta veebruaris.
Lahendus
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 tabel. Kuvage praegune kuupäev + sekund, + minut, + tund, + päev, + kuu, + aasta
Lahendus
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;
Töötajate tabel. Saada nimekiri kõigist töötajatest, kelle täispalk (palk + komisjon %) on vormingus: $24,000.00
Lahendus
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Töötajate tabel. Saada nimekiri kõigist töötajatest ja teave palga boonuste olemasolu kohta (Jah / Ei)
Lahendus
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Töötajate tabel. Saada iga töötaja palga tase: Alla 5000 loetakse madalaks tasemeks, 5000 või enam ja alla 10000 loetakse normaalseks tasemeks, 10000 või enam loetakse kõrgeks tasemeks
Lahendus
SELECT first_name,
salary,
CASE
WHEN salary = 5000 AND salary < 10000 THEN 'Normaalne'
ELSE 'Kõrge'
END salary_level
FROM employees;
Tabel Countries. Näidata iga riigi piirkonda, kus ta asub: 1-Euroopa, 2-Ameerika, 3-Aasia, 4-Aafrika (ilma Joinita)
Lahendus
SELECT country_name country,
DECODE (region_id,
1, 'Euroopa',
2, 'Ameerika',
3, 'Aasia',
4, 'Aafrika',
'Tundmatu')
region
FROM countries;
SELECT country_name
country,
CASE region_id
WHEN 1 THEN 'Euroopa'
WHEN 2 THEN 'Ameerika'
WHEN 3 THEN 'Aasia'
WHEN 4 THEN 'Aafrika'
ELSE 'Tundmatu'
END
region
FROM countries;
Aruandlus Kogutud Andmete Kohta Kasutades Rühma Funktsioone
Tabel Employees. Saada aruandlus department_id kaupa, minimaalse ja maksimaalse palgaga, varase ja hilise tööleasumise kuupäevaga ning töötajate arvuga. Sordima töötajate arvu järgi (kahanevas järjekorras)
Lahendus
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;
Tabel Employees. Kui palju töötajaid, kelle nimed algavad sama tähega? Sordima arvu järgi. Näidata ainult neid, kus arv on suurem kui 1
Lahendus
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;
Tabel Employees. Kui palju töötajaid töötab samas osakonnas ja saab sama palka?
Lahendus
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Tabel Employees. Saada aruandlus, kui palju töötajaid võeti tööle igal nädalapäeval. Sordima arvu järgi
Lahendus
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Tabel Employees. Saada aruandlus, kui palju töötajaid võeti tööle aastate kaupa. Sordima arvu järgi
Lahendus
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Tabel Employees. Saada aruanne, kui palju osakondi on, kus on töötajad
Lahendus
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Tabel Employees. Saada osakondade loetelu, kus töötab rohkem kui 30 töötajat
Lahendus
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Tabel Employees. Saada osakondade loetelu ja ümardatud keskmine palk töötajatele igas osakonnas.
Lahendus
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Tabel Countries. Saada loetelu region_id summa kõigist letters, mis on country_name, kus on rohkem kui 60
Lahendus
VALI region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Tabel Employees. Saage department_id, kus töötavad mitmed (>1) job_id töötajad
Lahendus
VALI department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Tabel Employees. Saage manager_id, kelle alluvate arv on suurem kui 5 ja kõigi tema alluvate palkade summa suurem kui 50000
Lahendus
VALI manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Tabel Employees. Saage manager_id, kelle kõigi tema alluvate keskmine palk jääb vahemikku 6000 kuni 9000 ja kes ei saa boonuseid (commission_pct tühi)
Lahendus
VALI manager_id, AVG (salary) avg_salary
FROM employees
WHERE commission_pct IS NULL
GROUP BY manager_id
HAVING AVG (salary) BETWEEN 6000 AND 9000;
Tabel Employees. Saage maksimaalne palk kõigilt töötajatelt, kelle job_id lõpeb sõnaga 'CLERK'
Lahendus
VALI MAX (salary) max_salary
FROM employees
WHERE job_id LIKE '%CLERK';
VALI MAX (salary) max_salary
FROM employees
WHERE SUBSTR (job_id, -5) = 'CLERK';
Tabel Employees. Saage maksimaalne palk kõikide osakondade keskmiste palkade seas
Lahendus
VALI MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Tabel Employees. Saage töötajate arv, kellel on sama nime pikkus. Näidake vaid neid, kelle nime pikkus on suurem kui 5 ja kellel on sellise nimega töötajaid rohkem kui 20. Sorteerige nime pikkuse alusel
Lahendus
VALI LENGTH (first_name), COUNT (*)
FROM employees
GROUP BY LENGTH (first_name)
HAVING LENGTH (first_name) > 5 AND COUNT (*) > 20
ORDER BY LENGTH (first_name);
VALI LENGTH (first_name), COUNT (*)
FROM employees
WHERE LENGTH (first_name) > 5
GROUP BY LENGTH (first_name)
HAVING COUNT (*) > 20
ORDER BY LENGTH (first_name);
Andmete kuvamine mitmest tabelist kasutades JOIN-e
Tabel Employees, Departaments, Locations, Countries, Regions. Saage piirkondade nimekiri ja töötajate arv igas piirkonnas
Lahendus
VALI 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;
Tabel Employees, Departaments, Locations, Countries, Regions. Saage üksikasjalik teave iga töötaja kohta:
First_name, Last_name, Departament, Job, Street, Country, Region
Lahendus
VALI 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);
Tabel Employees. Kuvage kõik juhid, kelle alluvate arv ületab 6 töötajat
Lahendus
VALI 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;
Töötajate tabel. Näita kõiki töötajaid, kellel ei ole ülemust.
Lahendus
VALI emp.first_name
FROM employees emp
LEFT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE man.FIRST_NAME IS NULL;
VALI first_name
FROM employees
WHERE manager_id IS NULL;
Töötajate tabel, Tööajalugu. Töötajate tabelis on kõik töötajad. Tööajalugu tabelis on töötajad, kes on ettevõtte lahkunud. Saada aruanne kõigi töötajate ja nende staatuse kohta ettevõttes (Töötavad või lahkusid ettevõttest lahkumiskuupäevaga).
Näide:
first_name | staatus
Jennifer | Lahkus ettevõttest 31. detsembril 2006.
Clara | Praegu töötav
Lahendus
VALI first_name,
NVL2 (
end_date,
TO_CHAR (end_date, 'fm""Lahkunud ettevõttest"" DD ""kuupäeval"" Kuu, YYYY'),
'Praegu töötav')
staatus
FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);
Töötajate tabel, Osakonnad, Asukohad, Riigid, Regioonid. Saada nimekiri töötajatest, kes elavad Euroopas (region_name).
Lahendus
VALI 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';
VALI 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';
Töötajate tabel, Osakonnad. Näita kõiki osakondi, kus töötab rohkem kui 30 töötajat.
Lahendus
VALI department_name, COUNT (*)
FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Töötajate tabel, Osakonnad. Näita kõiki töötajaid, kes ei kuulu ühtegi osakonda.
Lahendus
VALI first_name
FROM employees e
LEFT JOIN departments d ON (e.department_id = d.department_id)
WHERE d.department_name IS NULL;
VALI first_name
FROM employees
WHERE department_id IS NULL;
Töötajate tabel, Osakonnad. Näita kõiki osakondi, kus ei ole ühtegi töötajat.
Lahendus
VALI department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Töötajate tabel. Näita kõiki töötajaid, kellel ei ole alluvaid.
Lahendus
VALI man.first_name
FROM employees emp
RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IS NULL;
Töötajate tabel, Töökoht, Osakonnad. Näita töötajaid vormingus: First_name, Job_title, Department_name.
Näide:
First_name | Job_title | Department_name
Donald | Laondus | Klientlaondus
Lahendus
VALI 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);
Töötajate tabel. Saada nimekiri töötajatest, kelle ülemused on tööle asunud 2005. aastal, kuid need töötajad ise on tööle asunud enne 2005. aastat.
Lahendus
VALI emp.*
KASUTA töötajad emp LIITU töötajatega man KAS (emp.manager_id = man.employee_id)
KUS TO_CHAR (man.hire_date, 'YYYY') = '2005'
JA emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');
Töötajate tabel. Saada nimekiri töötajatest, kelle juhid alustasid tööd jaanuaris igal aastal ja kelle ametinimetuse pikkus on üle 15 tähemärgi.
Lahendus
VALI emp.*
KASUTA töötajad emp
LIITU töötajatega man KAS (emp.manager_id = man.employee_id)
LIITU töödega j KAS (emp.job_id = j.job_id)
KUS TO_CHAR (man.hire_date, 'MM') = '01' JA LENGTH (j.job_title) > 15;
Alamklauslite kasutamine päringute lahendamiseks
Töötajate tabel. Saada nimekiri töötajatest, kellel on kõige pikem nimi.
Lahendus
VALI *
KASUTA töötajad
KUS LENGTH (first_name) =
(VALI MAX (LENGTH (first_name)) KASUTA töötajad);
Töötajate tabel. Saada nimekiri töötajatest, kelle palk on kõrgem kui kõigi töötajate keskmine palk.
Lahendus
VALI *
KASUTA töötajad
KUS salary > (VALI AVG (salary) KASUTA töötajad);
Töötajate, osakondade, asukohtade tabel. Saada linn, kus töötajad teenivad kokku kõige vähem.
Lahendus
VALI linn
KASUTA töötajad e
LIITU osakondadega d KAS (e.department_id = d.department_id)
LIITU asukohtadega l KAS (d.location_id = l.location_id)
RÜHMITA LINN
HAVING SUM (salary) =
( VALI MIN (SUM (salary))
KASUTA töötajad e
LIITU osakondadega d KAS (e.department_id = d.department_id)
LIITU asukohtadega l KAS (d.location_id = l.location_id)
RÜHMITA LINN);
Töötajate tabel. Saada nimekiri töötajatest, kelle juhid teenivad rohkem kui 15000.
Lahendus
VALI *
KASUTA töötajad
KUS manager_id IN (VALI employee_id
KASUTA töötajad
KUS salary > 15000)
Töötajate tabel, Osakonnad. Näita kõiki osakondi, kus ei ole ühtegi töötajat.
Lahendus
VALI *
KASUTA osakonnad
KUS department_id NOT IN (VALI department_id
KASUTA töötajad
KUS department_id IS NOT NULL);
Töötajate tabel. Näita kõiki töötajaid, kes ei ole juhid.
Lahendus
VALI *
KASUTA töötajad
KUS employee_id NOT IN (VALI manager_id
KASUTA töötajad
KUS manager_id IS NOT NULL)
Tabel Employees. Kuvage kõik juhid, kelle alluvate arv ületab 6 töötajat
Lahendus
VALI *
KASUTA töötajad e
KUS (VALI COUNT (*)
KASUTA töötajad
KUS manager_id = e.employee_id) > 6;
Töötajate, osakondade tabel. Näita töötajaid, kes töötavad IT osakonnas.
Lahendus
VALI *
KASUTA töötajad
KUS department_id = (VALI department_id
KASUTA osakonnad
KUS department_name = 'IT');
Töötajate tabel, Töökoht, Osakonnad. Näita töötajaid vormingus: First_name, Job_title, Department_name.
Näide:
First_name | Job_title | Department_name
Donald | Laondus | Klientlaondus
Lahendus
VALI first_name,
(VALI job_title
KASUTA tööde
KUS job_id = e.job_id)
job_title,
(VALI department_name
KASUTA osakonnad
KUS department_id = e.department_id)
department_name
KASUTA töötajad e;
Töötajate tabel. Saada nimekiri töötajatest, kelle ülemused on tööle asunud 2005. aastal, kuid need töötajad ise on tööle asunud enne 2005. aastat.
Lahendus
VALI *
KASUTA töötajad
KUS manager_id IN (VALI employee_id
KASUTA töötajad
KUS TO_CHAR (hire_date, 'YYYY') = '2005')
JA hire_date < TO_DATE ('01012005', 'DDMMYYYY');
Töötajate tabel. Saada nimekiri töötajatest, kelle juhid alustasid tööd jaanuaris igal aastal ja kelle ametinimetuse pikkus on üle 15 tähemärgi.
Lahendus
VALI *
KASUTA töötajad e
KUS manager_id IN (VALI employee_id
KASUTA töötajad
KUS TO_CHAR (hire_date, 'MM') = '01')
JA (VALI LENGTH (job_title)
KASUTA tööde
KUS job_id = e.job_id) > 15;
Sellega on kõik.
Loodan, et ülesanded olid huvitavad ja kaasahaaravad.
Püüan seda ülesannete nimekirja vajadusel täiendada.
Olen ka avatud igasuguste kommentaaride ja ettepanekute suhtes.
P.S.: Kui kellelgi tuleb meelde huvitav ülesanne SELECT-i kohta, kirjutage kommentaaridesse, lisan nimekirja.
Aitäh.
Allikas: habr.com
