SQL. Intressanta uppgifter

Hej, Habra!

Under de senaste tre Ären har jag undervisat i SQL pÄ olika trÀningscentra, och en av mina observationer Àr att studenterna lÀr sig och förstÄr SQL bÀttre om man ger dem uppgifter, snarare Àn bara berÀttar om möjligheter och teoretiska grunder.

I den hÀr artikeln kommer jag att dela med mig av min lista med uppgifter som jag ger till studenterna som hemlÀxa och som vi diskuterar pÄ olika sÀtt, vilket leder till en djup och klar förstÄelse av SQL.

SQL. Intressanta uppgifter

SQL (ˈɛsˈkjuˈɛl; engelska. structured query language — "strukturerad frĂ„gesprĂ„k") — ett deklarativt programmeringssprĂ„k som anvĂ€nds för att skapa, modifiera och hantera data i en relationsdatabas som hanteras av ett relevant databas-hanteringssystem. LĂ€s mer


Man kan lÀsa om SQL frÄn olika kÀllor.
Denna artikel syftar inte till att lÀra dig SQL frÄn grunden.

SÄ, lÄt oss köra igÄng.

Vi kommer att anvÀnda det vÀlkÀnda HR-schema i Oracle med dess tabeller (LÀs mer):

SQL. Intressanta uppgifter
Jag vill pÄpeka att vi bara kommer att övervÀga uppgifter pÄ SELECT. Det finns inga uppgifter pÄ DML och DDL.

Uppgifter

BegrÀnsa och sortera data

Tabellen Employees. HÀmta en lista med information om alla anstÀllda
Lösning

SELECT * FROM employees

Tabellen Employees. HÀmta en lista över alla anstÀllda med namnet 'David'
Lösning

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabellen Employees. HÀmta en lista över alla anstÀllda med job_id lika med 'IT_PROG'
Lösning

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabellen Employees. HÀmta en lista över alla anstÀllda frÄn avdelning 50 (department_id) med en lön (salary) som Àr över 4000
Lösning

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

Tabellen Employees. HÀmta en lista över alla anstÀllda frÄn avdelning 20 och avdelning 30 (department_id)
Lösning

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

Tabellen Employees. HÀmta en lista över alla anstÀllda vars sista bokstav i namnet Àr 'a'
Lösning

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

Tabellen Employees. HÀmta en lista över alla anstÀllda frÄn avdelning 50 och avdelning 80 (department_id) som har bonus (vÀrde i kolumnen commission_pct Àr inte tomt)
Lösning

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

Tabellen Employees. HÀmta en lista över alla anstÀllda vars namn innehÄller minst 2 bokstÀver 'n'
Lösning

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

Tabellen Employees. HÀmta en lista över alla anstÀllda vars namn Àr lÀngre Àn 4 bokstÀver
Lösning

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

Tabell över anstÀllda. HÀmta en lista över alla anstÀllda vars lön ligger mellan 8000 och 9000 (inklusive)
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR LÖN MELLAN 8000 OCH 9000;

Tabell över anstĂ€llda. HĂ€mta en lista över alla anstĂ€llda vars namn innehĂ„ller tecknet ‘%’
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR FÖRSTA_NAMN LIK '%%%' ESCAPE '';

Tabell över anstÀllda. HÀmta en lista över alla ID:n för chefer
Lösning

VÄLJ DISTINCT manager_id
  FRÅN anstĂ€llda
 VAR manager_id ÄR INTE NULL;

Tabell över anstÀllda. HÀmta en lista över arbetstagare med deras positioner i formatet: Donald(sh_clerk)
Lösning

VÄLJ första_namn || '(' || LOWER (jobb_id) || ')' anstĂ€lld FRÅN anstĂ€llda;

AnvÀnda enstaka radfunktioner för att anpassa utdata

Tabell över anstÀllda. HÀmta en lista över alla anstÀllda vars namn Àr lÀngre Àn 10 bokstÀver
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR LÄNGD (första_namn) > 10;

Tabell över anstĂ€llda. HĂ€mta en lista över alla anstĂ€llda vars namn innehĂ„ller bokstaven ‘b’ (oavsett versaler)
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR INSTR (LOWER (första_namn), 'b') > 0;

Tabell över anstĂ€llda. HĂ€mta en lista över alla anstĂ€llda vars namn innehĂ„ller minst 2 bokstĂ€ver ‘a’
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR INSTR (LOWER (första_namn),'a',1,2) > 0;

Tabell över anstÀllda. HÀmta en lista över alla anstÀllda vars lön Àr delbar med 1000
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR MOD (lön, 1000) = 0;

Tabell över anstÀllda. HÀmta de första 3 siffrorna i anstÀlldas telefonnummer om numret Àr i formatet XXX.XXX.XXXX
Lösning

VÄLJ telefon_nummer, SUBSTR (telefon_nummer, 1, 3) nytt_telefon_nummer
  FRÅN anstĂ€llda
 VAR telefon_nummer LIK '___.___.____';

Tabell över avdelningar. HÀmta det första ordet i avdelningens namn för dem vars namn innehÄller mer Àn ett ord
Lösning

VÄLJ avdelningsnamn,
       SUBSTR (avdelningsnamn, 1, INSTR (avdelningsnamn, ' ')-1)
           första_ord
  FRÅN avdelningar
 VAR INSTR (avdelningsnamn, ' ') > 0;

Tabell över anstÀllda. HÀmta namnen pÄ anstÀllda utan första och sista bokstaven i namnet
Lösning

VÄLJ första_namn, SUBSTR (första_namn, 2, LÄNGD (första_namn) - 2) nytt_namn
  FRÅN anstĂ€llda;

Tabell över anstĂ€llda. HĂ€mta en lista över alla anstĂ€llda vars sista bokstav i namnet Ă€r ‘m’ och namnets lĂ€ngd Ă€r större Ă€n 5
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR SUBSTR (första_namn, -1) = 'm' OCH LÄNGD(första_namn) > 5;

Tabell över Dual. HÀmta datum för nÀsta fredag
Lösning

VÄLJ NEXT_DAY (SYSDATE, 'FRIDAY') nĂ€sta_friday FRÅN DUAL;

Tabell över anstÀllda. HÀmta en lista över alla anstÀllda som har arbetat i företaget i mer Àn 17 Är
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR MÅNADER_MELLAN (SYSDATE, anstĂ€llningsdatum) / 12 > 17;

Tabell över anstÀllda. HÀmta en lista över alla anstÀllda vars sista siffra i telefonnumret Àr udda och bestÄr av 3 siffror separerade med punkt
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR MOD (SUBSTR (telefon_nummer, -1), 2) != 0
       OCH INSTR (telefon_nummer,'.',1,3) = 0;

Tabell AnstÀllda. HÀmta lista över alla anstÀllda vars job_id efter '_' har minst 3 tecken men dÀr detta vÀrde efter '_' inte Àr lika med 'CLERK'
Lösning

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

Tabell AnstÀllda. HÀmta lista över alla anstÀllda och ersÀtt i PHONE_NUMBER alla '.' med '-'
Lösning

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

AnvÀndning av konverteringsfunktioner och konditionella uttryck

Tabell AnstÀllda. HÀmta lista över alla anstÀllda som började arbeta den första dagen i mÄnaden (vilken som helst)
Lösning

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

Tabell AnstÀllda. HÀmta lista över alla anstÀllda som började arbeta under 2008
Lösning

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

Tabell DUAL. Visa morgondagens datum i formatet: Tomorrow is Second day of January
Lösning

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

Tabell AnstÀllda. HÀmta lista över alla anstÀllda och datumet nÀr de började arbeta i formatet: 21st of June, 2007
Lösning

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

Tabell AnstÀllda. HÀmta lista över anstÀllda med löner som ökar med 20%. Visa lönen med dollartecken
Lösning

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

Tabell AnstÀllda. HÀmta lista över alla anstÀllda som började arbeta i februari 2007.
Lösning

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

Tabell DUAL. Visa aktuellt datum, + sekund, + minut, + timme, + dag, + mÄnad, + Är
Lösning

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;

Tabell AnstÀllda. HÀmta lista över alla anstÀllda med fulla löner (salary + commission_pct(%)) i formatet: $24,000.00
Lösning

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

Tabell AnstÀllda. HÀmta lista över alla anstÀllda och information om bonusar till lönen (Ja/Nej)
Lösning

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

Tabell AnstÀllda. HÀmta lönenivÄn för varje anstÀlld: Mindre Àn 5000 anses vara LÄg nivÄ, Mellan 5000 och mindre Àn 10000 anses vara Normal nivÄ, Mer Àn eller lika med 10000 anses vara Hög nivÄ
Lösning

VÄLJ first_name,
       salary,
       FALL
           NÄR salary = 5000 OCH salary < 10000 DÅ 'Normal'
           ANNARS 'Hög'
       SLUT salary_level
  FRÅN employees;

Tabell Countries. Visa regionen för varje land dÀr det ligger: 1-Europa, 2-Amerika, 3-Asien, 4-Afrika (utan Join)
Lösning

VÄLJ country_name land,
       DEKODERA (region_id,
               1, 'Europa',
               2, 'Amerika',
               3, 'Asien',
               4, 'Afrika',
               'OkÀnd')
           region
  FRÅN countries;

VÄLJ country_name
           land,
       FALL region_id
           NÄR 1 DÅ 'Europa'
           NÄR 2 DÅ 'Amerika'
           NÄR 3 DÅ 'Asien'
           NÄR 4 DÅ 'Afrika'
           ANNARS 'OkÀnd'
       SLUT
           region
  FRÅN countries;

Rapportering av aggregerad data med hjÀlp av gruppfunktioner

Tabell Employees. FÄ en rapport över department_id med minimi och maximi lön, med tidigaste och senaste anstÀllningsdatum och antal anstÀllda. Sortera efter antal anstÀllda (i fallande ordning)
Lösning

  VÄLJ department_id,
         MIN (salary) min_lön,
         MAX (salary) max_lön,
         MIN (hire_date) min_anstÀllningsdatum,
         MAX (hire_date) max_anstÀllningsdatum,
         ANTAL (*) antal
    FRÅN employees
GROUP BY department_id
order by antal desc;

Tabell Employees. Hur mÄnga anstÀllda har namn som börjar med samma bokstav? Sortera efter antal. Visa endast de dÀr antalet Àr större Àn 1
Lösning

VÄLJ SUBSTR (first_name, 1, 1) första_bokstav, ANTAL (*)
    FRÅN employees
GROUP BY SUBSTR (first_name, 1, 1)
  HAVING ANTAL (*) > 1
ORDER BY 2 DESC;

Tabell Employees. Hur mÄnga anstÀllda arbetar i samma avdelning och fÄr samma lön?
Lösning

VÄLJ department_id, salary, ANTAL (*)
    FRÅN employees
GROUP BY department_id, salary
  HAVING ANTAL (*) > 1;

Tabell Employees. FÄ en rapport om hur mÄnga anstÀllda som anstÀlldes varje veckodag. Sortera efter antal
Lösning

VÄLJ TO_CHAR (hire_Date, 'Dag') dag, ANTAL (*)
    FRÅN employees
GROUP BY TO_CHAR (hire_Date, 'Dag')
ORDER BY 2 DESC;

Tabell Employees. FÄ en rapport om hur mÄnga anstÀllda som anstÀlldes per Är. Sortera efter antal
Lösning

VÄLJ TO_CHAR (hire_date, 'ÅÅÅÅ') Ă„r, ANTAL (*)
    FRÅN employees
GROUP BY TO_CHAR (hire_date, 'ÅÅÅÅ');

Tabell Employees. FÄ antalet avdelningar dÀr det finns anstÀllda
Lösning

VÄLJ ANTAL (ANTAL (*)) avdelningsantal
    FRÅN employees
   WHERE department_id ÄR INTE NULL
GROUP BY department_id;

Tabell Employees. FÄ en lista över department_id dÀr mer Àn 30 anstÀllda arbetar
Lösning

  VÄLJ department_id
    FRÅN employees
GROUP BY department_id
  HAVING ANTAL (*) > 30;

Tabell Employees. FÄ en lista över department_id och avrundad genomsnittlig lön för anstÀllda i varje avdelning.
Lösning

  VÄLJ department_id, AVRUND (GENOMSNITT (salary)) genomsnitt_lön
    FRÅN employees
GROUP BY department_id;

Tabell Countries. FÄ en lista över region_id med summan av alla bokstÀver i country_name dÀr det finns mer Àn 60
Lösning

  VĂ€lj region_id
    FrÄn lÀnder
Grupp efter region_id
  HAVING SUM (LENGTH (land_namn)) > 60;

Tabell AnstÀllda. HÀmta lista över department_id dÀr flera (>1) job_id arbetar.
Lösning

  VĂ€lj department_id
    FrÄn anstÀllda
Grupp efter department_id
  HAVING COUNT (DISTINCT job_id) > 1;

Tabell AnstÀllda. HÀmta lista över manager_id som har fler Àn 5 underordnade och summan av alla deras löner över 50000.
Lösning

  VĂ€lj manager_id
    FrÄn anstÀllda
Grupp efter manager_id
  HAVING COUNT (*) > 5 OCH SUM (lön) > 50000;

Tabell AnstÀllda. HÀmta lista över manager_id som har ett genomsnittligt lön mellan 6000 och 9000 och som inte fÄr bonusar (commission_pct Àr tomt).
Lösning

  VÀlj manager_id, AVG (lön) avg_lön
    FrÄn anstÀllda
   DĂ€r commission_pct ÄR NULL
Grupp efter manager_id
  HAVING AVG (lön) MELLAN 6000 OCH 9000;

Tabell AnstÀllda. HÀmta maxlön frÄn alla anstÀllda vars job_id slutar med ordet 'CLERK'.
Lösning

VÀlj MAX (lön) max_lön
  FrÄn anstÀllda
 DĂ€r job_id LIKE '%CLERK';

VÀlj MAX (lön) max_lön
  FrÄn anstÀllda
 DĂ€r SUBSTR (job_id, -5) = 'CLERK';

Tabell AnstÀllda. HÀmta maxlön bland alla genomsnittliga löner per avdelning.
Lösning

  VÀlj MAX (AVG (lön))
    FrÄn anstÀllda
Grupp efter department_id;

Tabell AnstÀllda. HÀmta antal anstÀllda med samma antal bokstÀver i namnet. Visa endast de som har namn med mer Àn 5 tecken och dÀr antalet anstÀllda med det namnet Àr mer Àn 20. Sortera efter lÀngden pÄ namnet.
Lösning

  VÀlj LENGTH (förnamn), COUNT (*)
    FrÄn anstÀllda
Grupp efter LENGTH (förnamn)
  HAVING LENGTH (förnamn) > 5 OCH COUNT (*) > 20
ORDER BY LENGTH (förnamn);

  VÀlj LENGTH (förnamn), COUNT (*)
    FrÄn anstÀllda
   DÀr LENGTH (förnamn) > 5
Grupp efter LENGTH (förnamn)
  HAVING COUNT (*) > 20
ORDER BY LENGTH (förnamn);

Visar data frÄn flera tabeller med hjÀlp av joins.

Tabell AnstÀllda, Avdelningar, Platser, LÀnder, Regioner. HÀmta lista över regioner och antal anstÀllda i varje region.
Lösning

  VĂ€lj region_namn, COUNT (*)
    FrÄn anstÀllda e
         JOIN avdelningar d PÅ (e.department_id = d.department_id)
         JOIN platser l PÅ (d.location_id = l.location_id)
         JOIN lĂ€nder c PÅ (l.country_id = c.country_id)
         JOIN regioner r PÅ (c.region_id = r.region_id)
Grupp efter region_namn;

Tabell AnstÀllda, Avdelningar, Platser, LÀnder, Regioner. HÀmta detaljerad information om varje anstÀlld:
Förnamn, Efternamn, Avdelning, Jobb, Gata, Land, Region.
Lösning

VÀlj Förnamn,
       Efternamn,
       Avdelnings_namn,
       Jobb_id,
       gatuadress,
       Lands_namn,
       Regions_namn
  FrÄn anstÀllda e
       JOIN avdelningar d PÅ (e.department_id = d.department_id)
       JOIN platser l PÅ (d.location_id = l.location_id)
       JOIN lĂ€nder c PÅ (l.country_id = c.country_id)
       JOIN regioner r PÅ (c.region_id = r.region_id);

Tabell AnstÀllda. Visa alla chefer som har fler Àn 6 anstÀllda under sig.
Lösning

  VÄLJ man.first_name, ANTAL (*)
    FRÅN anstĂ€llda emp GÅ MED anstĂ€llda man PÅ (emp.manager_id = man.employee_id)
GRUPPERA EFTER man.first_name
  HAVANDE ANTAL (*) > 6;

Tabell AnstÀllda. Visa alla anstÀllda som inte rapporterar till nÄgon
Lösning

VÄLJ emp.first_name
  FRÅN anstĂ€llda emp
       VÄNSTER GÅ MED anstĂ€llda man PÅ (emp.manager_id = man.employee_id)
 DÄR man.FIRST_NAME ÄR NULL;

VÄLJ first_name
  FRÅN anstĂ€llda
 DÄR manager_id ÄR NULL;

Tabell AnstÀllda, Jobbhistorik. I tabellen AnstÀllda lagras alla anstÀllda. I tabellen Jobbhistorik lagras anstÀllda som har lÀmnat företaget. FÄ en rapport om alla anstÀllda och deras status i företaget (Arbetar eller har lÀmnat företaget med utgÄngsdatum)
Exempel:
first_name | status
Jennifer | LÀmnade företaget den 31 december 2006
Clara | För nÀrvarande anstÀlld
Lösning

VÄLJ first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""LÀmnade företaget den"" DD ""i"" MÄnad, YYYY'),
           'För nÀrvarande anstÀlld')
           status
  FRÅN anstĂ€llda e VÄNSTER GÅ MED jobbhistorik j PÅ (e.employee_id = j.employee_id);

Tabell AnstÀllda, Avdelningar, Platser, LÀnder, Regionen. FÄ en lista över anstÀllda som bor i Europa (region_name)
Lösning

 VÄLJ first_name
  FRÅN anstĂ€llda
       GÅ MED avdelningar MED (department_id)
       GÅ MED platser MED (location_id)
       GÅ MED lĂ€nder MED (country_id)
       GÅ MED regioner MED (region_id)
 DÄR region_name = 'Europa';
 
 VÄLJ first_name
  FRÅN anstĂ€llda e
       GÅ MED avdelningar d PÅ (e.department_id = d.department_id)
       GÅ MED platser l PÅ (d.location_id = l.location_id)
       GÅ MED lĂ€nder c PÅ (l.country_id = c.country_id)
       GÅ MED regioner r PÅ (c.region_id = r.region_id)
 DÄR region_name = 'Europa';

Tabell AnstÀllda, Avdelningar. Visa alla avdelningar med fler Àn 30 anstÀllda
Lösning

VÄLJ department_name, ANTAL (*)
    FRÅN anstĂ€llda e GÅ MED avdelningar d PÅ (e.department_id = d.department_id)
GRUPPERA EFTER department_name
  HAVANDE ANTAL (*) > 30;

Tabell AnstÀllda, Avdelningar. Visa alla anstÀllda som inte tillhör nÄgon avdelning
Lösning

VÄLJ first_name
  FRÅN anstĂ€llda e
       VÄNSTER GÅ MED avdelningar d PÅ (e.department_id = d.department_id)
 DÄR d.department_name ÄR NULL;

VÄLJ first_name
  FRÅN anstĂ€llda
 DÄR department_id ÄR NULL;

Tabell AnstÀllda, Avdelningar. Visa alla avdelningar utan nÄgra anstÀllda
Lösning

VÄLJ department_name
  FRÅN anstĂ€llda e
       HÖGER GÅ MED avdelningar d PÅ (e.department_id = d.department_id)
 DÄR first_name ÄR NULL;

Tabell AnstÀllda. Visa alla anstÀllda som inte har nÄgra underordnade
Lösning

VÄLJ man.first_name
  FRÅN anstĂ€llda emp
       HÖGER GÅ MED anstĂ€llda man PÅ (emp.manager_id = man.employee_id)
 DÄR emp.FIRST_NAME ÄR NULL;

Tabell AnstÀllda, Jobb, Avdelningar. Visa anstÀllda i formatet: First_name, Job_title, Department_name.
Exempel:
First_name | Job_title | Department_name
Donald | Frakt | Kontor Frakt
Lösning

VÄLJ first_name, job_title, department_name
  FRÅN anstĂ€llda e
       GÅ MED jobb j PÅ (e.job_id = j.job_id)
       GÅ MED avdelningar d PÅ (d.department_id = e.department_id);

Tabell AnstÀllda. FÄ en lista över anstÀllda vars chefer anstÀlldes Är 2005 men som sjÀlva anstÀlldes före Är 2005
Lösning

VÄLJ emp.*
  FRÅN anstĂ€llda emp GÅ MED anstĂ€llda man PÅ (emp.manager_id = man.employee_id)
 VAR     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       OCH emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabell AnstÀllda. HÀmta en lista över anstÀllda vars chefer började arbeta i januari mÄnad vilket Är som helst, och dÀr lÀngden pÄ job_title för dessa anstÀllda Àr mer Àn 15 tecken.
Lösning

VÄLJ emp.*
  FRÅN anstĂ€llda emp
       GÅ MED anstĂ€llda man PÅ (emp.manager_id = man.employee_id)
       GÅ MED jobb j PÅ (emp.job_id = j.job_id)
 VAR TO_CHAR (man.hire_date, 'MM') = '01' OCH LENGTH (j.job_title) > 15;

AnvÀnda subfrÄgor för att lösa frÄgor

Tabell AnstÀllda. HÀmta en lista över anstÀllda med det lÀngsta namnet.
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR LENGTH (first_name) =
       (VÄLJ MAX (LENGTH (first_name)) FRÅN anstĂ€llda);

Tabell AnstÀllda. HÀmta en lista över anstÀllda med en lön som Àr högre Àn genomsnittslönen för alla anstÀllda.
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR salary > (VÄLJ AVG (salary) FRÅN anstĂ€llda);

Tabell AnstÀllda, Avdelningar, Platser. HÀmta staden dÀr de anstÀllda sammantaget tjÀnar minst.
Lösning

VÄLJ stad
    FRÅN anstĂ€llda e
         GÅ MED avdelningar d PÅ (e.department_id = d.department_id)
         GÅ MED platser l PÅ (d.location_id = l.location_id)
GRUPPERA EFTER stad
  HAVING SUM (salary) =
         (  VÄLJ MIN (SUM (salary))
              FRÅN anstĂ€llda e
                   GÅ MED avdelningar d PÅ (e.department_id = d.department_id)
                   GÅ MED platser l PÅ (d.location_id = l.location_id)
          GRUPPERA EFTER stad);

Tabell AnstÀllda. HÀmta en lista över anstÀllda vars chefer har en lön som överstiger 15000.
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR manager_id IN (VÄLJ employee_id
                        FRÅN anstĂ€llda
                       VAR salary > 15000)

Tabell AnstÀllda, Avdelningar. Visa alla avdelningar utan nÄgra anstÀllda
Lösning

VÄLJ *
  FRÅN avdelningar
 VAR department_id INTE I (VÄLJ department_id
                               FRÅN anstĂ€llda
                              VAR department_id ÄR INTE NULL);

Tabell AnstÀllda. Visa alla anstÀllda som inte Àr chefer.
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR employee_id INTE I (VÄLJ manager_id
                             FRÅN anstĂ€llda
                            VAR manager_id ÄR INTE NULL)

Tabell AnstÀllda. Visa alla chefer som har fler Àn 6 anstÀllda under sig.
Lösning

VÄLJ *
  FRÅN anstĂ€llda e
 VAR (VÄLJ COUNT (*)
          FRÅN anstĂ€llda
         VAR manager_id = e.employee_id) > 6;

Tabell AnstÀllda, Avdelningar. Visa anstÀllda som arbetar i avdelningen IT.
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR department_id = (VÄLJ department_id
                          FRÅN avdelningar
                         VAR department_name = 'IT');

Tabell AnstÀllda, Jobb, Avdelningar. Visa anstÀllda i formatet: First_name, Job_title, Department_name.
Exempel:
First_name | Job_title | Department_name
Donald | Frakt | Kontor Frakt
Lösning

VÄLJ first_name,
       (VÄLJ job_title
          FRÅN jobb
         VAR job_id = e.job_id)
           job_title,
       (VÄLJ department_name
          FRÅN avdelningar
         VAR department_id = e.department_id)
           department_name
  FRÅN anstĂ€llda e;

Tabell AnstÀllda. FÄ en lista över anstÀllda vars chefer anstÀlldes Är 2005 men som sjÀlva anstÀlldes före Är 2005
Lösning

VÄLJ *
  FRÅN anstĂ€llda
 VAR     manager_id IN (VÄLJ employee_id
                            FRÅN anstĂ€llda
                           VAR TO_CHAR (hire_date, 'YYYY') = '2005')
       OCH hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabell AnstÀllda. HÀmta en lista över anstÀllda vars chefer började arbeta i januari mÄnad vilket Är som helst, och dÀr lÀngden pÄ job_title för dessa anstÀllda Àr mer Àn 15 tecken.
Lösning

VÄLJ *
  FRÅN anstĂ€llda e
 VAR     manager_id IN (VÄLJ employee_id
                            FRÅN anstĂ€llda
                           VAR TO_CHAR (hire_date, 'MM') = '01')
       OCH (VÄLJ LENGTH (job_title)
              FRÅN jobb
             VAR job_id = e.job_id) > 15;

Det Àr allt för nu.

Jag hoppas att uppgifterna var intressanta och engagerande.
Jag kommer att komplettera denna lista med uppgifter nÀr jag kan.
Jag Àr ocksÄ öppen för alla kommentarer och förslag.

P.S.: Om nÄgon kommer pÄ en intressant uppgift om SELECT, skriv i kommentarerna, sÄ lÀgger jag till den i listan.

Tack.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster