Salta el contingut

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:

Qui cobra més?
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:

Quin és el sou màxim?
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à:

Qui cobra més?
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àusula HAVING i fins i tot la clàusula FROM.

Ú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 <, ...)