Hallo, Habr!
Al mear as 3 jier lear ik SQL yn ferskate trainingsintra, en ien fan myn observaasjes is dat studinten SQL better behearskje en begripe as se in taak krije, en net allinich ferteld wurde oer de mooglikheden en teoretyske fûneminten.
Yn dit artikel sil ik myn list mei problemen mei jo diele dy't ik as húswurk oan studinten jou en wêrop wy ferskate soarten brainstorms útfiere, wat liedt ta in djip en dúdlik begryp fan SQL.
SQL (ˈɛsˈkjuˈɛl; Ingelsk strukturearre query-taal) is in deklarative programmeartaal dy't brûkt wurdt om gegevens te meitsjen, te wizigjen en te behearjen yn in relasjonele databank beheard troch in passend databankbehearsysteem.
Jo kinne lêze oer SQL út ferskate
Dit artikel is net bedoeld om jo SQL fanôf it begjin te learen.
Dat litte we gean.
Wy sille it bekende brûke
Ik merk op dat wy allinich SELECT-taken sille beskôgje. D'r binne hjir gjin DML- of DDL-taken.
taken
Gegevens beheine en sortearje
Meiwurkers tabel. Krij in list mei ynformaasje oer alle meiwurkers
beslút
SELECT * FROM employees
Meiwurkers tabel. Krij in list mei alle meiwurkers mei de namme 'David'
beslút
SELECT *
FROM employees
WHERE first_name = 'David';
Meiwurkers tabel. Krij in list fan alle meiwurkers mei job_id lyk oan 'IT_PROG'
beslút
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Meiwurkers tabel. Krij in list fan alle meiwurkers fan 'e 50e ôfdieling (department_id) mei in salaris (salaris) grutter dan 4000
beslút
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Meiwurkers tabel. Krij in list mei alle meiwurkers fan 'e 20e en 30e ôfdieling (department_id)
beslút
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Meiwurkers tabel. Krij in list fan alle meiwurkers waans lêste letter yn har namme 'a' is
beslút
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Meiwurkers tabel. Krij in list mei alle meiwurkers fan 'e 50e en 80e ôfdieling (department_id) dy't in bonus hawwe (de wearde yn' e kolom commission_pct is net leech)
beslút
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Meiwurkers tabel. Krij in list mei alle meiwurkers waans nammen op syn minst 2 letters 'n' befetsje
beslút
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Meiwurkers tabel. Krij in list fan alle meiwurkers waans nammen langer dan 4 letters binne
beslút
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Meiwurkers tabel. Krij in list mei alle meiwurkers waans salaris yn it berik is fan 8000 oant 9000 (ynklusyf)
beslút
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Meiwurkers tabel. Krij in list mei alle meiwurkers waans namme it symboal '%' befettet
beslút
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Meiwurkers tabel. Krij in list mei alle manager-ID's
beslút
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Meiwurkers tabel. Krij in list mei meiwurkers mei har posysjes yn it formaat: Donald(sh_clerk)
beslút
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
It brûken fan funksjes mei ien rige om útfier oan te passen
Meiwurkers tabel. Krij in list fan alle meiwurkers waans nammen langer dan 10 letters binne
beslút
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Meiwurkers tabel. Krij in list fan alle meiwurkers dy't de letter 'b' yn har namme hawwe (gefoelich foar haadletters)
beslút
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Meiwurkers tabel. Krij in list mei alle meiwurkers waans nammen op syn minst 2 letters 'a' befetsje
beslút
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Meiwurkers tabel. Krij in list fan alle meiwurkers waans salaris in mearfâld fan 1000 is
beslút
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Meiwurkers tabel. Krij it earste 3-sifersnûmer fan it telefoannûmer fan in meiwurker as syn nûmer yn it formaat XXX.XXX.XXXX is
beslút
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Ofdielings tabel. Krij it earste wurd fan 'e ôfdielingsnamme foar dyjingen dy't mear as ien wurd yn' e namme hawwe
beslút
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Meiwurkers tabel. Krij meiwurkersnammen sûnder foar- en lêste letter yn namme
beslút
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Meiwurkers tabel. Krij in list mei alle meiwurkers waans lêste letter yn har namme 'm' is en waans namme langer is dan 5
beslút
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Tabel Dual. Get folgjende freed datum
beslút
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Meiwurkers tabel. Krij in list fan alle meiwurkers dy't mear as 17 jier foar it bedriuw wurke hawwe
beslút
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Meiwurkers tabel. Krij in list mei alle meiwurkers waans lêste sifer fan har telefoannûmer ûneven is en bestiet út 3 nûmers skieden troch in stip
beslút
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Meiwurkers tabel. Krij in list mei alle meiwurkers waans job_id-wearde nei it teken '_' op syn minst 3 tekens hat, mar dizze wearde nei de '_' is net gelyk oan 'CLERK'
beslút
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Meiwurkers tabel. Krij in list mei alle meiwurkers troch alle '.' te ferfangen yn 'e PHONE_NUMBER-wearde op '-'
beslút
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Gebrûk fan konverzjefunksjes en betingsten útdrukkingen
Meiwurkers tabel. Krij in list fan alle meiwurkers dy't op 'e earste dei fan' e moanne oan it wurk kamen (elke)
beslút
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Meiwurkers tabel. Krij in list fan alle meiwurkers dy't yn 2008 oan it wurk kamen
beslút
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
Tabel DUAL. Lit de datum fan moarn sjen yn it formaat: Moarn is it twadde dei fan jannewaris
beslút
SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info
FROM DUAL;
Meiwurkers tabel. Krij in list mei alle meiwurkers en de datum dat elke meiwurker oan it wurk kaam yn it formaat: 21 juny 2007
beslút
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
FROM employees;
Meiwurkers tabel. Krij in list mei meiwurkers mei ferhege salarissen mei 20%. Lit salaris sjen mei dollarteken
beslút
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Meiwurkers tabel. Krij in list fan alle meiwurkers dy't yn febrewaris 2007 begûnen te wurkjen.
beslút
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';
Tabel DUAL. Bring de aktuele datum, + sekonde, + minút, + oere, + dei, + moanne, + jier út
beslút
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;
Meiwurkers tabel. Krij in list fan alle meiwurkers mei folsleine salarissen (salaris + commission_pct(%)) yn it formaat: $24,000.00
beslút
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Meiwurkers tabel. Krij in list mei alle meiwurkers en ynformaasje oer de beskikberens fan salarisbonussen (Ja/Nee)
beslút
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Meiwurkers tabel. Krij it salarisnivo fan elke meiwurker: Minder dan 5000 wurdt beskôge as leech nivo, grutter as of gelyk oan 5000 en minder dan 10000 wurdt beskôge as normaal nivo, Mear as of gelyk oan 10000 wurdt beskôge as heech nivo
beslút
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;
Tabel Lannen. Lit foar elk lân de regio sjen wêryn it leit: 1-Jeropa, 2-Amearika, 3-Aazje, 4-Afrika (sûnder lid)
beslút
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;
Aggregearre gegevens rapportearje mei de groepsfunksjes
Meiwurkers tabel. Untfang in rapport troch department_id mei it minimum en maksimum salaris, iere en lette datums fan oankomst op it wurk en it oantal meiwurkers. Sortearje op oantal meiwurkers (ôfnimmend)
beslút
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;
Meiwurkers tabel. Hoefolle meiwurkers waans nammen begjinne mei deselde letter? Sortearje op kwantiteit. Lit allinich dejingen sjen wêr't de kwantiteit grutter is as 1
beslút
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;
Meiwurkers tabel. Hoefolle meiwurkers wurkje yn deselde ôfdieling en krije itselde salaris?
beslút
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Meiwurkers tabel. Krij in rapport fan hoefolle meiwurkers waarden ynhierd op elke dei fan 'e wike. Sortearje op kwantiteit
beslút
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Meiwurkers tabel. Krij in rapport fan hoefolle meiwurkers per jier ynhierd binne. Sortearje op kwantiteit
beslút
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Meiwurkers tabel. Krij it oantal ôfdielingen dy't meiwurkers hawwe
beslút
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Meiwurkers tabel. Krij in list mei department_ids dy't mear as 30 meiwurkers hawwe
beslút
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Meiwurkers tabel. Krij in list mei department_ids en it ôfrûne gemiddelde salaris fan meiwurkers yn elke ôfdieling.
beslút
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Tabel Lannen. Krij de list region_id de som fan alle letters fan alle lânnammen wêryn mear as 60 binne
beslút
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Meiwurkers tabel. Krij in list mei ôfdielings-id's wêryn meiwurkers fan ferskate (>1) job_ids wurkje
beslút
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Meiwurkers tabel. Krij in list mei manager_ids wêrfan it oantal ûndergeskikten grutter is as 5 en de som fan alle salarissen fan syn ûndergeskikten grutter is as 50000
beslút
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Meiwurkers tabel. Krij in list mei manager_ids waans gemiddelde salaris fan al syn ûndergeskikten yn it berik fan 6000 oant 9000 is en dy't gjin bonussen ûntfange (commission_pct is leech)
beslút
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;
Meiwurkers tabel. Krij it maksimale salaris fan alle wurknimmers job_id dat einiget mei it wurd 'CLERK'
beslút
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';
Meiwurkers tabel. Krij it maksimale salaris ûnder alle gemiddelde salarissen foar de ôfdieling
beslút
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Meiwurkers tabel. Krij it oantal meiwurkers mei itselde oantal letters yn har namme. Lit tagelyk allinnich dejingen sjen waans nammelange is mear as 5 en it oantal meiwurkers mei deselde namme is mear as 20. Sortearje op namme lingte
beslút
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);
Gegevens werjaan fan meardere tabellen mei Joins
Tabel Meiwurkers, ôfdielings, lokaasjes, lannen, regio. Krij in list mei regio's en it oantal meiwurkers yn elke regio
beslút
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;
Tabel Meiwurkers, ôfdielings, lokaasjes, lannen, regio. Krij detaillearre ynformaasje oer elke meiwurker:
First_name, Last_name, Department, Job, Street, Country, Region
beslút
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);
Meiwurkers tabel. Lit alle managers sjen dy't mear as 6 meiwurkers hawwe ûndergeskikt oan harren
beslút
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;
Meiwurkers tabel. Lit alle meiwurkers sjen dy't har net melde
beslút
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;
Tabel Meiwurkers, Job_history. De Employee tafel bewarret alle meiwurkers. De tabel Job_history bewarret meiwurkers dy't it bedriuw ferlitten hawwe. Krij in rapport oer alle meiwurkers en har status yn it bedriuw (wurket of ferliet it bedriuw mei de datum fan fertrek)
Foarbyld:
foarnamme | status
Jennifer | Ferliet it bedriuw op 31 desimber 2006
Clara | Op it stuit wurket
beslút
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);
Tabel Meiwurkers, ôfdielings, lokaasjes, lannen, regio. Krij in list mei meiwurkers dy't yn Europa wenje (regio_namme)
beslút
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';
Tabel Meiwurkers, ôfdielings. Lit alle ôfdielingen sjen mei mear as 30 meiwurkers
beslút
SELECT department_name, COUNT (*)
FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Tabel Meiwurkers, ôfdielings. Lit alle meiwurkers sjen dy't net yn elke ôfdieling binne
beslút
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;
Tabel Meiwurkers, ôfdielings. Lit alle ôfdielingen sjen wêryn gjin meiwurkers binne
beslút
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Meiwurkers tabel. Lit alle meiwurkers sjen dy't gjinien ûndergeskikt hawwe oan har
beslút
SELECT man.first_name
FROM employees emp
RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IS NULL;
Tabel Meiwurkers, banen, ôfdielings. Lit meiwurkers sjen yn it formaat: First_name, Job_title, Department_name.
Foarbyld:
Foarnamme | Job_title | Department_name
Donald | Skipfeart | Klerk Shipping
beslút
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);
Meiwurkers tabel. Krij in list mei meiwurkers waans managers yn 2005 in baan krigen, mar tagelyk krigen dizze meiwurkers sels foar 2005 in baan
beslút
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');
Meiwurkers tabel. Krij in list mei meiwurkers waans managers in baan krigen hawwe yn jannewaris fan elk jier en de job_title lingte fan dizze meiwurkers is mear dan 15 karakters
beslút
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;
Subqueries brûke om fragen op te lossen
Meiwurkers tabel. Krij in list mei meiwurkers mei de langste namme.
beslút
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Meiwurkers tabel. Krij in list mei meiwurkers mei in salaris grutter dan it gemiddelde salaris fan alle meiwurkers.
beslút
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Meiwurkers, ôfdielings, lokaasjes tabel. Krij de stêd wêryn meiwurkers yn totaal it minste fertsjinje.
beslút
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);
Meiwurkers tabel. Krij in list mei meiwurkers waans manager in salaris fan mear as 15000 krijt.
beslút
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Tabel Meiwurkers, ôfdielings. Lit alle ôfdielingen sjen wêryn gjin meiwurkers binne
beslút
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Meiwurkers tabel. Lit alle meiwurkers sjen dy't gjin managers binne
beslút
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Meiwurkers tabel. Lit alle managers sjen dy't mear as 6 meiwurkers hawwe ûndergeskikt oan harren
beslút
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Tabel Meiwurkers, ôfdielings. Lit meiwurkers sjen dy't wurkje yn 'e IT-ôfdieling
beslút
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Tabel Meiwurkers, banen, ôfdielings. Lit meiwurkers sjen yn it formaat: First_name, Job_title, Department_name.
Foarbyld:
Foarnamme | Job_title | Department_name
Donald | Skipfeart | Klerk Shipping
beslút
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;
Meiwurkers tabel. Krij in list mei meiwurkers waans managers yn 2005 in baan krigen, mar tagelyk krigen dizze meiwurkers sels foar 2005 in baan
beslút
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');
Meiwurkers tabel. Krij in list mei meiwurkers waans managers in baan krigen hawwe yn jannewaris fan elk jier en de job_title lingte fan dizze meiwurkers is mear dan 15 karakters
beslút
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;
Dat is alles foar no.
Ik hoopje dat de taken ynteressant en spannend wiene.
Ik sil safolle mooglik tafoegje oan dizze list mei taken.
Ik sil ek bliid wêze om alle opmerkingen en suggestjes te ûntfangen.
PS: As immen komt mei in nijsgjirrige SELECT taak, skriuw dan yn 'e opmerkingen en ik sil it tafoegje oan' e list.
Спасибо.
Boarne: www.habr.com