SQL. Puzzle divertenti

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. Puzzle divertenti

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. Leggi di più ...

Puoi leggere su SQL da diversi di fonti.
Questo articolo non ha lo scopo di insegnarti SQL da zero.

Allora, andiamo.

Useremo il ben noto Schema delle risorse umane in Oracle con le sue tabelle (Più):

SQL. Puzzle divertenti
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

Aggiungi un commento