En aquest tema, explorarem les subconsultes EXISTS i NOT EXISTS, que són eines poderoses per verificar l'existència de registres en una subconsulta. Aquestes subconsultes són útils per a realitzar operacions condicionals basades en la presència o absència de dades en una altra taula.

Què són EXISTS i NOT EXISTS?

  • EXISTS: Aquesta clàusula s'utilitza per verificar si una subconsulta retorna algun registre. Si la subconsulta retorna almenys un registre, la condició EXISTS és certa.
  • NOT EXISTS: Aquesta clàusula s'utilitza per verificar si una subconsulta no retorna cap registre. Si la subconsulta no retorna cap registre, la condició NOT EXISTS és certa.

Sintaxi

EXISTS

SELECT column1, column2, ...
FROM table1
WHERE EXISTS (subquery);

NOT EXISTS

SELECT column1, column2, ...
FROM table1
WHERE NOT EXISTS (subquery);

Exemple pràctic

Taules d'exemple

Suposem que tenim dues taules: clients i comandes.

clients | client_id | nom | |-----------|-----------| | 1 | Anna | | 2 | Joan | | 3 | Maria | | 4 | Pere |

comandes | comanda_id | client_id | import | |------------|-----------|--------| | 101 | 1 | 150.00 | | 102 | 2 | 200.00 | | 103 | 1 | 100.00 |

Utilitzar EXISTS

Volem trobar tots els clients que han realitzat almenys una comanda.

SELECT nom
FROM clients c
WHERE EXISTS (
    SELECT 1
    FROM comandes o
    WHERE o.client_id = c.client_id
);

Explicació:

  • La subconsulta dins de la clàusula EXISTS comprova si hi ha alguna comanda associada amb cada client.
  • Si la subconsulta retorna almenys un registre, la condició EXISTS és certa i el client es retorna en el resultat.

Utilitzar NOT EXISTS

Volem trobar tots els clients que no han realitzat cap comanda.

SELECT nom
FROM clients c
WHERE NOT EXISTS (
    SELECT 1
    FROM comandes o
    WHERE o.client_id = c.client_id
);

Explicació:

  • La subconsulta dins de la clàusula NOT EXISTS comprova si hi ha alguna comanda associada amb cada client.
  • Si la subconsulta no retorna cap registre, la condició NOT EXISTS és certa i el client es retorna en el resultat.

Exercicis pràctics

Exercici 1

Troba els clients que han realitzat comandes amb un import superior a 100.

SELECT nom
FROM clients c
WHERE EXISTS (
    SELECT 1
    FROM comandes o
    WHERE o.client_id = c.client_id
    AND o.import > 100
);

Exercici 2

Troba els clients que no han realitzat cap comanda amb un import superior a 100.

SELECT nom
FROM clients c
WHERE NOT EXISTS (
    SELECT 1
    FROM comandes o
    WHERE o.client_id = c.client_id
    AND o.import > 100
);

Solucions

Solució a l'Exercici 1

SELECT nom
FROM clients c
WHERE EXISTS (
    SELECT 1
    FROM comandes o
    WHERE o.client_id = c.client_id
    AND o.import > 100
);

Solució a l'Exercici 2

SELECT nom
FROM clients c
WHERE NOT EXISTS (
    SELECT 1
    FROM comandes o
    WHERE o.client_id = c.client_id
    AND o.import > 100
);

Errors comuns i consells

  • Error comú: No correlacionar correctament la subconsulta amb la consulta principal.

    • Solució: Assegura't que la subconsulta utilitza una condició que correlaciona els registres de la subconsulta amb els de la consulta principal (per exemple, o.client_id = c.client_id).
  • Error comú: Utilitzar EXISTS o NOT EXISTS quan una simple unió (JOIN) seria més eficient.

    • Solució: Considera l'ús de JOINs quan sigui possible per millorar el rendiment, especialment en bases de dades grans.

Conclusió

Les clàusules EXISTS i NOT EXISTS són eines poderoses per verificar l'existència de registres en subconsultes. Aquestes clàusules permeten realitzar operacions condicionals basades en la presència o absència de dades en altres taules, oferint una gran flexibilitat en la manipulació de dades. Amb la pràctica, podràs utilitzar aquestes clàusules de manera efectiva per resoldre problemes complexos en SQL.

Curs de SQL

Mòdul 1: Introducció a SQL

Mòdul 2: Consultes bàsiques de SQL

Mòdul 3: Treballar amb múltiples taules

Mòdul 4: Filtratge avançat de dades

Mòdul 5: Manipulació de dades

Mòdul 6: Funcions avançades de SQL

Mòdul 7: Subconsultes i consultes niades

Mòdul 8: Índexs i optimització del rendiment

Mòdul 9: Transaccions i concurrència

Mòdul 10: Temes avançats

Mòdul 11: SQL en la pràctica

Mòdul 12: Projecte final

© Copyright 2024. Tots els drets reservats