PostgreSQL - Subquery

Ciao a tutti, appassionati di database in erba! Oggi esploriamo il mondo affascinante delle subquery in PostgreSQL. Immagina le subquery come piccoli aiutanti che assistono la tua query principale nella retrieval o manipolazione dei dati. Sono come i fedeli sidekick nei tuoi film di supereroi preferiti - non sempre sotto i riflettori, ma essenziali per portare a termine il lavoro!

PostgreSQL - Sub Queries

Subquery con la Dichiarazione SELECT

Iniziamo con l'uso più comune delle subquery - all'interno di una dichiarazione SELECT. Immagina di gestire una libreria e di voler scoprire quali libri sono prezzo sopra la media. Ecco come fare:

SELECT title, price
FROM books
WHERE price > (SELECT AVG(price) FROM books);

In questa query, la parte (SELECT AVG(price) FROM books) è la nostra subquery. Calcola la media dei prezzi di tutti i libri, e poi la nostra query principale utilizza questo valore per filtrare i risultati.

Ecco una spiegazione dettagliata:

  1. La subquery calcola la media dei prezzi.
  2. La query principale poi confronta il prezzo di ogni libro con questa media.
  3. Solo i libri con un prezzo superiore alla media vengono restituiti.

Ecco un altro esempio. Immagina di voler trovare tutti i clienti che hanno effettuato ordini:

SELECT customer_name
FROM customers
WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);

In questo caso, la nostra subquery (SELECT DISTINCT customer_id FROM orders) restituisce un elenco di ID dei clienti che hanno effettuato ordini. La query principale utilizza quindi questo elenco per filtrare la tabella dei clienti.

Subquery con la Dichiarazione INSERT

Ora, vediamo come le subquery possono essere utilizzate con le dichiarazioni INSERT. Immagina di creare una tabella 'libri in evidenza' e di volerla popolare con tutti i libri che hanno venduto più di 1000 copie:

INSERT INTO featured_books (book_id, title, author)
SELECT book_id, title, author
FROM books
WHERE book_id IN (SELECT book_id FROM sales WHERE copies_sold > 1000);

Qui, la nostra subquery (SELECT book_id FROM sales WHERE copies_sold > 1000) trova tutti i libri che hanno venduto più di 1000 copie. La query principale poi inserisce i dettagli di questi libri nella tabella featured_books.

Subquery con la Dichiarazione UPDATE

Le subquery possono anche essere estremamente utili nelle dichiarazioni UPDATE. Immagina di voler dare uno sconto del 10% a tutti i libri degli autori che hanno scritto più di 5 libri:

UPDATE books
SET price = price * 0.9
WHERE author_id IN (
SELECT author_id
FROM books
GROUP BY author_id
HAVING COUNT(*) > 5
);

In questo esempio, la nostra subquery identifica gli autori che hanno scritto più di 5 libri. La query principale poi aggiorna i prezzi di tutti i libri di questi autori.

Subquery con la Dichiarazione DELETE

Infine, vediamo come le subquery possono essere utilizzate con le dichiarazioni DELETE. Immagina di voler rimuovere tutti gli ordini dei clienti che non hanno effettuato un acquisto nell'ultimo anno:

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_purchase_date < CURRENT_DATE - INTERVAL '1 year'
);

Qui, la nostra subquery trova tutti i clienti che non hanno effettuato un acquisto nell'ultimo anno. La query principale poi elimina tutti gli ordini di questi clienti.

Metodi Comuni di Subquery

Ecco una tabella dei metodi comuni di subquery in PostgreSQL:

Metodo Descrizione Esempio
IN Verifica se un valore è nel risultato della subquery WHERE id IN (SELECT id FROM table)
EXISTS Verifica se la subquery restituisce righe WHERE EXISTS (SELECT 1 FROM table WHERE condition)
ANY Restituisce vero se uno dei valori della subquery soddisfa la condizione WHERE column > ANY (SELECT column FROM table)
ALL Restituisce vero se tutti i valori della subquery soddisfano la condizione WHERE column > ALL (SELECT column FROM table)

Ricorda, la pratica rende perfetti! Prova a scrivere le tue query, esperimenta con diversi scenari e non avere paura di fare errori. È così che impariamo e cresciamo nel meraviglioso mondo dei database!

Prima di chiudere, ecco una piccola storia dalla mia esperienza di insegnamento. Ho avuto uno studente che aveva difficoltà con le subquery. Continuava a confondere la query principale con la subquery. Allora gli ho detto di pensare alle subquery come a una matrioska - la piccola mucca (subquery) si inserisce nella grande (query principale). Questa immagine gli ha aiutato a comprendere il concetto, e presto stava scrivendo query complesse come un professionista!

Spero che questo tutorial sia stato utile per demistificare le subquery in PostgreSQL per voi. Continuate a fare query, continuate a imparare e, soprattutto, divertitevi con i database!

Credits: Image by storyset