Vai al contenuto
eLearner.app
Modulo 14 · Lezione 1 di 353/57 nel corso~12 min
Lezioni del modulo (1/3)

Introduzione alle CTE (WITH)

Introduzione alle CTE (WITH)

Prima o poi, capita a tutti: devi filtrare dei dati basandoti sul risultato di un aggregazione, poi prendere quel filtraggio e metterlo in JOIN con un'altra query aggregata. Inizi a scrivere una SELECT dentro una SELECT, che a sua volta finisce nel FROM di un'altra SELECT.

Risultato? Spaghetti SQL, una query illeggibile per qualunque essere umano.

Le CTE (Common Table Expressions) permettono di sbrogliare questa matassa. Si attivano con la parola chiave WITH, e permettono di definire query momentanee con un nome, per poi riutilizzarle come "tabelle virtuali" nella query finale.

Sintassi di Base

SQL
WITH premium_customers AS (
  SELECT customer_id, SUM(total_amount) AS total_spent
  FROM orders
  GROUP BY customer_id
  HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;

Come vedi, la query principale in fondo legge da premium_customers come se fosse una tabella vera! E risulta molto più leggibile di un mega-inner join con subquery innestate.

Esercizio#sql.m14.l1.e1
Tentativi: 0Caricamento…

Vogliamo i prodotti molto costosi. Usa una CTE chiamata 'luxury_products' per selezionare 'id' e 'price' di 'products' con 'price > 500'. Poi fai una query principale su questa CTE e mostra tutto (*).

Caricamento editor…
Mostra suggerimento

Inizia con WITH luxury_products AS (...) poi SELECT * FROM luxury_products.

Soluzione disponibile dopo 3 tentativi

Esercizio#sql.m14.l1.e2
Tentativi: 0Caricamento…

Vogliamo trovare gli utenti che sanno scrivere recensioni. Crea una CTE 'reviewers' che estragga i 'customer_id' univoci (DISTINCT) da 'reviews'. Quindi estrai 'id', 'first_name', 'last_name' dalla tabella 'customers' e fai una \`JOIN\` con la CTE 'reviewers' su id.

Caricamento editor…
Mostra suggerimento

WITH reviewers AS (SELECT DISTINCT customer_id FROM reviews) SELECT id, first_name, last_name FROM customers JOIN reviewers ON customers.id = reviewers.customer_id;

Soluzione disponibile dopo 3 tentativi