SQL. Skemmtilegar þrautir

Halló Habr!

Í meira en 3 ár hef ég kennt SQL í ýmsum þjálfunarmiðstöðvum og ein af athugunum mínum er að nemendur ná tökum á og skilja SQL betur ef þeir fá verkefni, en ekki bara tala um möguleikana og fræðilegan grunn.

Í þessari grein mun ég deila með ykkur listanum mínum yfir verkefni sem ég gef nemendum sem heimavinnu og sem við gerum ýmiss konar hugarflug í, sem leiðir til djúps og skýrs skilnings á SQL.

SQL. Skemmtilegar þrautir

SQL (ˈɛsˈkjuˈɛl; engl. structured query language) er lýsandi forritunarmál sem notað er til að búa til, breyta og stjórna gögnum í venslagagnagrunni sem er stjórnað af viðeigandi gagnagrunnsstjórnunarkerfi. Nánari upplýsingar ...

Þú getur lesið um SQL frá mismunandi heimildir.
Þessari grein er ekki ætlað að kenna þér SQL frá grunni.

Svo skulum fara.

Við munum nota hið þekkta HR kerfi í Oracle með sínum töflum (meira):

SQL. Skemmtilegar þrautir
Ég tek fram að við munum aðeins íhuga verkefni á SELECT. Það eru engin verkefni á DML og DDL.

verkefni

Takmörkun og flokkun gagna

Tafla starfsmanna. Fáðu lista með upplýsingum um alla starfsmenn
ákvörðun

SELECT * FROM employees

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem heita 'David'
ákvörðun

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn með job_id jafnt og 'IT_PROG'
ákvörðun

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn frá 50. deild (department_id) með laun (laun) hærri en 4000
ákvörðun

SELECT *
  FROM employees
 WHERE department_id = 50 AND salary > 4000;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn frá 20. og frá 30. deild (department_id)
ákvörðun

SELECT *
  FROM employees
 WHERE department_id = 20 OR department_id = 30;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem síðasti stafurinn í nafni þeirra er 'a'
ákvörðun

SELECT *
  FROM employees
 WHERE first_name LIKE '%a';

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn frá 50. og frá 80. deild (department_id) sem eru með bónus (gildið í dálknum commission_pct er ekki tómt)
ákvörðun

SELECT *
  FROM employees
 WHERE     (department_id = 50 OR department_id = 80)
       AND commission_pct IS NOT NULL;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem innihalda að minnsta kosti 2 stafi „n“
ákvörðun

SELECT *
  FROM employees
 WHERE first_name LIKE '%n%n%';

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem heita lengra en 4 stafir
ákvörðun

SELECT *
  FROM employees
 WHERE first_name LIKE '%_____%';

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem hafa laun á milli 8000 og 9000 (að meðtöldum)
ákvörðun

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem innihalda nafnið '%'
ákvörðun

SELECT *
  FROM employees
 WHERE first_name LIKE '%%%' ESCAPE '';

Tafla starfsmanna. Fáðu lista yfir öll auðkenni stjórnanda
ákvörðun

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tafla starfsmanna. Fáðu lista yfir starfsmenn með stöðu þeirra á sniðinu: Donald(sh_clerk)
ákvörðun

SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;

Notkun aðgerða í einni röð til að sérsníða úttak

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem heita lengra en 10 stafir
ákvörðun

SELECT *
  FROM employees
 WHERE LENGTH (first_name) > 10;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem eru með bókstafinn 'b' í nafni sínu (hástafaleysi)
ákvörðun

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name), 'b') > 0;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem innihalda að minnsta kosti 2 stafi „a“
ákvörðun

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name),'a',1,2) > 0;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn með laun sem eru margfeldi af 1000
ákvörðun

SELECT *
  FROM employees
 WHERE MOD (salary, 1000) = 0;

Tafla starfsmanna. Fáðu fyrstu þriggja stafa númerið í símanúmeri starfsmannsins ef númerið hans er á sniðinu ХХХ.ХХХ.ХХХХ
ákvörðun

SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
  FROM employees
 WHERE phone_number LIKE '___.___.____';

Deildartafla. Fáðu fyrsta orðið úr deildarheitinu fyrir þá sem eru með fleiri en eitt orð í nafninu
ákvörðun

SELECT department_name,
       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
           first_word
  FROM departments
 WHERE INSTR (department_name, ' ') > 0;

Tafla starfsmanna. Fáðu nöfn starfsmanna án fyrsta og síðasta stafs í nafninu
ákvörðun

SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
  FROM employees;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn þar sem síðasti stafurinn í nafninu er jafn „m“ og lengd nafnsins er stærri en 5
ákvörðun

SELECT *
  FROM employees
 WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;

Tvöfalt borð. Fáðu dagsetningu næsta föstudags
ákvörðun

SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem hafa starfað hjá fyrirtækinu í yfir 17 ár
ákvörðun

SELECT *
  FROM employees
 WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn þar sem síðasti stafurinn í símanúmerinu er odda og samanstendur af 3 tölum aðskilin með punkti
ákvörðun

SELECT *
  FROM employees
 WHERE     MOD (SUBSTR (phone_number, -1), 2) != 0
       AND INSTR (phone_number,'.',1,3) = 0;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem hafa starf_id gildi eftir '_' táknið hefur að minnsta kosti 3 stafi, en þetta gildi á eftir '_' er ekki jafnt og 'CLERK'
ákvörðun

SELECT *
  FROM employees
 WHERE     LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn með því að skipta út öllum '.' í PHONE_NUMBER gildinu á '-'
ákvörðun

SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
  FROM employees;

Notkun viðskiptaaðgerða og skilyrt tjáning

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem mættu til vinnu fyrsta dag mánaðarins (hvaða sem er)
ákvörðun

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'DD') = '01';

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem komu til starfa árið 2008
ákvörðun

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'YYYY') = '2008';

TVÖLD borð. Sýndu dagsetningu morgundagsins á formi: Á morgun er annar dagur janúar
ákvörðun

SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month')     info
  FROM DUAL;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn og upphafsdag þeirra á formi: 21. júní, 2007
ákvörðun

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
  FROM employees;

Tafla starfsmanna. Fáðu lista yfir starfsmenn með hækkuð laun um 20%. Sýndu laun með dollaramerki
ákvörðun

SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
  FROM employees;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn sem komu til starfa í febrúar 2007.
ákvörðun

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'; 

TVÖLD borð. Flytja út núverandi dagsetningu, + sekúndu, + mínútu, + klukkustund, + dagur, + mánuður, + ár
ákvörðun

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;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn með full laun (laun + þóknun_pct(%)) á sniðinu: $24,000.00
ákvörðun

SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
  FROM employees;

Tafla starfsmanna. Fáðu lista yfir alla starfsmenn og upplýsingar um framboð á launabónusum (Já/Nei)
ákvörðun

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
  FROM employees;

Tafla starfsmanna. Fáðu launastig hvers starfsmanns: Minna en 5000 er talið lágt, hærra en eða jafnt og 5000 og minna en 10000 er talið eðlilegt, hærra en eða jafnt og 10000 er talið hátt stig
ákvörðun

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;

Lönd tafla. Sýndu fyrir hvert land svæði þar sem það er staðsett: 1-Evrópa, 2-Ameríka, 3-Asía, 4-Afríka (án þátttöku)
ákvörðun

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;

Tilkynning um uppsöfnuð gögn með því að nota hópaðgerðirnar

Tafla starfsmanna. Fáðu skýrslu eftir department_id með lágmarks- og hámarkslaunum, snemma og seint komu og fjölda starfsmanna. Raða eftir fjölda starfsmanna (dec)
ákvörðun

  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;

Tafla starfsmanna. Hversu margir starfsmenn sem byrja á sama staf? Raða eftir magni. Sýndu aðeins þá þar sem talan er hærri en 1
ákvörðun

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;

Tafla starfsmanna. Hversu margir starfsmenn starfa í sömu deild og fá sömu laun?
ákvörðun

SELECT department_id, salary, COUNT (*)
    FROM employees
GROUP BY department_id, salary
  HAVING COUNT (*) > 1;

Tafla starfsmanna. Fáðu skýrslu um hversu margir starfsmenn voru ráðnir á hverjum degi vikunnar. Raða eftir magni
ákvörðun

SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;

Tafla starfsmanna. Fáðu skýrslu um hversu margir starfsmenn voru ráðnir eftir árum. Raða eftir magni
ákvörðun

SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');

Tafla starfsmanna. Fáðu fjölda deilda sem hafa starfsmenn
ákvörðun

SELECT COUNT (COUNT (*))     department_count
    FROM employees
   WHERE department_id IS NOT NULL
GROUP BY department_id;

Tafla starfsmanna. Fáðu lista yfir department_id með meira en 30 starfsmönnum
ákvörðun

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (*) > 30;

Tafla starfsmanna. Fáðu lista yfir deildarauðkenni og ávöl meðallaun starfsmanna í hverri deild.
ákvörðun

  SELECT department_id, ROUND (AVG (salary)) avg_salary
    FROM employees
GROUP BY department_id;

Lönd tafla. Fáðu lista yfir region_id summu allra bókstafa allra landa_heita þar sem fleiri en 60
ákvörðun

  SELECT region_id
    FROM countries
GROUP BY region_id
  HAVING SUM (LENGTH (country_name)) > 60;

Tafla starfsmanna. Fáðu lista yfir deild_auðkenni þar sem starfsmenn nokkurra (>1) starfsauðkenni vinna
ákvörðun

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (DISTINCT job_id) > 1;

Tafla starfsmanna. Fáðu lista yfir manager_id þar sem fjöldi undirmanna er meiri en 5 og summan af öllum launum undirmanna hans er meiri en 50000
ákvörðun

  SELECT manager_id
    FROM employees
GROUP BY manager_id
  HAVING COUNT (*) > 5 AND SUM (salary) > 50000;

Tafla starfsmanna. Fáðu lista yfir manager_id þar sem meðallaun allra undirmanna hans eru á milli 6000 og 9000 sem fá ekki bónus (commission_pct er tómt)
ákvörðun

  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;

Tafla starfsmanna. Fáðu hámarkslaun frá öllum starfsmönnum job_id sem endar á orðinu 'CLERK'
ákvörðun

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';

Tafla starfsmanna. Fáðu hámarkslaun meðal allra meðallauna deildarinnar
ákvörðun

  SELECT MAX (AVG (salary))
    FROM employees
GROUP BY department_id;

Tafla starfsmanna. Fáðu fjölda starfsmanna með sama fjölda stafa í nafni þeirra. Á sama tíma skal aðeins sýna þá sem heita lengra en 5 og starfsmenn með sama nafni eru fleiri en 20. Raða eftir nafnlengd
ákvörðun

  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);

Sýna gögn úr mörgum töflum með því að nota Joins

Tafla starfsmenn, deildir, staðsetningar, lönd, svæði. Fáðu lista yfir svæði og fjölda starfsmanna á hverju svæði
ákvörðun

  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;

Tafla starfsmenn, deildir, staðsetningar, lönd, svæði. Fáðu nákvæmar upplýsingar um hvern starfsmann:
Fornafn, eftirnafn, deild, starf, gata, land, svæði
ákvörðun

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);

Tafla starfsmanna. Sýna alla stjórnendur sem hafa fleiri en 6 starfsmenn
ákvörðun

  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;

Tafla starfsmanna. Sýndu alla starfsmenn sem ekki tilkynna neinum
ákvörðun

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;

Starfsmannatafla, Starfssaga. Starfsmannaborðið geymir alla starfsmenn. Job_history taflan geymir starfsmenn sem yfirgáfu fyrirtækið. Fáðu skýrslu um alla starfsmenn og stöðu þeirra í fyrirtækinu (Vinnu eða hætti hjá fyrirtækinu með brottfarardegi)
Dæmi:
fornafn | stöðu
jennifer | Hætti félaginu 31. desember 2006
Clara | Núna að vinna
ákvörðun

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);

Tafla starfsmenn, deildir, staðsetningar, lönd, svæði. Fáðu lista yfir starfsmenn sem búa í Evrópu (region_name)
ákvörðun

 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';

Taflastarfsmenn, deildir. Sýna allar deildir með fleiri en 30 starfsmenn
ákvörðun

SELECT department_name, COUNT (*)
    FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
  HAVING COUNT (*) > 30;

Taflastarfsmenn, deildir. Sýndu alla starfsmenn sem eru ekki í neinni deild
ákvörðun

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;

Taflastarfsmenn, deildir. Sýna allar deildir án starfsmanna
ákvörðun

SELECT department_name
  FROM employees  e
       RIGHT JOIN departments d ON (e.department_id = d.department_id)
 WHERE first_name IS NULL;

Tafla starfsmanna. Sýndu alla starfsmenn sem hafa enga undirmenn
ákvörðun

SELECT man.first_name
  FROM employees  emp
       RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE emp.FIRST_NAME IS NULL;

Tafla starfsmenn, störf, deildir. Sýndu starfsmenn á sniðinu: Fornafn, Starfsheiti, Deildarheiti.
Dæmi:
fornafn | starfsheiti | Deild_nafn
Donald | sendingarkostnaður | Sendiskrifari
ákvörðun

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);

Tafla starfsmanna. Fáðu lista yfir starfsmenn sem stjórnendur fengu vinnu árið 2005, en á sama tíma fengu þessir starfsmenn sjálfir vinnu fyrir 2005
ákvörðun

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');

Tafla starfsmanna. Fáðu lista yfir starfsmenn sem stjórnendur fengu starf í janúarmánuði hvers árs og lengd starfsheitis þessara starfsmanna er meira en 15 stafir
ákvörðun

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;

Notkun undirfyrirspurna til að leysa fyrirspurnir

Tafla starfsmanna. Fáðu lista yfir starfsmenn með lengsta nafnið.
ákvörðun

SELECT *
  FROM employees
 WHERE LENGTH (first_name) =
       (SELECT MAX (LENGTH (first_name)) FROM employees);

Tafla starfsmanna. Fáðu lista yfir starfsmenn með hærri laun en meðallaun allra starfsmanna.
ákvörðun

SELECT *
  FROM employees
 WHERE salary > (SELECT AVG (salary) FROM employees);

Taflastarfsmenn, deildir, staðsetningar. Fáðu borgina þar sem starfsmenn vinna minnst samtals.
ákvörðun

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);

Tafla starfsmanna. Fáðu lista yfir starfsmenn þar sem yfirmaður fær hærri laun en 15000.
ákvörðun

SELECT *
  FROM employees
 WHERE manager_id IN (SELECT employee_id
                        FROM employees
                       WHERE salary > 15000)

Taflastarfsmenn, deildir. Sýna allar deildir án starfsmanna
ákvörðun

SELECT *
  FROM departments
 WHERE department_id NOT IN (SELECT department_id
                               FROM employees
                              WHERE department_id IS NOT NULL);

Tafla starfsmanna. Sýndu alla starfsmenn sem ekki eru stjórnendur
ákvörðun

SELECT *
  FROM employees
 WHERE employee_id NOT IN (SELECT manager_id
                             FROM employees
                            WHERE manager_id IS NOT NULL)

Tafla starfsmanna. Sýna alla stjórnendur sem hafa fleiri en 6 starfsmenn
ákvörðun

SELECT *
  FROM employees e
 WHERE (SELECT COUNT (*)
          FROM employees
         WHERE manager_id = e.employee_id) > 6;

Taflastarfsmenn, deildir. Sýndu starfsmenn sem starfa í upplýsingatæknideildinni
ákvörðun

SELECT *
  FROM employees
 WHERE department_id = (SELECT department_id
                          FROM departments
                         WHERE department_name = 'IT');

Tafla starfsmenn, störf, deildir. Sýndu starfsmenn á sniðinu: Fornafn, Starfsheiti, Deildarheiti.
Dæmi:
fornafn | starfsheiti | Deild_nafn
Donald | sendingarkostnaður | Sendiskrifari
ákvörðun

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;

Tafla starfsmanna. Fáðu lista yfir starfsmenn sem stjórnendur fengu vinnu árið 2005, en á sama tíma fengu þessir starfsmenn sjálfir vinnu fyrir 2005
ákvörðun

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');

Tafla starfsmanna. Fáðu lista yfir starfsmenn sem stjórnendur fengu starf í janúarmánuði hvers árs og lengd starfsheitis þessara starfsmanna er meira en 15 stafir
ákvörðun

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;

Það er allt í bili.

Ég vona að verkefnin hafi verið áhugaverð og spennandi.
Ég mun bæta við þennan lista eins mikið og hægt er.
Ég mun líka vera ánægður með allar athugasemdir og tillögur.

PS: Ef einhver kemur með áhugavert verkefni á SELECT, skrifaðu þá í athugasemdir, ég bæti því á listann.

Þakka þér.

Heimild: www.habr.com

Bæta við athugasemd