Witaj, Habro!
Od ponad 3 lat prowadzę zajęcia z SQL w różnych ośrodkach szkoleniowych i jedną z moich obserwacji jest to, że uczniowie lepiej opanowują i rozumieją SQL, jeśli dostaną zadanie, a nie tylko powiedzą mu o możliwościach i podstawach teoretycznych.
W tym artykule podzielę się z Wami moją listą problemów, które daję uczniom jako pracę domową i nad którymi przeprowadzamy różnego rodzaju burze mózgów, co prowadzi do głębokiego i jasnego zrozumienia języka SQL.
SQL (ˈɛsˈkjuˈɛl; angielski strukturalny język zapytań) to deklaratywny język programowania używany do tworzenia, modyfikowania i zarządzania danymi w relacyjnej bazie danych zarządzanej przez odpowiedni system zarządzania bazami danych.
O SQL możesz przeczytać w różnych źródłach
Celem tego artykułu nie jest nauczenie Cię języka SQL od zera.
Więc chodźmy.
Wykorzystamy dobrze znane
Zauważam, że rozważymy tylko zadania SELECT. Nie ma tutaj zadań DML ani DDL.
zadania
Ograniczanie i sortowanie danych
Tabela pracowników. Uzyskaj listę z informacjami o wszystkich pracownikach
decyzja
SELECT * FROM employees
Tabela pracowników. Uzyskaj listę wszystkich pracowników o imieniu „David”
decyzja
SELECT *
FROM employees
WHERE first_name = 'David';
Tabela pracowników. Uzyskaj listę wszystkich pracowników o identyfikatorze stanowiska równym „IT_PROG”
decyzja
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Tabela pracowników. Uzyskaj listę wszystkich pracowników z 50-go działu (department_id) z pensją (pensją) większą niż 4000
decyzja
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Tabela pracowników. Uzyskaj listę wszystkich pracowników z 20. i 30. działu (department_id)
decyzja
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których ostatnia litera w nazwisku to „a”
decyzja
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Tabela pracowników. Uzyskaj listę wszystkich pracowników z 50. i 80. działu (department_id), którzy mają premię (wartość w kolumnie Commission_pct nie jest pusta)
decyzja
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których nazwiska zawierają co najmniej 2 litery „n”
decyzja
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których nazwiska są dłuższe niż 4 litery
decyzja
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których pensja mieści się w przedziale od 8000 do 9000 (włącznie)
decyzja
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których nazwisko zawiera symbol „%”
decyzja
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Tabela pracowników. Uzyskaj listę wszystkich identyfikatorów menedżerów
decyzja
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Tabela pracowników. Uzyskaj listę pracowników wraz z ich stanowiskami w formacie: Donald(sh_clerk)
decyzja
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Używanie funkcji jednowierszowych do dostosowywania wyników
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których nazwiska są dłuższe niż 10 litery
decyzja
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, którzy mają literę „b” w nazwisku (wielkość liter nie ma znaczenia)
decyzja
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których nazwiska zawierają co najmniej 2 litery „a”
decyzja
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których wynagrodzenie jest wielokrotnością 1000
decyzja
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Tabela pracowników. Uzyskaj pierwszą 3-cyfrową liczbę numeru telefonu pracownika, jeśli jego numer ma format XXX.XXX.XXXX
decyzja
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Tabela działów. Uzyskaj pierwsze słowo z nazwy działu w przypadku tych, którzy mają więcej niż jedno słowo w nazwie
decyzja
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Tabela pracowników. Uzyskaj nazwiska pracowników bez pierwszej i ostatniej litery w imieniu
decyzja
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których ostatnia litera w nazwisku to „m” i których nazwisko jest dłuższe niż 5
decyzja
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Stół podwójny. Zdobądź datę w najbliższy piątek
decyzja
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, którzy przepracowali w firmie ponad 17 lat
decyzja
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których ostatnia cyfra numeru telefonu jest nieparzysta i składa się z 3 cyfr oddzielonych kropką
decyzja
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, których wartość job_id po znaku „_” ma co najmniej 3 znaki, ale ta wartość po „_” nie jest równa „CLERK”
decyzja
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Tabela pracowników. Uzyskaj listę wszystkich pracowników, zastępując wszystkie „.” w wartości PHONE_NUMBER NA '-'
decyzja
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Korzystanie z funkcji konwersji i wyrażeń warunkowych
Tabela pracowników. Uzyskaj listę wszystkich pracowników, którzy przyszli do pracy pierwszego dnia miesiąca (dowolnego)
decyzja
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Tabela pracowników. Uzyskaj listę wszystkich pracowników, którzy przyszli do pracy w 2008 roku
decyzja
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
Stół DUAL. Pokaż jutrzejszą datę w formacie: Jutro jest drugi dzień stycznia
decyzja
SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info
FROM DUAL;
Tabela pracowników. Uzyskaj listę wszystkich pracowników i datę przybycia każdego pracownika do pracy w formacie: 21 czerwca 2007 r.
decyzja
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
FROM employees;
Tabela pracowników. Uzyskaj listę pracowników, których pensje wzrosły o 20%. Pokaż wynagrodzenie ze znakiem dolara
decyzja
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Tabela pracowników. Uzyskaj listę wszystkich pracowników, którzy rozpoczęli pracę w lutym 2007 r.
decyzja
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';
Stół DUAL. Wyświetl bieżącą datę, + sekundę, + minutę, + godzinę, + dzień, + miesiąc, + rok
decyzja
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 pracowników. Uzyskaj listę wszystkich pracowników z pełnym wynagrodzeniem (wynagrodzenie + prowizja_pct(%)) w formacie: 24,000.00 XNUMX USD
decyzja
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Tabela pracowników. Uzyskaj listę wszystkich pracowników i informację o dostępności premii wynagrodzeń (Tak/Nie)
decyzja
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Tabela pracowników. Uzyskaj poziom wynagrodzenia każdego pracownika: Mniej niż 5000 uważa się za poziom niski, większy lub równy 5000 i mniej niż 10000 10000 za poziom normalny, większy lub równy XNUMX XNUMX uważa się za poziom wysoki
decyzja
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;
Kraje tabeli. Dla każdego kraju wskaż region, w którym się znajduje: 1-Europa, 2-Ameryka, 3-Azja, 4-Afryka (bez Join)
decyzja
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;
Raportowanie danych zagregowanych przy użyciu funkcji grupowych
Tabela pracowników. Otrzymuj raport według Department_id z minimalną i maksymalną pensją, wcześniejszą i późniejszą datą przybycia do pracy oraz liczbą pracowników. Sortuj według liczby pracowników (malejąco)
decyzja
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 pracowników. Ilu pracowników, których nazwiska zaczynają się na tę samą literę? Sortuj według ilości. Pokaż tylko te, których ilość jest większa niż 1
decyzja
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 pracowników. Ilu pracowników pracuje w tym samym dziale i otrzymuje takie samo wynagrodzenie?
decyzja
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Tabela pracowników. Uzyskaj raport o liczbie zatrudnionych pracowników w każdym dniu tygodnia. Sortuj według ilości
decyzja
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Tabela pracowników. Uzyskaj raport o liczbie pracowników zatrudnionych w poszczególnych latach. Sortuj według ilości
decyzja
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Tabela pracowników. Uzyskaj liczbę działów zatrudniających pracowników
decyzja
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Tabela pracowników. Uzyskaj listę identyfikatorów działów, które zatrudniają więcej niż 30 pracowników
decyzja
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Tabela pracowników. Uzyskaj listę identyfikatorów działów i zaokrągloną średnią pensję pracowników w każdym dziale.
decyzja
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Kraje tabeli. Pobierz listę identyfikator_regionu sumę wszystkich liter wszystkich nazw krajów, w których jest ich więcej niż 60
decyzja
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Tabela pracowników. Uzyskaj listę identyfikatorów działów, w których pracują pracownicy kilku (>1) identyfikatorów stanowisk
decyzja
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Tabela pracowników. Uzyskaj listę manager_ids, których liczba podwładnych jest większa niż 5, a suma wszystkich wynagrodzeń jego podwładnych jest większa niż 50000 XNUMX
decyzja
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Tabela pracowników. Uzyskaj listę manager_ids, których średnia pensja wszystkich podwładnych mieści się w przedziale od 6000 do 9000 i którzy nie otrzymują premii (commission_pct jest pusta)
decyzja
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;
Tabela pracowników. Uzyskaj maksymalną pensję od wszystkich pracowników job_id kończącą się słowem „CLERK”
decyzja
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';
Tabela pracowników. Uzyskaj maksymalne wynagrodzenie spośród wszystkich średnich wynagrodzeń w dziale
decyzja
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Tabela pracowników. Uzyskaj liczbę pracowników o tej samej liczbie liter w nazwisku. Jednocześnie pokaż tylko tych, których długość nazwiska jest większa niż 5, a liczba pracowników o tym samym nazwisku jest większa niż 20. Sortuj według długości nazwiska
decyzja
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);
Wyświetlanie danych z wielu tabel za pomocą złączeń
Tabela Pracownicy, Działy, Lokalizacje, Kraje, Regiony. Uzyskaj listę regionów i liczbę pracowników w każdym regionie
decyzja
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;
Tabela Pracownicy, Działy, Lokalizacje, Kraje, Regiony. Uzyskaj szczegółowe informacje o każdym pracowniku:
Imię, nazwisko, dział, stanowisko, ulica, kraj, region
decyzja
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);
Tabela pracowników. Pokaż wszystkich menedżerów, którzy mają podległych więcej niż 6 pracowników
decyzja
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;
Tabela pracowników. Pokaż wszystkich pracowników, którzy nikomu nie podlegają
decyzja
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 Pracownicy, Job_history. Tabela Pracownicy przechowuje wszystkich pracowników. Tabela Job_history przechowuje pracowników, którzy odeszli z firmy. Uzyskaj raport o wszystkich pracownikach i ich statusie w firmie (pracuje lub odchodzi z firmy z datą wyjazdu)
Przykład:
imię | status
Jennifer | Opuścił firmę 31 grudnia 2006 r
Klara | Obecnie pracujący
decyzja
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);
Tabela Pracownicy, Działy, Lokalizacje, Kraje, Regiony. Uzyskaj listę pracowników mieszkających w Europie (nazwa_regionu)
decyzja
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 Pracownicy, Działy. Pokaż wszystkie działy zatrudniające więcej niż 30 pracowników
decyzja
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 Pracownicy, Działy. Pokaż wszystkich pracowników, którzy nie są w żadnym dziale
decyzja
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 Pracownicy, Działy. Pokaż wszystkie działy, w których nie ma pracowników
decyzja
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Tabela pracowników. Pokaż wszystkich pracowników, którzy nie mają nikogo podległego
decyzja
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 Pracownicy, Praca, Działy. Pokaż pracowników w formacie: Imię, Stanowisko, Nazwa_działu.
Przykład:
Imię | Stanowisko_stanowiska | Nazwa oddziału
Donaldzie | Wysyłka | Urzędnik ds. wysyłki
decyzja
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 pracowników. Uzyskaj listę pracowników, których menedżerowie dostali pracę w 2005 r., ale jednocześnie sami ci pracownicy dostali pracę przed 2005 r.
decyzja
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 pracowników. Uzyskaj listę pracowników, których menedżerowie dostali pracę w styczniu dowolnego roku, a długość job_title tych pracowników przekracza 15 znaków
decyzja
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;
Używanie podzapytań do rozwiązywania zapytań
Tabela pracowników. Uzyskaj listę pracowników o najdłuższym nazwisku.
decyzja
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Tabela pracowników. Uzyskaj listę pracowników, których wynagrodzenie jest wyższe niż średnia pensja wszystkich pracowników.
decyzja
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Tabela Pracownicy, Działy, Lokalizacje. Wybierz miasto, w którym ogółem pracownicy zarabiają najmniej.
decyzja
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 pracowników. Uzyskaj listę pracowników, których menadżer otrzymuje pensję powyżej 15000 XNUMX.
decyzja
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Tabela Pracownicy, Działy. Pokaż wszystkie działy, w których nie ma pracowników
decyzja
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Tabela pracowników. Pokaż wszystkich pracowników, którzy nie są menedżerami
decyzja
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Tabela pracowników. Pokaż wszystkich menedżerów, którzy mają podległych więcej niż 6 pracowników
decyzja
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Tabela Pracownicy, Działy. Pokaż pracowników, którzy pracują w dziale IT
decyzja
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Tabela Pracownicy, Praca, Działy. Pokaż pracowników w formacie: Imię, Stanowisko, Nazwa_działu.
Przykład:
Imię | Stanowisko_stanowiska | Nazwa oddziału
Donaldzie | Wysyłka | Urzędnik ds. wysyłki
decyzja
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 pracowników. Uzyskaj listę pracowników, których menedżerowie dostali pracę w 2005 r., ale jednocześnie sami ci pracownicy dostali pracę przed 2005 r.
decyzja
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 pracowników. Uzyskaj listę pracowników, których menedżerowie dostali pracę w styczniu dowolnego roku, a długość job_title tych pracowników przekracza 15 znaków
decyzja
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;
To wszystko na teraz.
Mam nadzieję, że zadania były ciekawe i emocjonujące.
W miarę możliwości będę dodawał do tej listy zadań.
Chętnie przyjmę również wszelkie uwagi i sugestie.
PS: Jeśli ktoś wymyśli ciekawe zadanie SELECT, napiszcie w komentarzach, a dodam je do listy.
Dziękuję.
Źródło: www.habr.com