Sveiks, Habr!
Jau vairāk kā 3 gadus pasniedzu SQL dažādos mācību centros, un viens no maniem novērojumiem ir tas, ka skolēni labāk apgūst un saprot SQL, ja viņiem tiek dots uzdevums, nevis tikai stāsta par iespējām un teorētiskajiem pamatiem.
Šajā rakstā es dalīšos ar jums savu problēmu sarakstu, kuras es uzdodu studentiem kā mājasdarbu un kurās mēs veicam dažāda veida prāta vētras, kas ved uz dziļu un skaidru izpratni par SQL.
SQL (ˈɛsˈkjuˈɛl; angļu strukturētā vaicājuma valoda) ir deklaratīva programmēšanas valoda, ko izmanto, lai izveidotu, modificētu un pārvaldītu datus relāciju datu bāzē, ko pārvalda atbilstoša datu bāzes pārvaldības sistēma.
Jūs varat lasīt par SQL no dažādiem
Šis raksts nav paredzēts, lai mācītu jums SQL no nulles.
Tātad, ejam.
Izmantosim labi zināmo
Es atzīmēju, ka mēs izskatīsim tikai SELECT uzdevumus. Šeit nav DML vai DDL uzdevumu.
uzdevumi
Datu ierobežošana un kārtošana
Darbinieku galds. Iegūstiet sarakstu ar informāciju par visiem darbiniekiem
Šķīdums
SELECT * FROM employees
Darbinieku galds. Iegūstiet visu darbinieku sarakstu ar nosaukumu "David"
Šķīdums
SELECT *
FROM employees
WHERE first_name = 'David';
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru job_id ir vienāds ar “IT_PROG”
Šķīdums
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem no 50. nodaļas (department_id), kuru alga (alga) pārsniedz 4000
Šķīdums
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem no 20. un 30. nodaļas (department_id)
Šķīdums
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Darbinieku galds. Saņemiet visu darbinieku sarakstu, kuru pēdējais burts viņu vārdā ir "a"
Šķīdums
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem no 50. un 80. nodaļas (department_id), kuriem ir piemaksa (vērtība ailē Commission_pct nav tukša)
Šķīdums
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdos ir vismaz divi burti "n"
Šķīdums
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdi ir garāki par 4 burtiem
Šķīdums
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru alga ir robežās no 8000 līdz 9000 (ieskaitot)
Šķīdums
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārds satur simbolu "%"
Šķīdums
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Darbinieku galds. Iegūstiet visu pārvaldnieku ID sarakstu
Šķīdums
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Darbinieku galds. Iegūstiet darbinieku sarakstu ar viņu amatiem šādā formātā: Donald(sh_clerk)
Šķīdums
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Vienas rindas funkciju izmantošana, lai pielāgotu izvadi
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdi ir garāki par 10 burtiem
Šķīdums
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdā ir burts “b” (reģistrjutīgs)
Šķīdums
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārdos ir vismaz 2 burti “a”
Šķīdums
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru alga ir 1000 reizināta
Šķīdums
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Darbinieku galds. Iegūstiet darbinieka tālruņa numura pirmo 3 ciparu numuru, ja viņa numurs ir šādā formātā: XXX.XXX.XXXX
Šķīdums
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Nodaļu tabula. Iegūstiet pirmo vārdu no nodaļas nosaukuma tiem, kuru nosaukumā ir vairāk nekā viens vārds
Šķīdums
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Darbinieku galds. Iegūstiet darbinieku vārdus bez vārda pirmā un pēdējā burta
Šķīdums
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru vārda pēdējais burts ir “m” un kuru vārds ir garāks par 5
Šķīdums
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Dual tabula. Iegūstiet nākamās piektdienas datumu
Šķīdums
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuri uzņēmumā strādājuši vairāk nekā 17 gadus
Šķīdums
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru tālruņa numura pēdējais cipars ir nepāra un sastāv no 3 cipariem, kas atdalīti ar punktu
Šķīdums
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuru darba_id vērtībai pēc zīmes “_” ir vismaz 3 rakstzīmes, bet šī vērtība pēc “_” nav vienāda ar “CLERK”.
Šķīdums
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Darbinieku galds. Iegūstiet visu darbinieku sarakstu, aizstājot visus “.” PHONE_NUMBER vērtībā uz '-'
Šķīdums
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Pārvēršanas funkciju un nosacīto izteiksmju izmantošana
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuri ieradās darbā mēneša pirmajā dienā (jebkurā)
Šķīdums
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Darbinieku galds. Iegūstiet sarakstu ar visiem darbiniekiem, kuri ieradās darbā 2008. gadā
Šķīdums
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
Tabula DUAL. Rādīt rītdienas datumu šādā formātā: Rīt ir janvāra otrā diena
Šķīdums
SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info
FROM DUAL;
Darbinieku galds. Saņemiet visu darbinieku sarakstu un datumu, kad katrs darbinieks ieradās darbā šādā formātā: 21. gada 2007. jūnijs
Šķīdums
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
FROM employees;
Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuriem algas palielinātas par 20%. Parādiet algu ar dolāra zīmi
Šķīdums
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Darbinieku galds. Saņemiet visu darbinieku sarakstu, kuri sāka strādāt 2007. gada februārī.
Šķīdums
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';
Tabula DUAL. Parādiet pašreizējo datumu + sekundi, + minūti, + stundu, + dienu, + mēnesi, + gadu
Šķīdums
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;
Darbinieku galds. Iegūstiet visu darbinieku sarakstu ar pilnām algām (alga + komisijas_procenti(%)) šādā formātā: $24,000.00 XNUMX
Šķīdums
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Darbinieku galds. Saņemiet visu darbinieku sarakstu un informāciju par algu piemaksu pieejamību (Jā/Nē)
Šķīdums
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Darbinieku galds. Iegūstiet katra darbinieka algas līmeni: mazāks par 5000 tiek uzskatīts par zemu līmeni, lielāks vai vienāds ar 5000 un mazāks par 10000 tiek uzskatīts par normālu līmeni, lielāks vai vienāds ar 10000 tiek uzskatīts par augstu līmeni
Šķīdums
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;
Tabulas valstis. Katrai valstij norādiet reģionu, kurā tā atrodas: 1-Eiropa, 2-Amerika, 3-Āzija, 4-Āfrika (bez pievienošanās)
Šķīdums
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;
Apkopoto datu ziņošana, izmantojot grupas funkcijas
Darbinieku galds. Saņemiet ziņojumu pēc departamenta_id ar minimālo un maksimālo algu, agrajiem un vēlajiem ierašanās datumiem darbā un darbinieku skaitu. Kārtot pēc darbinieku skaita (dilstošā secībā)
Šķīdums
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;
Darbinieku galds. Cik darbinieku, kuru vārdi sākas ar vienu un to pašu burtu? Kārtot pēc daudzuma. Rādīt tikai tos, kuru daudzums ir lielāks par 1
Šķīdums
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;
Darbinieku galds. Cik darbinieku strādā vienā nodaļā un saņem vienādu algu?
Šķīdums
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Darbinieku galds. Saņemiet pārskatu par to, cik darbinieku tika pieņemti darbā katrā nedēļas dienā. Kārtot pēc daudzuma
Šķīdums
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Darbinieku galds. Saņemiet pārskatu par to, cik darbinieku tika pieņemti darbā pa gadiem. Kārtot pēc daudzuma
Šķīdums
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Darbinieku galds. Iegūstiet to nodaļu skaitu, kurās ir darbinieki
Šķīdums
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Darbinieku galds. Iegūstiet to departamentu_id sarakstu, kuros ir vairāk nekā 30 darbinieku
Šķīdums
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Darbinieku galds. Iegūstiet departamentu_ids sarakstu un katras nodaļas darbinieku noapaļoto vidējo algu.
Šķīdums
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Tabulas valstis. Iegūstiet sarakstu region_id visu valsts_nosaukumu burtu summa, kurā ir vairāk nekā 60
Šķīdums
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Darbinieku galds. Iegūstiet sarakstu ar departamenta_id, kuros strādā vairāku (>1) job_id darbinieki
Šķīdums
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Darbinieku galds. Iegūstiet sarakstu ar vadītājiem_id, kuru padoto skaits ir lielāks par 5 un visu viņa padoto algu summa ir lielāka par 50000 XNUMX
Šķīdums
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Darbinieku galds. Iegūstiet sarakstu ar vadītājiem_id, kuru vidējā alga visiem viņa padotajiem ir robežās no 6000 līdz 9000 un kuri nesaņem prēmijas (komisijas_pct ir tukšs)
Šķīdums
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;
Darbinieku galds. Saņemiet maksimālo algu no visiem darbiniekiem job_id, kas beidzas ar vārdu "CLERK"
Šķīdums
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';
Darbinieku galds. Saņemiet maksimālo algu starp visām departamenta vidējām algām
Šķīdums
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Darbinieku galds. Iegūstiet darbinieku skaitu, kuru vārdā ir vienāds burtu skaits. Tajā pašā laikā rādīt tikai tos, kuru vārda garums ir lielāks par 5 un darbinieku skaits ar tādu pašu vārdu ir lielāks par 20. Kārtot pēc vārda garuma
Šķīdums
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);
Datu parādīšana no vairākām tabulām, izmantojot savienojumus
Galda darbinieki, nodaļas, atrašanās vietas, valstis, reģioni. Iegūstiet reģionu sarakstu un darbinieku skaitu katrā reģionā
Šķīdums
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;
Galda darbinieki, nodaļas, atrašanās vietas, valstis, reģioni. Iegūstiet detalizētu informāciju par katru darbinieku:
Vārds_vārds, uzvārds, nodaļa, darbs, iela, valsts, reģions
Šķīdums
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);
Darbinieku galds. Parādiet visus vadītājus, kuriem ir vairāk nekā 6 darbinieki
Šķīdums
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;
Darbinieku galds. Parādiet visus darbiniekus, kuri nevienam neatskaitās
Šķīdums
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;
Tabula Darbinieki, Darba_vēsture. Darbinieku tabulā tiek saglabāti visi darbinieki. Tabulā Job_history tiek glabāti darbinieki, kuri pametuši uzņēmumu. Saņemt atskaiti par visiem darbiniekiem un viņu statusu uzņēmumā (Strādā vai atstāja uzņēmumu ar aizbraukšanas datumu)
Piemērs:
vārds_vārds | statusu
Dženifera | Pameta uzņēmumu 31. gada 2006. decembrī
Klāra | Šobrīd Strādā
Šķīdums
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);
Galda darbinieki, nodaļas, atrašanās vietas, valstis, reģioni. Saņemiet sarakstu ar darbiniekiem, kuri dzīvo Eiropā (region_name)
Šķīdums
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';
Galda darbinieki, nodaļas. Rādīt visas nodaļas ar vairāk nekā 30 darbiniekiem
Šķīdums
SELECT department_name, COUNT (*)
FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Galda darbinieki, nodaļas. Parādiet visus darbiniekus, kuri nav nevienā nodaļā
Šķīdums
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;
Galda darbinieki, nodaļas. Rādīt visas nodaļas, kurās nav darbinieku
Šķīdums
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Darbinieku galds. Parādiet visus darbiniekus, kuriem nav neviena pakļauta
Šķīdums
SELECT man.first_name
FROM employees emp
RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IS NULL;
Galda darbinieki, darba vietas, nodaļas. Rādīt darbiniekus šādā formātā: First_name, Job_title, Department_name.
Piemērs:
Vārds | Darba_nosaukums | Nodaļas_nosaukums
Donalds | Piegāde | Piegādes ierēdnis
Šķīdums
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);
Darbinieku galds. Iegūstiet sarakstu ar darbiniekiem, kuru vadītāji ieguva darbu 2005. gadā, bet tajā pašā laikā šie darbinieki paši ieguva darbu pirms 2005. gada
Šķīdums
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');
Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuru vadītāji ieguva darbu jebkura gada janvārī, un šo darbinieku job_title garums ir vairāk nekā 15 rakstzīmes
Šķīdums
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;
Apakšvaicājumu izmantošana vaicājumu risināšanai
Darbinieku galds. Iegūstiet darbinieku sarakstu ar garāko vārdu.
Šķīdums
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuru alga ir lielāka par visu darbinieku vidējo algu.
Šķīdums
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Darbinieku, departamentu, atrašanās vietu tabula. Iegūstiet pilsētu, kurā darbinieki kopumā pelna vismazāk.
Šķīdums
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);
Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuru vadītājs saņem algu vairāk nekā 15000 XNUMX.
Šķīdums
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Galda darbinieki, nodaļas. Rādīt visas nodaļas, kurās nav darbinieku
Šķīdums
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Darbinieku galds. Parādiet visus darbiniekus, kuri nav vadītāji
Šķīdums
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Darbinieku galds. Parādiet visus vadītājus, kuriem ir vairāk nekā 6 darbinieki
Šķīdums
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Galda darbinieki, nodaļas. Parādiet darbiniekus, kuri strādā IT nodaļā
Šķīdums
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Galda darbinieki, darba vietas, nodaļas. Rādīt darbiniekus šādā formātā: First_name, Job_title, Department_name.
Piemērs:
Vārds | Darba_nosaukums | Nodaļas_nosaukums
Donalds | Piegāde | Piegādes ierēdnis
Šķīdums
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;
Darbinieku galds. Iegūstiet sarakstu ar darbiniekiem, kuru vadītāji ieguva darbu 2005. gadā, bet tajā pašā laikā šie darbinieki paši ieguva darbu pirms 2005. gada
Šķīdums
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');
Darbinieku galds. Iegūstiet to darbinieku sarakstu, kuru vadītāji ieguva darbu jebkura gada janvārī, un šo darbinieku job_title garums ir vairāk nekā 15 rakstzīmes
Šķīdums
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;
Tas pagaidām ir viss.
Ceru, ka uzdevumi bija interesanti un aizraujoši.
Es papildināšu šo uzdevumu sarakstu, cik vien iespējams.
Priecāšos saņemt arī jebkādus komentārus un ieteikumus.
PS: Ja kāds izdomā kādu interesantu SELECT uzdevumu, rakstiet komentāros un es to pievienošu sarakstam.
Paldies.
Avots: www.habr.com