Consultes avançades - Subconsultes
Sovint ens pot interessar resoldre una consulta però, abans de formular-la, necessitem esbrinar altres paràmetres o valors.
En aquest cas caldria resoldre prèviament aquesta primera consulta, per posteriorment, realitzar l’altra consulta utilitzant el valor de la primera.
Imaginem que volem saber quí és l’empleat que cobra més.
La consulta seria:
SELECT *
FROM EMPLOYEES
WHERE SALARY = <Sou Màxim>;
Però abans ens cal esbrinar quin és el <Sou Màxim>. Aquest valor podem trobar-lo a partir de la següent consulta:
SELECT MAX(SALARY)
FROM EMPLOYEES:
La solució passa per utilitzar la segona de les consultes com a subconsulta en la primera; en el lloc on hi ha d’haver el valor, hi posarem la subconsulta entre parèntesis. La consulta ara serà:
SELECT *
FROM EMPLOYEES
WHERE SALARY = (SELECT MAX(SALARY)
FROM EMPLOYEES);
En aquest cas:
-
La subconsulta s’executa abans de la consulta principal.
-
Podem posar tantes subconsultes com vulguem.
-
La subconsulta la podem posar en diferents clàusules de la consulta incloent la clàusula
WHERE, la clàusulaHAVINGi fins i tot la clàusulaFROM.
Ús de les subconsultes
-
La subconsulta s’inclou sempre entre parèntesis.
-
La subconsulta la posem a la dreta de la comparació.
-
La subconsulta no pot tenir clàusula
ORDER BY. -
La subconsulta pot ser sobre qualsevol taula o conjunt de taules.
Tipus de Subconsultes
Hi ha dos tipus de subconsultes:
-
Subconsultes d’una sola fila que només retornen una fila i per a la comparació utilitzarem els operadors d’una fila (>, >= , <, <=, <>, BETWEEN)
-
Subconsultes de vàries files que poden retornar zero o més files i que utilitzem amb comparadors de vàries files (IN, ANY, ALL)
Exemple
Si volem saber quins empleats s’han contractat després de la Sra. Lorentz caldrà esbrinar primer la data de contractació de la Sra. Lorentz.
SELECT LAST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE HIRE_DATE > (SELECT HIRE_DATE
FROM EMPLOYEES
WHERE LAST_NAME = 'Lorentz')
ORDER BY 2;
+-----------+------------+
| LAST_NAME | HIRE_DATE |
+-----------+------------+
| Grant | 1999-05-24 |
| Mourgos | 1999-11-19 |
| Zlotkey | 2000-01-29 |
+-----------+------------+
Compte amb els valors NULL
COMPTE: Si la subconsulta no torna cap valor o bé torna el valor NULL és possible que la consulta no torni valors als fer la comparació amb NULL.
SELECT last_name
FROM employees
WHERE department_id =
(SELECT department_id
FROM employees
WHERE last_name = 'Grant');
+-----------+
| LAST_NAME |
+-----------+
Empty set
No torna cap fila, ni la del Sr. Grant, ja que la subconsulta torna el valor NULL i aquest mai es pot comparar amb l’operador igual = (ni <>, ni >, ni <, ...)