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 la declaración
- La instrucción select
- 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 )
- Según la ubicación de la subconsulta:
1. Subconsulta después de dónde o tener
-
Operador de comparación de múltiples filas de subconsulta de columnas
- IN / NOT IN: igual a cualquiera en la lista
- CUALQUIERA / ALGUNA: Comparación con una lista de subconsulta (similar a la comparación de cada valor es la operación OR)
- TODOS: Compare con cada valor en la lista de subconsulta (similar a cada comparación de valor es operación AND)
-
Caracteristicas
-
Las subconsultas se colocan entre paréntesis
-
Las subconsultas generalmente se colocan en el extremo derecho de la condición
-
Consulta cuántica estándar, generalmente con operador de línea única
<,>, <=,> =, =,! =
- Subconsulta de columnas, generalmente utilizada con operadores de varias filas
en cualquiera / algunos, todos
- Prioridad de ejecución de subconsulta y ejecución de consulta principal
-
-
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);
-
-
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';
-
-
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
-
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');
-
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);
-
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;
-
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%');
-
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);
-
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');
-
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);