Ciao Habr!
Da più di 3 anni insegno SQL in vari centri di formazione e una delle mie osservazioni è che gli studenti padroneggiano e comprendono meglio SQL se viene assegnato loro un compito e non parlano solo delle possibilità e dei fondamenti teorici.
In questo articolo, condividerò con voi il mio elenco di compiti che do agli studenti come compiti a casa e sui quali conduciamo vari tipi di brainstorming, che portano a una comprensione profonda e chiara di SQL.
SQL (ˈɛsˈkjuˈɛl; eng. linguaggio di query strutturato) è un linguaggio di programmazione dichiarativo utilizzato per creare, modificare e gestire i dati in un database relazionale gestito da un sistema di gestione del database appropriato.
Puoi leggere su SQL da diversi
Questo articolo non ha lo scopo di insegnarti SQL da zero.
Allora, andiamo.
Useremo il ben noto
Prendo atto che prenderemo in considerazione solo le attività su SELECT. Non ci sono attività su DML e DDL.
compiti
Limitazione e ordinamento dei dati
Tabella dei dipendenti. Ottenere un elenco con le informazioni su tutti i dipendenti
Soluzione
SELECT * FROM employees
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti denominati "David"
Soluzione
SELECT *
FROM employees
WHERE first_name = 'David';
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti con job_id uguale a 'IT_PROG'
Soluzione
SELECT *
FROM employees
WHERE job_id = 'IT_PROG'
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti del 50° dipartimento (department_id) con uno stipendio (stipendio) superiore a 4000
Soluzione
SELECT *
FROM employees
WHERE department_id = 50 AND salary > 4000;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti del 20° e del 30° dipartimento (department_id)
Soluzione
SELECT *
FROM employees
WHERE department_id = 20 OR department_id = 30;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti la cui ultima lettera nel loro nome è "a"
Soluzione
SELECT *
FROM employees
WHERE first_name LIKE '%a';
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti del 50° e dell'80° dipartimento (department_id) che hanno un bonus (il valore nella colonna commission_pct non è vuoto)
Soluzione
SELECT *
FROM employees
WHERE (department_id = 50 OR department_id = 80)
AND commission_pct IS NOT NULL;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti il cui nome contiene almeno 2 lettere 'n'
Soluzione
SELECT *
FROM employees
WHERE first_name LIKE '%n%n%';
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti il cui nome è più lungo di 4 lettere
Soluzione
SELECT *
FROM employees
WHERE first_name LIKE '%_____%';
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti il cui stipendio è compreso tra 8000 e 9000 (inclusi)
Soluzione
SELECT *
FROM employees
WHERE salary BETWEEN 8000 AND 9000;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti il cui nome contiene il simbolo '%'
Soluzione
SELECT *
FROM employees
WHERE first_name LIKE '%%%' ESCAPE '';
Tabella dei dipendenti. Ottieni un elenco di tutti gli ID manager
Soluzione
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL;
Tabella dei dipendenti. Ottieni un elenco di dipendenti con le loro posizioni nel formato: Donald(sh_clerk)
Soluzione
SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;
Utilizzo delle funzioni a riga singola per personalizzare l'output
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti il cui nome è più lungo di 10 lettere
Soluzione
SELECT *
FROM employees
WHERE LENGTH (first_name) > 10;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti che hanno la lettera "b" nel loro nome (senza distinzione tra maiuscole e minuscole)
Soluzione
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name), 'b') > 0;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti il cui nome contiene almeno 2 lettere "a"
Soluzione
SELECT *
FROM employees
WHERE INSTR (LOWER (first_name),'a',1,2) > 0;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti il cui stipendio è un multiplo di 1000
Soluzione
SELECT *
FROM employees
WHERE MOD (salary, 1000) = 0;
Tabella dei dipendenti. Ottieni il primo numero di 3 cifre del numero di telefono del dipendente se il suo numero è nel formato ХХХ.ХХХ.ХХХХ
Soluzione
SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
FROM employees
WHERE phone_number LIKE '___.___.____';
Tabella dei dipartimenti. Ottieni la prima parola dal nome del dipartimento per quelli con più di una parola nel nome
Soluzione
SELECT department_name,
SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
first_word
FROM departments
WHERE INSTR (department_name, ' ') > 0;
Tabella dei dipendenti. Ottieni i nomi dei dipendenti senza la prima e l'ultima lettera nel nome
Soluzione
SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
FROM employees;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti la cui ultima lettera nel nome è uguale a 'm' e la lunghezza del nome è maggiore di 5
Soluzione
SELECT *
FROM employees
WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;
Doppio tavolo. Ottieni la data del prossimo venerdì
Soluzione
SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti che lavorano in azienda da oltre 17 anni
Soluzione
SELECT *
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti la cui ultima cifra del numero di telefono è dispari ed è composta da 3 numeri separati da un punto
Soluzione
SELECT *
FROM employees
WHERE MOD (SUBSTR (phone_number, -1), 2) != 0
AND INSTR (phone_number,'.',1,3) = 0;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti il cui valore job_id dopo il segno '_' ha almeno 3 caratteri, ma questo valore dopo '_' non è uguale a 'CLERK'
Soluzione
SELECT *
FROM employees
WHERE LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti sostituendo tutti i "." nel valore PHONE_NUMBER SU '-'
Soluzione
SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
FROM employees;
Uso delle funzioni di conversione e delle espressioni condizionali
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti che sono venuti a lavorare il primo giorno del mese (qualsiasi)
Soluzione
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'DD') = '01';
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti che sono venuti a lavorare nel 2008
Soluzione
SELECT *
FROM employees
WHERE TO_CHAR (hire_date, 'YYYY') = '2008';
Tavolo DOPPIO. Mostra la data di domani nel formato: Domani è il secondo giorno di gennaio
Soluzione
SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month') info
FROM DUAL;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti e la loro data di inizio nel formato: 21 giugno 2007
Soluzione
SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
FROM employees;
Tabella dei dipendenti. Ottieni un elenco di dipendenti con salari aumentati del 20%. Mostra lo stipendio con il simbolo del dollaro
Soluzione
SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
FROM employees;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti che sono venuti a lavorare nel febbraio 2007.
Soluzione
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';
Tavolo DOPPIO. Esporta data corrente, + secondi, + minuti, + ora, + giorno, + mese, + anno
Soluzione
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;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti con stipendi completi (stipendio + percentuale_commissioni(%)) nel formato: $24,000.00
Soluzione
SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
FROM employees;
Tabella dei dipendenti. Ottieni un elenco di tutti i dipendenti e informazioni sulla disponibilità di bonus salariali (Sì/No)
Soluzione
SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
FROM employees;
Tabella dei dipendenti. Ottieni il livello salariale di ciascun dipendente: Meno di 5000 è considerato Basso livello, Maggiore o uguale a 5000 e inferiore a 10000 è considerato Livello normale, Maggiore o uguale a 10000 è considerato Alto livello
Soluzione
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;
Tabella Paesi. Per ogni paese, mostra la regione in cui si trova: 1-Europa, 2-America, 3-Asia, 4-Africa (senza Join)
Soluzione
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;
Segnalazione di dati aggregati utilizzando le funzioni di gruppo
Tabella dei dipendenti. Ottieni un rapporto per department_id con salario minimo e massimo, date di arrivo anticipato e posticipato e numero di dipendenti. Ordina per numero di dipendenti (desc)
Soluzione
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;
Tabella dei dipendenti. Quanti dipendenti i cui nomi iniziano con la stessa lettera? Ordina per quantità. Mostra solo quelli in cui il numero è maggiore di 1
Soluzione
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;
Tabella dei dipendenti. Quanti dipendenti lavorano nello stesso reparto e percepiscono lo stesso stipendio?
Soluzione
SELECT department_id, salary, COUNT (*)
FROM employees
GROUP BY department_id, salary
HAVING COUNT (*) > 1;
Tabella dei dipendenti. Ottieni un rapporto sul numero di dipendenti assunti ogni giorno della settimana. Ordina per quantità
Soluzione
SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;
Tabella dei dipendenti. Ottieni un rapporto su quanti dipendenti sono stati assunti per anno. Ordina per quantità
Soluzione
SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');
Tabella dei dipendenti. Ottieni il numero di dipartimenti che hanno dipendenti
Soluzione
SELECT COUNT (COUNT (*)) department_count
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id;
Tabella dei dipendenti. Ottieni l'elenco di department_id con più di 30 dipendenti
Soluzione
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (*) > 30;
Tabella dei dipendenti. Ottieni un elenco di department_id e lo stipendio medio arrotondato dei dipendenti in ogni dipartimento.
Soluzione
SELECT department_id, ROUND (AVG (salary)) avg_salary
FROM employees
GROUP BY department_id;
Tabella Paesi. Ottieni un elenco di region_id somma di tutte le lettere di tutti i country_name in cui più di 60
Soluzione
SELECT region_id
FROM countries
GROUP BY region_id
HAVING SUM (LENGTH (country_name)) > 60;
Tabella dei dipendenti. Ottieni un elenco di department_id in cui lavorano i dipendenti di diversi (>1) job_id
Soluzione
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT (DISTINCT job_id) > 1;
Tabella dei dipendenti. Ottieni un elenco di manager_id il cui numero di subordinati è maggiore di 5 e la somma di tutti gli stipendi dei suoi subordinati è maggiore di 50000
Soluzione
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING COUNT (*) > 5 AND SUM (salary) > 50000;
Tabella dei dipendenti. Ottieni un elenco di manager_id il cui stipendio medio di tutti i suoi subordinati è compreso tra 6000 e 9000 che non ricevono bonus (commission_pct è vuoto)
Soluzione
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;
Tabella dei dipendenti. Ottieni lo stipendio massimo da tutti i dipendenti job_id che termina con la parola "impiegato"
Soluzione
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';
Tabella dei dipendenti. Ottieni lo stipendio massimo tra tutti gli stipendi medi del dipartimento
Soluzione
SELECT MAX (AVG (salary))
FROM employees
GROUP BY department_id;
Tabella dei dipendenti. Ottieni il numero di dipendenti con lo stesso numero di lettere nel loro nome. Allo stesso tempo, mostra solo quelli il cui nome è più lungo di 5 e il numero di dipendenti con lo stesso nome è superiore a 20. Ordina per lunghezza del nome
Soluzione
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);
Visualizzazione dei dati da più tabelle utilizzando i join
Tabella Dipendenti, Dipartimenti, Sedi, Paesi, Regioni. Ottieni un elenco di regioni e il numero di dipendenti in ciascuna regione
Soluzione
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;
Tabella Dipendenti, Dipartimenti, Sedi, Paesi, Regioni. Ottieni informazioni dettagliate su ciascun dipendente:
Nome, Cognome, Reparto, Professione, Via, Paese, Regione
Soluzione
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);
Tabella dei dipendenti. Mostra tutti i manager che hanno più di 6 dipendenti
Soluzione
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;
Tabella dei dipendenti. Mostra tutti i dipendenti che non fanno capo a nessuno
Soluzione
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;
Tabella Impiegati, Job_history. La tabella Impiegato memorizza tutti i dipendenti. La tabella Job_history memorizza i dipendenti che hanno lasciato l'azienda. Ottieni un rapporto su tutti i dipendenti e il loro stato in azienda (Impiegato o lasciato l'azienda con la data di partenza)
Esempio:
nome_nome | stato
jennifer | Ha lasciato la società al 31 dicembre 2006
Chiara | Attualmente funzionante
Soluzione
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);
Tabella Dipendenti, Dipartimenti, Sedi, Paesi, Regioni. Ottieni un elenco di dipendenti che vivono in Europa (region_name)
Soluzione
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';
Tabella Impiegati, Dipartimenti. Mostra tutti i reparti con più di 30 dipendenti
Soluzione
SELECT department_name, COUNT (*)
FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
HAVING COUNT (*) > 30;
Tabella Impiegati, Dipartimenti. Mostra tutti i dipendenti che non sono in nessun reparto
Soluzione
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;
Tabella Impiegati, Dipartimenti. Mostra tutti i reparti senza dipendenti
Soluzione
SELECT department_name
FROM employees e
RIGHT JOIN departments d ON (e.department_id = d.department_id)
WHERE first_name IS NULL;
Tabella dei dipendenti. Mostra tutti i dipendenti che non hanno subordinati
Soluzione
SELECT man.first_name
FROM employees emp
RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
WHERE emp.FIRST_NAME IS NULL;
Tabella Impiegati, Impieghi, Dipartimenti. Mostra i dipendenti nel formato: nome, titolo_lavoro, nome_reparto.
Esempio:
nome_nome | titolo di lavoro | Nome Dipartimento
Paperino | spedizione | Impiegato di spedizione
Soluzione
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);
Tabella dei dipendenti. Ottieni un elenco di dipendenti i cui manager hanno ottenuto un lavoro nel 2005, ma allo stesso tempo, questi stessi lavoratori hanno ottenuto un lavoro prima del 2005
Soluzione
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');
Tabella dei dipendenti. Ottieni un elenco di dipendenti i cui manager hanno ottenuto un lavoro nel mese di gennaio di qualsiasi anno e la lunghezza del job_title di questi dipendenti è superiore a 15 caratteri
Soluzione
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;
Utilizzo delle sottoquery per risolvere le query
Tabella dei dipendenti. Ottenere un elenco di dipendenti con il nome più lungo.
Soluzione
SELECT *
FROM employees
WHERE LENGTH (first_name) =
(SELECT MAX (LENGTH (first_name)) FROM employees);
Tabella dei dipendenti. Ottieni un elenco di dipendenti con uno stipendio superiore allo stipendio medio di tutti i dipendenti.
Soluzione
SELECT *
FROM employees
WHERE salary > (SELECT AVG (salary) FROM employees);
Tabella Dipendenti, Dipartimenti, Sedi. Ottieni la città in cui i dipendenti guadagnano di meno in totale.
Soluzione
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);
Tabella dei dipendenti. Ottieni un elenco di dipendenti il cui manager riceve uno stipendio di oltre 15000.
Soluzione
SELECT *
FROM employees
WHERE manager_id IN (SELECT employee_id
FROM employees
WHERE salary > 15000)
Tabella Impiegati, Dipartimenti. Mostra tutti i reparti senza dipendenti
Soluzione
SELECT *
FROM departments
WHERE department_id NOT IN (SELECT department_id
FROM employees
WHERE department_id IS NOT NULL);
Tabella dei dipendenti. Mostra tutti i dipendenti che non sono dirigenti
Soluzione
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL)
Tabella dei dipendenti. Mostra tutti i manager che hanno più di 6 dipendenti
Soluzione
SELECT *
FROM employees e
WHERE (SELECT COUNT (*)
FROM employees
WHERE manager_id = e.employee_id) > 6;
Tabella Impiegati, Dipartimenti. Mostra i dipendenti che lavorano nel reparto IT
Soluzione
SELECT *
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'IT');
Tabella Impiegati, Impieghi, Dipartimenti. Mostra i dipendenti nel formato: nome, titolo_lavoro, nome_reparto.
Esempio:
nome_nome | titolo di lavoro | Nome Dipartimento
Paperino | spedizione | Impiegato di spedizione
Soluzione
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;
Tabella dei dipendenti. Ottieni un elenco di dipendenti i cui manager hanno ottenuto un lavoro nel 2005, ma allo stesso tempo, questi stessi lavoratori hanno ottenuto un lavoro prima del 2005
Soluzione
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');
Tabella dei dipendenti. Ottieni un elenco di dipendenti i cui manager hanno ottenuto un lavoro nel mese di gennaio di qualsiasi anno e la lunghezza del job_title di questi dipendenti è superiore a 15 caratteri
Soluzione
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;
Questo è tutto per ora.
Spero che i compiti siano stati interessanti ed eccitanti.
Aggiungerò a questo elenco il più possibile.
Inoltre sarò lieto di eventuali commenti e suggerimenti.
PS: se qualcuno presenta un'attività interessante su SELECT, scrivi nei commenti, lo aggiungerò all'elenco.
Grazie.
Fonte: habr.com