Dove sono le subquery?

Manipolazione dei dati in SQL

Mona Khalil

Data Scientist, Greenhouse Software

Cos'è una subquery?

  • Una query annidata dentro un'altra query
SELECT column
FROM (SELECT column
      FROM table) AS subquery;
  • Utile per trasformazioni intermedie
Manipolazione dei dati in SQL

Cosa fare con le subquery?

  • Può essere in qualsiasi parte di una query

    • SELECT, FROM, WHERE, GROUP BY
  • Può restituire vari tipi di informazioni

    • Quantità scalari (3.14159, -2, 0.001)
    • Una lista (id = (12, 25, 392, 401, 939))
    • Una tabella
Manipolazione dei dati in SQL

Perché usare le subquery?

  • Confrontare gruppi con valori riassuntivi
    • Come si è comportato il Liverpool rispetto alla media della Premier League inglese per quell'anno?
  • Riorganizzare i dati
    • Qual è la media mensile più alta di gol segnati in Bundesliga?
  • Combinare dati che non possono essere uniti
    • Come ottenere i nomi delle squadre di casa e ospiti in una tabella di risultati delle partite?
Manipolazione dei dati in SQL

Subquery semplici

  • Può essere valutata indipendentemente dalla query esterna
SELECT home_goal
FROM match
WHERE home_goal > (
    SELECT AVG(home_goal) 
    FROM match);

SELECT AVG(home_goal) FROM match;
1.56091291478423
Manipolazione dei dati in SQL

Subquery semplici

  • Viene elaborata solo una volta nell'intera istruzione
SELECT home_goal
FROM match
WHERE home_goal > (
    SELECT AVG(home_goal) 
    FROM match);
Manipolazione dei dati in SQL

Subquery nella clausola WHERE

  • Quali partite della stagione 2012/2013 hanno segnato più gol in casa della media?
SELECT AVG(home_goal) FROM match;
1.56091291478423
SELECT date, hometeam_id, awayteam_id, home_goal, away_goal
FROM match
WHERE season = '2012/2013'
      AND home_goal > 1.56091291478423;
Manipolazione dei dati in SQL

Subquery nella clausola WHERE

  • Quali partite della stagione 2012/2013 hanno segnato più gol in casa della media?
SELECT date, hometeam_id, awayteam_id, home_goal, away_goal
FROM match
WHERE season = '2012/2013'
      AND home_goal > (SELECT AVG(home_goal)
                     FROM match);
| date       | hometeam_id | awayteam_id | home_goal | away_goal |
|------------|-------------|-------------|-----------|-----------|
| 2012-07-28 | 9998        | 1773        | 5         | 2         |
| 2012-07-29 | 9987        | 9984        | 3         | 3         |
| 2012-10-05 | 9993        | 9991        | 2         | 2         |
Manipolazione dei dati in SQL

Filtro con subquery e IN

  • Quali squadre fanno parte della lega polacca?
SELECT
  team_long_name,
  team_short_name AS abbr
FROM team
WHERE 
  team_api_id IN 
  (SELECT hometeam_id
   FROM match
   WHERE country_id = 15722);
| team_long_name | abbr |
|----------------|------|
| Ruch Chorzów   | CHO  |
| Jagiellonia    | BIA  |
| Lech Poznań    | POZ  |
| P. Warszawa    | PWA  |
| Cracovia       | CKR  |
| Górnik Łęczna  | LEC  |
| Polonia Bytom  | GOR  |
| Zagłębie Lubin | ZAG  |
| Pogoń Szczecin | POG  |
| Widzew Łódź    | WID  |
| Śląsk Wrocław  | SLA  |
Manipolazione dei dati in SQL

È ora di esercitarsi!

Manipolazione dei dati in SQL

Preparing Video For Download...