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
NOT EXISTS
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
).
- Solució: Assegura't que la subconsulta utilitza una condició que correlaciona els registres de la subconsulta amb els de la consulta principal (per exemple,
-
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
- Utilitzar LIKE per a coincidències de patrons
- Operadors IN i BETWEEN
- Valors NULL i IS NULL
- Agrupar dades amb GROUP BY
- Clàusula HAVING
Mòdul 5: Manipulació de dades
Mòdul 6: Funcions avançades de SQL
Mòdul 7: Subconsultes i consultes niades
- Introducció a les subconsultes
- Subconsultes correlacionades
- EXISTS i NOT EXISTS
- Utilitzar subconsultes en les clàusules SELECT, FROM i WHERE
Mòdul 8: Índexs i optimització del rendiment
- Comprendre els índexs
- Crear i gestionar índexs
- Tècniques d'optimització de consultes
- Analitzar el rendiment de les consultes
Mòdul 9: Transaccions i concurrència
- Introducció a les transaccions
- Propietats ACID
- Instruccions de control de transaccions
- Gestionar la concurrència
Mòdul 10: Temes avançats
Mòdul 11: SQL en la pràctica
- Casos d'ús del món real
- Millors pràctiques
- SQL per a l'anàlisi de dades
- SQL en el desenvolupament web