Përshëndetje, Habr!
Prej më shumë se 3 vitesh unë jap mësim SQL në qendra të ndryshme trajnimi dhe një nga vëzhgimet e mia është se studentët e zotërojnë dhe kuptojnë më mirë SQL nëse u jepet një detyrë, dhe jo vetëm u tregohet për mundësitë dhe bazat teorike.
Në këtë artikull, unë do të ndaj me ju listën time të problemeve që u jap studentëve si detyra shtëpie dhe mbi të cilat ne kryejmë lloje të ndryshme stuhish idesh, gjë që çon në një kuptim të thellë dhe të qartë të SQL.
SQL (ˈɛsˈkjuˈɛl; gjuha e strukturuar e pyetjeve në anglisht) është një gjuhë programimi deklarative e përdorur për të krijuar, modifikuar dhe menaxhuar të dhënat në një bazë të dhënash relacionale të menaxhuar nga një sistem i duhur i menaxhimit të bazës së të dhënave.
Ju mund të lexoni rreth SQL nga të ndryshme
Ky artikull nuk ka për qëllim t'ju mësojë SQL nga e para.
Le të shkojmë.
Ne do të përdorim të njohurit
Vërej se do të shqyrtojmë vetëm detyrat SELECT. Këtu nuk ka detyra DML ose DDL.
detyrat
Kufizimi dhe renditja e të dhënave
Tabela e punonjësve. Merrni një listë me informacione për të gjithë punonjësit
vendim
SELECT * FROM employees
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve të quajtur "David"
vendim
SELECT *
FROM employees
WHERE first_name = 'David';
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve me job_id të barabartë me 'IT_PROG'
vendim
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve nga departamenti i 50-të (departament_id) me një pagë (rrogë) më të madhe se 4000
vendim
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve nga departamenti i 20-të dhe i 30-të (department_id)
vendim
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, germa e fundit e të cilëve në emrin e tyre është 'a'
vendim
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve nga departamenti i 50-të dhe i 80-të (department_id) që kanë një bonus (vlera në kolonën komision_pct nuk është bosh)
vendim
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, emrat e të cilëve përmbajnë të paktën 2 shkronja 'n'
vendim
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, emrat e të cilëve janë më të gjatë se 4 shkronja
vendim
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, paga e të cilëve varion nga 8000 në 9000 (përfshirë)
vendim
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve emri i të cilëve përmban simbolin '%'
vendim
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Tabela e punonjësve. Merrni një listë të të gjitha ID-ve të menaxherit
vendim
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Tabela e punonjësve. Merrni një listë të punonjësve me pozicionet e tyre në formatin: Donald(sh_clerk)
vendim
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Përdorimi i funksioneve me një rresht për të personalizuar daljen
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, emrat e të cilëve janë më të gjatë se 10 shkronja
vendim
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që kanë shkronjën 'b' në emrin e tyre (pa ndjeshmërinë e shkronjave)
vendim
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, emrat e të cilëve përmbajnë të paktën 2 shkronja "a"
vendim
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, paga e të cilëve është shumëfish i 1000
vendim
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Tabela e punonjësve. Merrni numrin e parë 3-shifror të numrit të telefonit të një punonjësi nëse numri i tij është në formatin XXX.XXX.XXXX
vendim
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Tabela e departamenteve. Merrni fjalën e parë nga emri i departamentit për ata që kanë më shumë se një fjalë në emër
vendim
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Tabela e punonjësve. Merrni emrat e punonjësve pa shkronjën e parë dhe të fundit në emër
vendim
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, germa e fundit e të cilëve në emrin e tyre është 'm' dhe emri i të cilëve është më i gjatë se 5
vendim
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Tabela e dyfishtë. Merrni datën e së Premtes së ardhshme
vendim
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që kanë punuar për kompaninë për më shumë se 17 vjet
vendim
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, shifra e fundit e numrit të tyre të telefonit është tek dhe përbëhet nga 3 numra të ndarë me një pikë
vendim
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve, vlera e job_id të të cilëve pas shenjës '_' ka të paktën 3 karaktere, por kjo vlerë pas '_' nuk është e barabartë me 'CLERK'
vendim
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve duke zëvendësuar të gjithë '.' në vlerën PHONE_NUMBER në '-'
vendim
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Përdorimi i funksioneve të konvertimit dhe shprehjeve të kushtëzuara
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që erdhën në punë ditën e parë të muajit (ndonjë)
vendim
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që erdhën në punë në 2008
vendim
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
Tabela DUAL. Shfaq datën e nesërme në formatin: Nesër është dita e dytë e janarit
vendim
SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info
FROM DUAL;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve dhe datën e mbërritjes së secilit punonjës në punë në formatin: 21 qershor 2007
vendim
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
FROM employees;
Tabela e punonjësve. Merrni një listë të punonjësve me paga të rritura me 20%. Trego pagën me shenjën e dollarit
vendim
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve që filluan të punojnë në shkurt 2007.
vendim
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';
Tabela DUAL. Sillni datën aktuale, + sekondë, + minutë, + orë, + ditë, + muaj, + vit
vendim
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;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve me paga të plota (paga + komision_pct(%)) në formatin: $24,000.00
vendim
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Tabela e punonjësve. Merrni një listë të të gjithë punonjësve dhe informacion në lidhje me disponueshmërinë e bonuseve të pagave (Po/Jo)
vendim
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Tabela e punonjësve. Merrni nivelin e pagës së secilit punonjës: Më pak se 5000 konsiderohet nivel i ulët, më i madh se ose i barabartë me 5000 dhe më pak se 10000 konsiderohet nivel normal, më shumë se ose i barabartë me 10000 konsiderohet nivel i lartë.
vendim
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;
Vendet e tabelës. Për secilin vend, tregoni rajonin në të cilin ndodhet: 1-Evropa, 2-Amerika, 3-Azia, 4-Afrika (pa anëtarësim)
vendim
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;
Raportimi i të dhënave të grumbulluara duke përdorur funksionet e grupit
Tabela e punonjësve. Merrni një raport sipas departamentit_id me pagën minimale dhe maksimale, datat e hershme dhe të vonuara të mbërritjes në punë dhe numrin e punonjësve. Rendit sipas numrit të punonjësve (në rënie)
vendim
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;
Tabela e punonjësve. Sa punonjës emrat e të cilëve fillojnë me të njëjtën shkronjë? Rendit sipas sasisë. Trego vetëm ato ku sasia është më e madhe se 1
vendim
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;
Tabela e punonjësve. Sa punonjës punojnë në të njëjtin departament dhe marrin të njëjtën pagë?
vendim
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Tabela e punonjësve. Merrni një raport se sa punonjës janë punësuar në çdo ditë të javës. Rendit sipas sasisë
vendim
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Tabela e punonjësve. Merrni një raport se sa punonjës janë punësuar në vit. Rendit sipas sasisë
vendim
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Tabela e punonjësve. Merrni numrin e departamenteve që kanë punonjës
vendim
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Tabela e punonjësve. Merrni një listë të departamenteve që kanë më shumë se 30 punonjës
vendim
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Tabela e punonjësve. Merrni një listë të departamenteve_ids dhe pagën mesatare të rrumbullakosur të punonjësve në secilin departament.
vendim
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Vendet e tabelës. Merrni listën region_id shumën e të gjitha shkronjave të të gjitha emrave të shteteve në të cilat ka më shumë se 60
vendim
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Tabela e punonjësve. Merrni një listë të identifikimit të departamenteve në të cilat punojnë punonjës të disa (>1) job_ids
vendim
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Tabela e punonjësve. Merrni një listë me menaxher_ids, numri i vartësve të të cilëve është më i madh se 5 dhe shuma e të gjitha pagave të vartësve të tij është më e madhe se 50000
vendim
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Tabela e punonjësve. Merrni një listë me menaxher_ids, paga mesatare e të cilëve për të gjithë vartësit e tij është në rangun nga 6000 në 9000 dhe që nuk marrin bonuse (komisioni_pct është bosh)
vendim
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;
Tabela e punonjësve. Merr pagën maksimale nga të gjithë punonjësit job_id që mbaron me fjalën "NËNRFES"
vendim
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';
Tabela e punonjësve. Merrni pagën maksimale midis të gjitha pagave mesatare për departamentin
vendim
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Tabela e punonjësve. Merrni numrin e punonjësve me të njëjtin numër shkronjash në emrin e tyre. Në të njëjtën kohë, tregoni vetëm ata, gjatësia e emrave të të cilëve është më shumë se 5 dhe numri i punonjësve me të njëjtin emër është më shumë se 20. Rendit sipas gjatësisë së emrit
vendim
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);
Shfaqja e të dhënave nga tabela të shumta duke përdorur lidhjet
Punonjësit e tabelës, departamentet, vendndodhjet, vendet, rajonet. Merrni një listë të rajoneve dhe numrin e punonjësve në secilin rajon
vendim
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;
Punonjësit e tabelës, departamentet, vendndodhjet, vendet, rajonet. Merrni informacion të detajuar për çdo punonjës:
Emri, Mbiemri, Departamenti, Puna, Rruga, Vendi, Rajoni
vendim
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);
Tabela e punonjësve. Trego të gjithë menaxherët që kanë më shumë se 6 punonjës në varësi të tyre
vendim
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;
Tabela e punonjësve. Trego të gjithë punonjësit që nuk i raportojnë askujt
vendim
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;
Punonjësit e tabelës, historia e punës. Tabela e punonjësve ruan të gjithë punonjësit. Tabela Job_history ruan punonjësit që janë larguar nga kompania. Merrni një raport për të gjithë punonjësit dhe statusin e tyre në kompani (Punon ose u largua nga kompania me datën e nisjes)
Shembull:
emri_i parë | statusi
Jennifer | U largua nga kompania më 31 dhjetor 2006
Klara | Aktualisht Punon
vendim
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);
Punonjësit e tabelës, departamentet, vendndodhjet, vendet, rajonet. Merrni një listë të punonjësve që jetojnë në Evropë (region_name)
vendim
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';
Punonjësit e Tavolinës, Departamentet. Trego të gjitha departamentet me më shumë se 30 punonjës
vendim
SELECT department_name, COUNT (*)
FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Punonjësit e Tavolinës, Departamentet. Trego të gjithë punonjësit që nuk janë në asnjë departament
vendim
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;
Punonjësit e Tavolinës, Departamentet. Trego të gjitha departamentet në të cilat nuk ka punonjës
vendim
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Tabela e punonjësve. Tregojuni të gjithë punonjësve që nuk kanë askënd në varësi të tyre
vendim
SELECT man.first_name
FROM employees emp
RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IS NULL;
Punonjes tavoline, pune, departamente. Trego punonjësit në formatin: Emri_emri, titulli_puna, emri_departamenti.
Shembull:
Emri_emri | Emri_pune | Emri i Departamentit
Donald | Transporti | Nëpunës i Transportit
vendim
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);
Tabela e punonjësve. Merrni një listë të punonjësve, menaxherët e të cilëve morën një punë në 2005, por në të njëjtën kohë këta punonjës vetë morën një punë para 2005
vendim
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');
Tabela e punonjësve. Merrni një listë të punonjësve, menaxherët e të cilëve morën një punë në janar të çdo viti dhe gjatësia e titullit_punës së këtyre punonjësve është më shumë se 15 karaktere
vendim
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;
Përdorimi i nënpyetjeve për zgjidhjen e pyetjeve
Tabela e punonjësve. Merrni një listë të punonjësve me emrin më të gjatë.
vendim
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Tabela e punonjësve. Merrni një listë të punonjësve me një pagë më të madhe se paga mesatare e të gjithë punonjësve.
vendim
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Tabela e punonjësve, departamenteve, vendndodhjeve. Gjeni qytetin në të cilin punonjësit në total fitojnë më pak.
vendim
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);
Tabela e punonjësve. Merrni një listë të punonjësve, menaxheri i të cilëve merr një pagë prej më shumë se 15000.
vendim
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Punonjësit e Tavolinës, Departamentet. Trego të gjitha departamentet në të cilat nuk ka punonjës
vendim
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Tabela e punonjësve. Trego të gjithë punonjësit që nuk janë menaxherë
vendim
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Tabela e punonjësve. Trego të gjithë menaxherët që kanë më shumë se 6 punonjës në varësi të tyre
vendim
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Punonjësit e Tavolinës, Departamentet. Trego punonjësit që punojnë në departamentin e IT
vendim
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Punonjes tavoline, pune, departamente. Trego punonjësit në formatin: Emri_emri, titulli_puna, emri_departamenti.
Shembull:
Emri_emri | Emri_pune | Emri i Departamentit
Donald | Transporti | Nëpunës i Transportit
vendim
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;
Tabela e punonjësve. Merrni një listë të punonjësve, menaxherët e të cilëve morën një punë në 2005, por në të njëjtën kohë këta punonjës vetë morën një punë para 2005
vendim
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');
Tabela e punonjësve. Merrni një listë të punonjësve, menaxherët e të cilëve morën një punë në janar të çdo viti dhe gjatësia e titullit_punës së këtyre punonjësve është më shumë se 15 karaktere
vendim
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;
Kjo është e gjitha për tani.
Shpresoj që detyrat të ishin interesante dhe emocionuese.
Unë do t'i shtoj kësaj liste detyrash sa më shumë që të jetë e mundur.
Gjithashtu do të jem i lumtur të marr çdo koment dhe sugjerim.
PS: Nëse dikush vjen me një detyrë interesante SELECT, shkruani në komente dhe unë do ta shtoj atë në listë.
Falemnderit.
Burimi: www.habr.com