Sottoquery e CTE (Common Table Expressions)

Introduzione a Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Sottoquery

  • Query annidate
  • Usate nelle clausole FROM, WHERE, HAVING o SELECT
  • Esempio:
    SELECT column1 
    FROM table1 
    WHERE column1 = (SELECT column2 FROM table2 WHERE condition)
    
  • Tipi: correlate e non correlate
Introduzione a Snowflake SQL

Sottoquery non correlata

-- La query principale restituisce le pizze al prezzo massimo trovato nella sottoquery
SELECT pizza_id
FROM pizzas
-- Sottoquery non correlata che identifica il prezzo pizza più alto
WHERE price = (
    SELECT MAX(price)
    FROM pizzas
)
  • La sottoquery non interagisce con la query principale
Introduzione a Snowflake SQL

Sottoquery correlata

  • La sottoquery fa riferimento a colonne della query principale
SELECT pt.name, 
       pz.price, 
       pt.category
FROM pizzas AS pz
JOIN pizza_type AS pt 
    ON pz.pizza_type_id = pt.pizza_type_id
WHERE pz.price = (
  -- Identifica il prezzo max per ogni categoria di pizza
    SELECT MAX(p2.price) -- Prezzo max
    FROM pizzas AS p2
    WHERE -- Correlata: usa colonna della query esterna 
      p2.pizza_type_id = pz.pizza_type_id
)
Introduzione a Snowflake SQL

Common Table Expressions

Sintassi generale:

-- Parola chiave WITH
WITH cte1 AS ( -- Nome CTE
        SELECT col_1, col_2
            FROM table1
    )
    ...
SELECT ... 
FROM cte1 -- Interroga la CTE
;
Introduzione a Snowflake SQL

Common Table Expressions

WITH max_price AS ( -- CTE chiamata max_price
    SELECT pizza_type_id, 
           MAX(price) AS max_price
    FROM pizzas
    GROUP BY pizza_type_id
)

-- Query principale SELECT pt.name, pz.price, pt.category FROM pizzas AS pz JOIN pizza_type AS pt ON pz.pizza_type_id = pt.pizza_type_id JOIN max_price AS mp -- Join con la CTE max_price ON pt.pizza_type_id = mp.pizza_type_id WHERE pz.price < mp.max_price -- Confronta il prezzo con la colonna max_price della CTE
Introduzione a Snowflake SQL

Più CTE

-- Definisci più CTE separate da virgole
WITH cte1 AS (
    SELECT ...
    FROM ...
),

cte2 AS ( SELECT ... FROM ... )
-- Query principale che combina entrambe le CTE SELECT ... FROM cte1 JOIN cte2 ON ... WHERE ...
Introduzione a Snowflake SQL

Perché usare le CTE?

  • Gestisci operazioni complesse
  • Modulare
  • Leggibile
  • Riutilizzabile
Introduzione a Snowflake SQL

Passons à la pratique !

Introduzione a Snowflake SQL

Preparing Video For Download...