Una subconsulta és una consulta dins d’una altra consulta.
S’utilitza per obtenir valors que després són comparats o filtrats en la consulta principal.

La subconsulta pot aparèixer en diferents parts de la instrucció SQL: al WHERE, HAVING, FROM, o SELECT.
WHERE
S’utilitza per filtrar resultats segons el valor retornat per una subconsulta.
SELECT Nom, Sou
FROM Empleats
WHERE Sou > (
SELECT AVG(Sou)
FROM Empleats
);
Retorna els empleats amb un sou superior al sou mitjà.
HAVING
Permet aplicar condicions sobre funcions d’agregació mitjançant subconsultes.
SELECT Departament, AVG(Sou) AS SouMig
FROM Empleats
GROUP BY Departament
HAVING AVG(Sou) > (
SELECT AVG(Sou)
FROM Empleats
);
Mostra els departaments amb sou mitjà superior al sou mitjà general.
SELECT Nom, Sou
FROM Empleats
WHERE Sou BETWEEN (
SELECT MIN(Sou) FROM Empleats WHERE Departament = 'Vendes'
)
AND (
SELECT MAX(Sou) FROM Empleats WHERE Departament = 'Vendes'
);
BETWEEN
Comprova si un valor està dins d’un rang retornat per una subconsulta.
Retorna els empleats amb un sou dins del rang dels sous del departament de Vendes.
SELECT Nom
FROM Empleats
WHERE Departament IN (
SELECT NomDepartament
FROM Departaments
WHERE Ciutat = 'Barcelona'
);
IN
Comprova si un valor pertany a un conjunt de resultats retornat per una subconsulta.
Selecciona els empleats que treballen en departaments situats a Barcelona.
SELECT Nom
FROM Clients
WHERE Nom LIKE (
SELECT CONCAT(Prefix, '%')
FROM Configuracio
WHERE Clau = 'prefix_clients'
);
LIKE
Tot i que normalment s’utilitza amb patrons de text, també pot combinar-se amb subconsultes.
Retorna els clients el nom dels quals comença amb el prefix definit a la taula Configuració.
SELECT Nom
FROM Empleats
WHERE Sou > ALL (
SELECT Sou
FROM Empleats
WHERE Departament = 'Administració'
);
ANY, SOME, ALL
Permeten comparar un valor amb tots o algun dels resultats d’una subconsulta.
Retorna els empleats que cobren més que tots els empleats d’Administració.
SELECT Nom
FROM Empleats
WHERE Sou > ANY (
SELECT Sou
FROM Empleats
WHERE Departament = 'Vendes'
);
Retorna els empleats que cobren més que almenys un treballador de Vendes.
SELECT Nom
FROM Clients c
WHERE EXISTS (
SELECT *
FROM Comandes o
WHERE o.ID_Client = c.ID_Client
);
EXISTS
Comprova si la subconsulta retorna almenys una fila.
Mostra els clients que tenen com a mínim una comanda registrada.
| Operador | Ús principal | Retorna quan… |
|---|---|---|
| WHERE | Filtrar segons condició | Coincideix amb el valor de subconsulta |
| HAVING | Filtrar grups agregats | La condició sobre l’agregació és certa |
| BETWEEN | Rang de valors | Valor dins del rang retornat |
| IN | Inclusió en conjunt | Valor pertany a la llista |
| LIKE | Patró de text | Coincideix amb el patró retornat |
| IS NULL | Valors nuls | Resultat nul o sense assignar |
| ANY / SOME | Comparació parcial | Condició certa per almenys un valor |
| ALL | Comparació total | Condició certa per tots els valors |
| EXISTS | Existència | Subconsulta retorna alguna fila |