Hei Habr!
Yli 3 vuotta olen opettanut SQL:ää eri koulutuskeskuksissa, ja yksi havaintoni on, että opiskelijat hallitsevat ja ymmärtävät SQL:n paremmin, jos heille annetaan tehtävä, eikä vain puhuta mahdollisuuksista ja teoreettisista perusteista.
Tässä artikkelissa jaan kanssasi listani tehtävistä, jotka annan opiskelijoille kotitehtävinä ja joissa teemme erilaisia aivoriihiä, jotka johtavat syvään ja selkeään SQL:n ymmärtämiseen.
SQL (ˈɛsˈkjuˈɛl; eng. strukturoitu kyselykieli) on deklaratiivinen ohjelmointikieli, jota käytetään luomaan, muokkaamaan ja hallitsemaan tietoja relaatiotietokannassa, jota hallitsee sopiva tietokannan hallintajärjestelmä.
Voit lukea SQL:stä eri puolelta
Tämän artikkelin tarkoituksena ei ole opettaa sinulle SQL:ää tyhjästä.
Joten mennään.
Käytämme tuttuja
Huomaan, että otamme huomioon vain SELECT-tehtävät. DML:ssä ja DDL:ssä ei ole tehtäviä.
tehtävät
Tietojen rajoittaminen ja lajittelu
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä
päätös
SELECT * FROM employees
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä nimeltä "David"
päätös
SELECT *
FROM employees
WHERE first_name = 'David';
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden job_id on "IT_PROG"
päätös
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Työntekijöiden pöytä. Hanki luettelo kaikista 50. osaston työntekijöistä (osastotunnus), joiden palkka (palkka) on yli 4000
päätös
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Työntekijöiden pöytä. Hanki luettelo kaikista 20. ja 30. osaston työntekijöistä (osastotunnus)
päätös
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden nimen viimeinen kirjain on "a"
päätös
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Työntekijöiden pöytä. Hanki luettelo kaikista 50. ja 80. osaston työntekijöistä (osastotunnus), joilla on bonus (arvo Commission_pct-sarakkeessa ei ole tyhjä)
päätös
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden nimessä on vähintään kaksi n-kirjainta
päätös
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden nimi on pidempi kuin 4 kirjainta
päätös
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden palkka on 8000–9000 (mukaan lukien)
päätös
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden nimessä on symboli "%"
päätös
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Työntekijöiden pöytä. Hanki luettelo kaikista esimiehen tunnuksista
päätös
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Työntekijöiden pöytä. Hanki luettelo työntekijöistä ja heidän asemansa muodossa: Donald(sh_clerk)
päätös
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Yksirivisten toimintojen käyttäminen tulosteen mukauttamiseen
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden nimi on pidempi kuin 10 kirjainta
päätös
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden nimessä on b-kirjain (kirjainkoolla ei ole merkitystä)
päätös
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden nimessä on vähintään 2 kirjainta "a"
päätös
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden palkka on 1000:n kerrannainen
päätös
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Työntekijöiden pöytä. Hanki työntekijän puhelinnumeron ensimmäinen 3-numeroinen numero, jos hänen numeronsa on muotoa ХХХ.ХХХ.ХХХХ
päätös
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Osastot taulukko. Hanki ensimmäinen sana osaston nimestä niille, joiden nimessä on useampi kuin yksi sana
päätös
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Työntekijöiden pöytä. Hanki työntekijöiden nimet ilman nimen etu- ja viimeistä kirjainta
päätös
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden nimen viimeinen kirjain on yhtä suuri kuin "m" ja nimen pituus on suurempi kuin 5
päätös
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Kaksoispöytä. Hanki päivämäärä ensi perjantaina
päätös
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, jotka ovat olleet yrityksessä yli 17 vuotta
päätös
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden puhelinnumeron viimeinen numero on pariton ja koostuu kolmesta pisteellä erotetusta numerosta
päätös
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joiden job_id-arvossa _-merkin jälkeen on vähintään 3 merkkiä, mutta tämä arvo _-merkin jälkeen ei ole yhtä suuri kuin CLERK.
päätös
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Työntekijöiden pöytä. Saat luettelon kaikista työntekijöistä korvaamalla kaikki numeron PHONE_NUMBER arvot '.' päällä '-'
päätös
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Muunnosfunktioiden ja ehdollisten lausekkeiden käyttäminen
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, jotka tulivat töihin kuukauden ensimmäisenä päivänä (mikä tahansa)
päätös
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Työntekijöiden pöytä. Hanki luettelo kaikista vuonna 2008 töihin tulleista työntekijöistä
päätös
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
DUAL pöytä. Näytä huominen päivämäärä muodossa: Huomenna on tammikuun toinen päivä
päätös
SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info
FROM DUAL;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä ja heidän aloituspäivänsä muodossa: 21. kesäkuuta 2007
päätös
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
FROM employees;
Työntekijöiden pöytä. Hanki luettelo työntekijöistä, joiden palkat ovat nousseet 20%. Näytä palkka dollarimerkillä
päätös
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, jotka tulivat töihin helmikuussa 2007.
päätö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 pöytä. Vie nykyinen päivämäärä, + sekunti, + minuutti, + tunti, + päivä, + kuukausi, + vuosi
päätö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;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä, joilla on täysi palkka (palkka + provisio_prosentti(%)) muodossa: $24,000.00 XNUMX
päätös
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Työntekijöiden pöytä. Hanki luettelo kaikista työntekijöistä ja tiedot palkkapalkkioiden saatavuudesta (Kyllä/Ei)
päätös
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Työntekijöiden pöytä. Hanki jokaisen työntekijän palkkataso: Alle 5000 katsotaan matalaksi, suurempi tai yhtä suuri kuin 5000 ja alle 10000 10000 katsotaan normaaliksi tasoksi, suurempi tai yhtä suuri kuin XNUMX XNUMX katsotaan korkeaksi tasoksi
päätös
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;
Maat taulukko. Näytä kunkin maan kohdalla alue, jolla se sijaitsee: 1-Eurooppa, 2-Amerikka, 3-Aasia, 4-Afrikka (ilman liittymistä)
päätös
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;
Aggregoidun tiedon raportointi ryhmätoimintojen avulla
Työntekijöiden pöytä. Hanki raportti Department_id:n mukaan, jossa on vähimmäis- ja enimmäispalkka, aikaiset ja myöhäiset saapumispäivät sekä työntekijöiden lukumäärä. Lajittele työntekijöiden lukumäärän mukaan (laske)
päätös
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;
Työntekijöiden pöytä. Kuinka monen työntekijän nimi alkaa samalla kirjaimella? Lajittele määrän mukaan. Näytä vain ne, joissa luku on suurempi kuin 1
päätös
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;
Työntekijöiden pöytä. Kuinka monta työntekijää työskentelee samalla osastolla ja saa saman palkan?
päätös
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Työntekijöiden pöytä. Hanki raportti siitä, kuinka monta työntekijää palkattiin jokaisena viikonpäivänä. Lajittele määrän mukaan
päätös
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Työntekijöiden pöytä. Hanki raportti siitä, kuinka monta työntekijää on palkattu vuodessa. Lajittele määrän mukaan
päätös
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Työntekijöiden pöytä. Selvitä niiden osastojen lukumäärä, joissa on työntekijöitä
päätös
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Työntekijöiden pöytä. Hanki luettelo osastotunnuksesta, jossa on yli 30 työntekijää
päätös
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Työntekijöiden pöytä. Hanki luettelo osastotunnuksista ja kunkin osaston työntekijöiden pyöristetty keskipalkka.
päätös
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Maat taulukko. Hanki luettelo alueen_id:n kaikkien kirjainten summasta kaikissa maissa, joissa on yli 60
päätös
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Työntekijöiden pöytä. Hanki luettelo osastotunnuksesta, jossa usean (>1) job_id työntekijät työskentelevät
päätös
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Työntekijöiden pöytä. Hanki luettelo manager_id:stä, jonka alaisten määrä on suurempi kuin 5 ja hänen alaistensa kaikkien palkkojen summa on suurempi kuin 50000 XNUMX
päätös
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Työntekijöiden pöytä. Hanki luettelo manager_id:stä, jonka kaikkien hänen alaistensa keskipalkka on 6000–9000 ja jotka eivät saa bonuksia (palkkioprosentti on tyhjä)
päätös
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;
Työntekijöiden pöytä. Saat maksimipalkan kaikilta työntekijöiltä job_id, joka päättyy sanaan CLERK
päätös
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';
Työntekijöiden pöytä. Hanki maksimipalkka osaston kaikkien keskipalkkojen joukosta
päätös
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Työntekijöiden pöytä. Hanki työntekijöiden määrä, joiden nimessä on sama määrä kirjaimia. Samalla näytä vain ne, joiden nimi on pidempi kuin 5 ja samannimisiä työntekijöitä on enemmän kuin 20. Lajittele nimen pituuden mukaan
päätö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);
Tietojen näyttäminen useista taulukoista liitoksilla
Taulukkotyöntekijät, osastot, sijainnit, maat, alueet. Hanki luettelo alueista ja kunkin alueen työntekijöiden määrä
päätö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;
Taulukkotyöntekijät, osastot, sijainnit, maat, alueet. Tarkemmat tiedot jokaisesta työntekijästä:
Etunimi, sukunimi, osasto, työpaikka, katu, maa, alue
päätö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);
Työntekijöiden pöytä. Näytä kaikki johtajat, joilla on yli 6 työntekijää
päätös
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;
Työntekijöiden pöytä. Näytä kaikki työntekijät, jotka eivät raportoi kenellekään
päätös
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;
Työntekijätaulukko, Job_history. Työntekijätaulukko tallentaa kaikki työntekijät. Job_history-taulukko tallentaa yrityksestä lähteneet työntekijät. Hanki raportti kaikista työntekijöistä ja heidän asemastaan yrityksessä (Työssä tai lähtenyt yrityksestä lähtöpäivän kanssa)
Esimerkiksi:
etunimi | Tila
jennifer | Irtisanoutui yrityksestä 31
Clara | Nykyisin työskentelee
päätös
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);
Taulukkotyöntekijät, osastot, sijainnit, maat, alueet. Hanki luettelo työntekijöistä, jotka asuvat Euroopassa (region_name)
päätös
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';
Pöytätyöntekijät, osastot. Näytä kaikki osastot, joissa on yli 30 työntekijää
päätös
SELECT department_name, COUNT (*)
FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Pöytätyöntekijät, osastot. Näytä kaikki työntekijät, jotka eivät ole millään osastolla
päätös
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;
Pöytätyöntekijät, osastot. Näytä kaikki osastot, joissa ei ole työntekijöitä
päätös
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Työntekijöiden pöytä. Näytä kaikki työntekijät, joilla ei ole alaisia
päätös
SELECT man.first_name
FROM employees emp
RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IS NULL;
Pöytätyöntekijät, työpaikat, osastot. Näytä työntekijät muodossa: Etunimi, Työnimi, Osaston_nimi.
Esimerkiksi:
etunimi | tehtävänimike | Osaston nimi
Donald | toimitus | Toimitusvirkailija
päätös
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);
Työntekijöiden pöytä. Hanki lista työntekijöistä, joiden johtajat saivat työpaikan vuonna 2005, mutta samaan aikaan nämä työntekijät itse saivat työpaikan ennen vuotta 2005
päätös
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');
Työntekijöiden pöytä. Hanki luettelo työntekijöistä, joiden johtajat saivat työpaikan minkä tahansa vuoden tammikuussa ja näiden työntekijöiden työn_nimi on yli 15 merkkiä
päätös
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;
Alikyselyiden käyttäminen kyselyjen ratkaisemiseen
Työntekijöiden pöytä. Hanki luettelo työntekijöistä, joilla on pisin nimi.
päätös
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Työntekijöiden pöytä. Hanki luettelo työntekijöistä, joiden palkka on suurempi kuin kaikkien työntekijöiden keskipalkka.
päätös
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Pöytätyöntekijät, osastot, paikat. Hanki kaupunki, jossa työntekijät tienaavat yhteensä vähiten.
päätös
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);
Työntekijöiden pöytä. Hanki luettelo työntekijöistä, joiden johtaja saa palkkaa yli 15000 XNUMX.
päätös
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Pöytätyöntekijät, osastot. Näytä kaikki osastot, joissa ei ole työntekijöitä
päätös
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Työntekijöiden pöytä. Näytä kaikki työntekijät, jotka eivät ole johtajia
päätös
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Työntekijöiden pöytä. Näytä kaikki johtajat, joilla on yli 6 työntekijää
päätös
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Pöytätyöntekijät, osastot. Näytä IT-osastolla työskentelevät työntekijät
päätös
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Pöytätyöntekijät, työpaikat, osastot. Näytä työntekijät muodossa: Etunimi, Työnimi, Osaston_nimi.
Esimerkiksi:
etunimi | tehtävänimike | Osaston nimi
Donald | toimitus | Toimitusvirkailija
päätös
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;
Työntekijöiden pöytä. Hanki lista työntekijöistä, joiden johtajat saivat työpaikan vuonna 2005, mutta samaan aikaan nämä työntekijät itse saivat työpaikan ennen vuotta 2005
päätös
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');
Työntekijöiden pöytä. Hanki luettelo työntekijöistä, joiden johtajat saivat työpaikan minkä tahansa vuoden tammikuussa ja näiden työntekijöiden työn_nimi on yli 15 merkkiä
päätös
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;
Tässä kaikki tältä erää.
Toivottavasti tehtävät olivat mielenkiintoisia ja jännittäviä.
Lisään tähän listaan niin paljon kuin mahdollista.
Otan myös mielelläni vastaan kommentteja ja ehdotuksia.
PS: Jos joku keksii mielenkiintoisen tehtävän SELECT:ssä, kirjoita kommentteihin, lisään sen listalle.
Kiitos.
Lähde: will.com