DQL-Subconsulta

Subconsulta

  • Significado: La declaración de selección que aparece en otras declaraciones se denomina subconsulta o consulta interna. La
    declaración de consulta externa se denomina consulta principal o consulta externa.

  • Clasificación

    • Según la ubicación de la subconsulta:
      • La instrucción select
        solo admite consultas cuánticas estándar
        • de la declaración
          Subconsulta de tabla de soporte
        • Dónde o tener (foco)
          consulta cuántica escalar (fila única)
          subconsulta de columna (filas múltiples)
          subconsulta de fila (usar menos)

        • Consulta de tabla después de la instrucción existe (consulta correlacionada)
    • De acuerdo con el número de filas y columnas del conjunto de resultados
      + consulta cuántica estándar (el resultado es solo una fila y una columna)
      + subconsulta de columna (solo una columna y varias filas)
      + subconsulta de fila (el resultado puede tener una fila y una columna)
      + subconsulta de tabla (el conjunto de resultados es generalmente múltiples filas y columnas )

1. Subconsulta después de dónde o tener

  • Operador de comparación de múltiples filas de subconsulta de columnas

    1. IN / NOT IN: igual a cualquiera en la lista
    2. CUALQUIERA / ALGUNA: Comparación con una lista de subconsulta (similar a la comparación de cada valor es la operación OR)
    3. TODOS: Compare con cada valor en la lista de subconsulta (similar a cada comparación de valor es operación AND)
  • Caracteristicas

    1. Las subconsultas se colocan entre paréntesis

    2. Las subconsultas generalmente se colocan en el extremo derecho de la condición

    3. Consulta cuántica estándar, generalmente con operador de línea única

    <,>, <=,> =, =,! =

    1. Subconsulta de columnas, generalmente utilizada con operadores de varias filas

    en cualquiera / algunos, todos

    1. Prioridad de ejecución de subconsulta y ejecución de consulta principal
  1. Consulta cuántica estándar (subconsulta de una sola fila)

    • Caso 1: ¿Quién tiene un salario más alto que Abel?

      SELECT 
          last_name, salary
      FROM
          employees
      WHERE
          salary > (
      		SELECT 
                  salary
              FROM
                  employees
              WHERE
                  last_name = 'Abel');
      
    • Caso 2: Devuelva el nombre, id_trabajo y salario del empleado cuyo id_trabajo sea el mismo que el empleado 141, el salario es más que el empleado 141

      Realizar una consulta de cláusula única

      SELECT 
          last_name, job_id, salary
      FROM
          employees
      WHERE
          job_id = (SELECT 
                  job_id
              FROM
                  employees
              WHERE
                  employee_id = 141)
              AND salary > (SELECT 
                  salary
              FROM
                  employees
              WHERE
                  employee_id = 143);
      
    • Caso 3: Devuelva el apellido, el nombre de trabajo y el salario del empleado con el salario más bajo

      Usar funciones de grupo en subconsultas

      SELECT 
          last_name, job_id, salary
      FROM
          employees
      WHERE
          salary = (SELECT 
                  MIN(salary)
              FROM
                  employees);
      
    • Caso 4: Consultar el ID del departamento y el salario mínimo del salario mínimo mayor que el salario mínimo del departamento 50

      TENIENDO declaración en la cláusula

      SELECT 
          department_id, MIN(salary)
      FROM
          employees
      GROUP BY department_id
      HAVING MIN(salary) > (SELECT 
              MIN(salary)
          FROM
              employees
          WHERE
              department_id = 50);
      
  2. Subconsulta de columna (subconsulta de varias filas)

    • Caso 1: Devuelva los nombres de todos los empleados en el departamento cuyo location_id es 1400 o 1700

      # 连接查询
      SELECT 
          d.location_id, e.last_name
      FROM
          departments d
              INNER JOIN
          employees e ON e.department_id = d.department_id
      WHERE
          d.location_id IN (1400 , 1700);
      # 列子查询
      SELECT 
          last_name
      FROM
          employees
      WHERE
          department_id IN (SELECT 
                  department_id
              FROM
                  departments
              WHERE
                  location_id IN (1400 , 1700));
      
    • Caso 2: Devuelva el ID de empleado, el nombre, el ID de trabajo y el salario de cualquier empleado cuyo salario sea inferior al ID de trabajo de cualquier departamento con 'IT_PROG'

      Use el operador CUALQUIERA en una subconsulta de varias filas

      SELECT 
          employee_id, last_name, job_id, salary
      FROM
          employees
      WHERE
          salary < ANY (SELECT DISTINCT
                  salary
              FROM
                  employees
              WHERE
                  job_id = 'IT_PROG')
              AND job_id <> 'IT_PROG';
      
    • Caso 3: Regrese al número de trabajo, nombre, id_trabajo y salario de todos los empleados en el departamento cuyo id_trabajo sea menor que id_trabajo es 'IT_PROG'

      Use el operador ALL en una subconsulta de varias filas

      SELECT 
          employee_id, last_name, job_id, salary
      FROM
          employees
      WHERE
          salary < ALL (SELECT 
                  salary
              FROM
                  employees
              WHERE
                  job_id = 'IT_PROG')
              AND job_id <> 'IT_PROG';
      
  3. Subconsulta de fila (una fila con múltiples columnas, múltiples filas con múltiples columnas)

    • Caso: consulta la identificación de empleado del empleado con la identificación de empleado más pequeña y el salario más alto. Nombre, salario, id_trabajo

      SELECT 
          employee_id, last_name, salary, job_id
      FROM
          employees
      WHERE
          employee_id = (SELECT 
                  MIN(employee_id)
              FROM
                  employees)
              AND salary = (SELECT 
                  MAX(salary)
              FROM
                  employees);
      

Segundo, la subconsulta detrás de la instrucción select

select solo admite consultas cuánticas estándar

  • Caso 1: Consulta el número de empleados en cada departamento

    # 子查询
    SELECT 
        d.department_id,
        (SELECT 
                COUNT(*)
            FROM
                employees e
            WHERE
                e.department_id = d.department_id) COUNT
    FROM
        departments d;
    # 分组查询
    SELECT 
        department_id, COUNT(last_name) COUNT
    FROM
        employees
    GROUP BY department_id;
    
  • Caso 2: Consulte el nombre del departamento con un número de empleado igual a 102

    # 子查询版本
    SELECT 
        department_name
    FROM
        departments
    WHERE
        department_id = (SELECT 
                department_id
            FROM
                employees
            WHERE
                employee_id = 102);
    # 连接查询
    SELECT 
        d.department_name
    FROM
        departments d
            INNER JOIN
        employees e ON e.department_id = d.department_id
    WHERE
        e.employee_id = 102;
    

Tres, la subconsulta detrás de

  • Caso 1: Consultar el nivel salarial del salario promedio de cada departamento

    SELECT 
        A.department_id, round(A.AVG_SAL, 2), j.grade_level
    FROM
        (SELECT 
            AVG(salary) AVG_SAL, department_id
        FROM
            employees
        GROUP BY department_id) A
            INNER JOIN
        job_grades j ON A.AVG_SAL BETWEEN lowest_sal AND highest_sal;
    

4. Subconsultas detrás existe (subconsultas correlacionadas)

# 判断子查询里面有没有值
SELECT 
    EXISTS( SELECT 
            employee_id
        FROM
            employees); # 1 有
SELECT 
    EXISTS( SELECT 
            salary
        FROM
            employees
        WHERE
            salary = 30000); # 0 没有
  • Caso: consulta el nombre del departamento de un empleado

    # exists版本
    SELECT 
        department_name
    FROM
        departments d
    WHERE
        EXISTS( SELECT 
                *
            FROM
                employees e
            WHERE
                d.department_id = e.department_id);
    # in版本
    SELECT 
        department_name
    FROM
        departments d
    WHERE
        d.department_id IN (SELECT 
                department_id
            FROM
                employees e
            WHERE
                e.department_id = d.department_id);
    

Pruebas relacionadas

  1. Consulta los nombres y salarios de los empleados en el mismo departamento que Zlotkey

    SELECT 
        last_name, salary
    FROM
        employees
    WHERE
        department_id = (SELECT 
                department_id
            FROM
                employees
            WHERE
                last_name = 'Zlotkey');
    
  2. Consultar el número de empleado, el nombre y el salario de los empleados cuyo salario es más alto que el salario promedio de la empresa

    SELECT 
        employee_id, last_name, salary
    FROM
        employees
    WHERE
        salary > (SELECT 
                AVG(salary)
            FROM
                employees);
    
  3. Consulte el número de empleado y el nombre de los empleados en cada departamento cuyo salario es más alto que el salario promedio del departamento

    SELECT 
        employee_id, last_name
    FROM
        employees e
            INNER JOIN
        (SELECT 
            AVG(salary) av, department_id
        FROM
            employees
        GROUP BY department_id) A ON e.department_id = A.department_id
    WHERE
        e.salary > A.av;
    
  4. Consulte el número de empleado y el nombre de los empleados cuyo nombre contiene la letra u en el mismo departamento

    SELECT 
        employee_id, last_name
    FROM
        employees e
    WHERE
        e.department_id IN (SELECT DISTINCT
                department_id
            FROM
                employees
            WHERE
                last_name LIKE '%u%');
    
  5. Consulte el número de empleado del empleado que trabaja en el departamento cuyo location_id es 1700

    SELECT 
        employee_id
    FROM
        employees
    WHERE
        department_id IN (SELECT 
                department_id
            FROM
                departments
            WHERE
                location_id = 1700);
    
  6. Consulta el nombre y el salario del empleado cuyo gerente es K_ing

    SELECT 
        last_name, salary
    FROM
        employees
    WHERE
        manager_id IN (SELECT 
                employee_id
            FROM
                employees
            WHERE
                last_name = 'K_ing');
    
  7. Consulta el nombre del empleado con el salario más alto, que requiere nombre_y apellido_como columna

    SELECT 
        CONCAT(first_name, ' ', last_name)
    FROM
        employees
    WHERE
        salary = (SELECT 
                MAX(salary)
            FROM
                employees);

Supongo que te gusta

Origin www.cnblogs.com/klenkiven/p/12723738.html
Recomendado
Clasificación