SQL. Viihdyttäviä pulmia

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. Viihdyttäviä pulmia

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ä. Lisätietoja

Voit lukea SQL:stä eri puolelta lähteet.
Tämän artikkelin tarkoituksena ei ole opettaa sinulle SQL:ää tyhjästä.

Joten mennään.

Käytämme tuttuja HR-järjestelmä Oraclessa taulukoineen (lisää):

SQL. Viihdyttäviä pulmia
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

Lisää kommentti