Hallo, Habr!
Al meer dan 3 jaar geef ik SQL-trainingen bij verschillende trainingscentra. Een van mijn observaties is dat studenten SQL beter beheersen en begrijpen als ze taken krijgen, in plaats van alleen informatie over de mogelijkheden en de theoretische basis te horen.
In dit artikel deel ik mijn lijst met taken die ik aan studenten geef als huiswerk en waar we verschillende brainstormsessies over houden, wat leidt tot een diepgaand en duidelijk begrip van SQL.

SQL (ĖÉsĖkjuĖÉl; Engels: structured query language ā 'gestructureerde querytaal') is een declaratieve programmeertaal die wordt gebruikt voor het creĆ«ren, wijzigen en beheren van gegevens in een relationele database, beheerd door een overeenkomstig databasebeheersysteem.
Je kunt meer over SQL lezen uit verschillende bronnen. .
Dit artikel heeft niet als doel je SQL vanaf nul te leren.
Laten we beginnen.
We zullen gebruikmaken van de bekende in Oracle met zijn tabellen ():

Ik wil opmerken dat we alleen SELECT-taken zullen bekijken. Er zijn geen taken voor DML en DDL.
Taken
Data Beperken en Sorteren
Tabel Employees. Verkrijg een lijst met informatie over alle medewerkers.
Oplossing
SELECT * FROM employees
Tabel Employees. Verkrijg een lijst van alle medewerkers met de naam 'David'.
Oplossing
SELECT *
FROM employees
WHERE first_name = 'David';
Tabel Employees. Verkrijg een lijst van alle medewerkers met job_id gelijk aan 'IT_PROG'.
Oplossing
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Tabel Employees. Verkrijg een lijst van alle medewerkers van afdeling 50 (department_id) met een salaris (salary) hoger dan 4000.
Oplossing
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Tabel Employees. Verkrijg een lijst van alle medewerkers van afdeling 20 en afdeling 30 (department_id).
Oplossing
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Tabel Employees. Verkrijg een lijst van alle medewerkers waarvan de laatste letter van de naam 'a' is.
Oplossing
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Tabel Employees. Verkrijg een lijst van alle medewerkers van afdeling 50 en afdeling 80 (department_id) die een bonus hebben (waarde in de kolom commission_pct is niet leeg).
Oplossing
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Tabel Employees. Verkrijg een lijst van alle medewerkers met minimaal 2 letters 'n' in hun naam.
Oplossing
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Tabel Employees. Verkrijg een lijst van alle medewerkers waarvan de naam langer is dan 4 letters.
Oplossing
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens salaris tussen 8000 en 9000 ligt (inclusief)
Oplossing
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens naam een symbool ā%ā bevat
Oplossing
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Tabel Medewerkers. Verkrijg een lijst van alle ID's van managers
Oplossing
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Tabel Medewerkers. Verkrijg een lijst van werknemers met hun functies in het formaat: Donald(sh_clerk)
Oplossing
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Gebruik van Single-Row Functies om Output aan te passen
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens naam langer is dan 10 letters
Oplossing
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens naam de letter ābā bevat (zonder hoofdletters)
Oplossing
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens naam minimaal 2 letters āaā bevat
Oplossing
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens salaris een veelvoud van 1000 is
Oplossing
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Tabel Medewerkers. Verkrijg de eerste 3 cijfers van het telefoonnummer van de medewerker als het nummer in het formaat XXX.XXX.XXXX is
Oplossing
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Tabel Afdelingen. Verkrijg het eerste woord van de naam van de afdeling voor degenen wiens naam meer dan ƩƩn woord bevat
Oplossing
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Tabel Medewerkers. Verkrijg de namen van medewerkers zonder de eerste en laatste letter van de naam
Oplossing
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens laatste letter in de naam een āmā is en die langer zijn dan 5 letters
Oplossing
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name) > 5;
Tabel Dual. Verkrijg de datum van de volgende vrijdag
Oplossing
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers die langer dan 17 jaar in het bedrijf werken
Oplossing
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Tabel Medewerkers. Verkrijg een lijst van alle medewerkers wiens laatste cijfer van het telefoonnummer oneven is en bestaat uit 3 cijfers gescheiden door een punt
Oplossing
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Tabel Werknemers. Verkrijg een lijst van alle werknemers waarvan de waarde van job_id na het teken '_' minimaal 3 karakters heeft, maar deze waarde na '_' is niet gelijk aan 'CLERK'
Oplossing
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Tabel Werknemers. Verkrijg een lijst van alle werknemers door in de waarde PHONE_NUMBER alle '.' te vervangen door '-'
Oplossing
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Gebruik Conversiefuncties en Voorwaardelijke Expressies
Tabel Werknemers. Verkrijg een lijst van alle werknemers die op de eerste dag van de maand (om het even welke) zijn begonnen
Oplossing
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Tabel Werknemers. Verkrijg een lijst van alle werknemers die in 2008 zijn begonnen
Oplossing
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
Tabel DUAL. Toon de datum van morgen in het formaat: Morgen is de tweede dag van januari
Oplossing
SELECT TO_CHAR (SYSDATE, 'fm""Morgen is ""Ddspth ""dag van"" Maand') info
FROM DUAL;
Tabel Werknemers. Verkrijg een lijst van alle werknemers en de datum waarop ze zijn begonnen in het formaat: 21e van juni 2007
Oplossing
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""van"" Maand, YYYY') hire_date
FROM employees;
Tabel Werknemers. Verkrijg een lijst van werknemers met verhoogde salarissen met 20%. Toon het salaris met het dollar teken
Oplossing
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Tabel Werknemers. Verkrijg een lijst van alle werknemers die in februari 2007 zijn begonnen.
Oplossing
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. Toon de actuele datum, + seconde, + minuut, + uur, + dag, + maand, + jaar
Oplossing
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;
Tabel Werknemers. Verkrijg een lijst van alle werknemers met volledige salarissen (salary + commission_pct(%)) in het formaat: $24,000.00
Oplossing
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Tabel Werknemers. Verkrijg een lijst van alle werknemers en informatie over de aanwezigheid van bonussen bij het salaris (Ja/Nee)
Oplossing
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Tabel Werknemers. Verkrijg het salarispunt van elke werknemer: Minder dan 5000 wordt als laag niveau beschouwd, 5000 of meer en minder dan 10000 wordt als normaal niveau beschouwd, 10000 of meer wordt als hoog niveau beschouwd
Oplossing
SELECT first_name,
salary,
CASE
WHEN salary = 5000 AND salary < 10000 THEN 'Normaal'
ELSE 'Hoog'
END salary_level
FROM employees;
Tabel Countries. Toon voor elk land de regio waarin het zich bevindt: 1-Europa, 2-Amerika, 3-Aziƫ, 4-Afrika (zonder Join)
Oplossing
SELECT country_name country,
DECODE (region_id,
1, 'Europa',
2, 'Amerika',
3, 'Aziƫ',
4, 'Afrika',
'Onbekend')
region
FROM countries;
SELECT country_name
country,
CASE region_id
WHEN 1 THEN 'Europa'
WHEN 2 THEN 'Amerika'
WHEN 3 THEN 'Aziƫ'
WHEN 4 THEN 'Afrika'
ELSE 'Onbekend'
END
region
FROM countries;
Rapporteren van Geaggregeerde Gegevens met behulp van Groeperingsfuncties
Tabel Employees. Verkrijg een rapport per department_id met het minimum en maximum salaris, de vroegste en laatste datum van indiensttreding en het aantal medewerkers. Sorteer op het aantal medewerkers (aflopend)
Oplossing
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. Hoeveel medewerkers hebben een naam die met dezelfde letter begint? Sorteer op aantal. Toon alleen die met een aantal groter dan 1
Oplossing
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. Hoeveel medewerkers werken in dezelfde afdeling en hebben hetzelfde salaris?
Oplossing
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Tabel Employees. Verkrijg een rapport over hoeveel medewerkers elke dag van de week zijn aangenomen. Sorteer op aantal
Oplossing
SELECT TO_CHAR (hire_Date, 'Day') dag, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Tabel Employees. Verkrijg een rapport over hoeveel medewerkers per jaar zijn aangenomen. Sorteer op aantal
Oplossing
SELECT TO_CHAR (hire_date, 'YYYY') jaar, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Tabel Employees. Verkrijg het aantal afdelingen waarin medewerkers zijn.
Oplossing
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Tabel Employees. Verkrijg een lijst van department_id waarin meer dan 30 medewerkers werken
Oplossing
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Tabel Employees. Verkrijg een lijst van department_id en het afgeronde gemiddelde salaris van medewerkers in elke afdeling.
Oplossing
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Tabel Countries. Verkrijg een lijst van region_id en de som van alle letters van country_name waarbij meer dan 60 zijn.
Oplossing
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Tabel Werknemers. Verkrijg een lijst van department_id's waar werknemers met meerdere (>1) job_id's werken.
Oplossing
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Tabel Werknemers. Verkrijg een lijst van manager_id's met meer dan 5 ondergeschikten en een totaal salaris van die ondergeschikten hoger dan 50000.
Oplossing
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Tabel Werknemers. Verkrijg een lijst van manager_id's waarvan het gemiddelde salaris van alle ondergeschikten tussen 6000 en 9000 ligt en die geen bonussen ontvangen (commission_pct is leeg).
Oplossing
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;
Tabel Werknemers. Verkrijg het maximale salaris van alle medewerkers met een job_id die eindigt op het woord 'CLERK'.
Oplossing
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';
Tabel Werknemers. Verkrijg het maximale salaris van alle gemiddelde salarissen per afdeling.
Oplossing
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Tabel Werknemers. Verkrijg het aantal medewerkers met hetzelfde aantal letters in de naam. Toon alleen diegenen met een naam langer dan 5 en meer dan 20 medewerkers met dezelfde naam. Sorteer op naamlengte.
Oplossing
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 weergeven van meerdere tabellen met behulp van joins.
Tabel Werknemers, Afdelingen, Locaties, Landen, Regio's. Verkrijg een lijst van regio's en het aantal medewerkers in elke regio.
Oplossing
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 Werknemers, Afdelingen, Locaties, Landen, Regio's. Verkrijg gedetailleerde informatie over elke medewerker:
Voornaam, Achternaam, Afdeling, Baan, Straat, Land, Regio.
Oplossing
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);
Tabel Werknemers. Toon alle managers die meer dan 6 ondergeschikten hebben.
Oplossing
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;
Tabel Medewerkers. Toon alle medewerkers die aan niemand rapporteren
Oplossing
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 Medewerkers, Job_history. In de tabel Employee worden alle medewerkers opgeslagen. In de tabel Job_history staan medewerkers die het bedrijf hebben verlaten. Verkrijg een rapport over alle medewerkers en hun status in het bedrijf (Werkt nog of heeft het bedrijf verlaten met vertrekdatum)
Voorbeeld:
first_name | status
Jennifer | Heeft het bedrijf verlaten op 31 december 2006
Clara | Huidig werkzaam
Oplossing
SELECT first_name,
NVL2 (
end_date,
TO_CHAR (end_date, 'fm""Heeft het bedrijf verlaten op"" DD ""van"" Maand, YYYY'),
'Huidig werkzaam')
status
FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);
Tabel Medewerkers, Afdelingen, Locaties, Landen, Regio's. Verkrijg een lijst van medewerkers die in Europa wonen (region_name)
Oplossing
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 = 'Europa';
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 = 'Europa';
Tabel Medewerkers, Afdelingen. Toon alle afdelingen waar meer dan 30 medewerkers werken
Oplossing
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 Medewerkers, Afdelingen. Toon alle medewerkers die in geen enkele afdeling zijn opgenomen
Oplossing
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 Medewerkers, Afdelingen. Toon alle afdelingen zonder enkele medewerker
Oplossing
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Tabel Medewerkers. Toon alle medewerkers die niemand onder zich hebben
Oplossing
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 Medewerkers, Banen, Afdelingen. Toon medewerkers in het formaat: First_name, Job_title, Department_name.
Voorbeeld:
First_name | Job_title | Department_name
Donald | Verzendafdeling | Verzendmedewerker
Oplossing
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);
Tabel Medewerkers. Verkrijg een lijst van medewerkers wiens managers in 2005 zijn aangenomen, terwijl deze medewerkers zelf voor 2005 zijn aangenomen
Oplossing
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');
Tabel Employees. Verkrijg een lijst van werknemers wiens managers in januari van elk jaar zijn begonnen en wiens job_title langer is dan 15 tekens.
Oplossing
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 gebruiken om queries op te lossen
Tabel Employees. Verkrijg een lijst van werknemers met de langste naam.
Oplossing
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Tabel Employees. Verkrijg een lijst van werknemers wiens salaris hoger is dan het gemiddelde salaris van alle werknemers.
Oplossing
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Tabel Employees, Departments, Locations. Verkrijg de stad waar werknemers gezamenlijk het minste verdienen.
Oplossing
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);
Tabel Employees. Verkrijg een lijst van werknemers wiens manager meer dan 15000 verdient.
Oplossing
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Tabel Medewerkers, Afdelingen. Toon alle afdelingen zonder enkele medewerker
Oplossing
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Tabel Employees. Toon alle werknemers die geen managers zijn.
Oplossing
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Tabel Werknemers. Toon alle managers die meer dan 6 ondergeschikten hebben.
Oplossing
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Tabel Employees, Departaments. Toon werknemers die in de IT-afdeling werken
Oplossing
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Tabel Medewerkers, Banen, Afdelingen. Toon medewerkers in het formaat: First_name, Job_title, Department_name.
Voorbeeld:
First_name | Job_title | Department_name
Donald | Verzendafdeling | Verzendmedewerker
Oplossing
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;
Tabel Medewerkers. Verkrijg een lijst van medewerkers wiens managers in 2005 zijn aangenomen, terwijl deze medewerkers zelf voor 2005 zijn aangenomen
Oplossing
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');
Tabel Employees. Verkrijg een lijst van werknemers wiens managers in januari van elk jaar zijn begonnen en wiens job_title langer is dan 15 tekens.
Oplossing
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 voorlopig alles.
Ik hoop dat de taken interessant en boeiend waren.
Ik zal proberen deze lijst met taken aan te vullen waar mogelijk.
Ik sta ook open voor opmerkingen en suggesties.
P.S.: Als iemand een interessante SELECT-opdracht in gedachten heeft, laat het dan weten in de reacties, ik voeg het toe aan de lijst.
We wachten op je in onze
Bron: habr.com
