Salta el contingut

Consultes avançades - Subconsultes d'una fila

  • Quan les subconsultes tornen una sola fila

    • Utilitzarem operadors de comparació d’una fila (=, >, >=, <, <=, <>)
  • Sempre

    • Posarem la subconsulta entre parèntesis

    • Posarem la subconsulta a la dreta de la condició de comparació.

  • La subconsulta pot fer-se sobre una taula diferent a la de la consulta.

    • Qui treballa al departament de nom Sales?

      Qui treballa al departament de nom Sales?
      SELECT *
      FROM  EMPLOYEES 
      WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                  FROM DEPARTMENTS
                  WHERE DEPARTMENT_NAME = 'Sales');
      
      * La consulta pot contenir més d’una subconsulta.

    • Qui treballa al departament de nom Shipping del mateix que la Sra. Rajs?

      Qui treballa al departament de nom Shipping del mateix que la Sra. Rajs?
      SELECT last_name, job_id, salary, department_id
      FROM employees
      WHERE job_id = (SELECT job_id
              FROM employees
              WHERE last_name = 'Rajs')
      AND department_id = (SELECT department_id
              FROM departments
              WHERE department_name = 'Shipping');
      

Funcions de grup en Subconsultes

  • Podem utilitzar funcions de grup en subconsultes per tal que ens retornin un valor.

    Qui guanya menys del sou mitjà?

    Qui guanya menys del sou mitjà?
    SELECT *
    FROM  EMPLOYEES 
    WHERE SALARY < (SELECT AVG(SALARY)
                    FROM EMPLOYEES);
    
  • També podem utilitzar subconsultes a la clàusula HAVING.

    A quins departaments tothom cobra més que l’empleat que cobra menys del departament anomenat Marketing?

    A quins departaments tothom cobra més que l’empleat que cobra menys del departament anomenat Marketing?
    SELECT department_id, department_name, MIN(SALARY)
    FROM EMPLOYEES JOIN DEPARTMENTS USING (DEPARTMENT_ID)
    GROUP BY DEPARTMENT_ID, DEPARTMENT_NAME
    HAVING MIN(SALARY) > (SELECT MIN(SALARY)
                          FROM EMPLOYEES
                          WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                                                 FROM DEPARTMENTS 
                                                 WHERE DEPARTMENT_NAME = 'Marketing')
                         );