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 (ËÉ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.
Man kan lÀsa om SQL frÄn olika .
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 i Oracle med dess tabeller ():

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
