# Advanced7: Subconsulta
Significado:
la instrucción de selección que aparece en otras declaraciones se denomina subconsulta o consulta interna.
La consulta externa se denomina consulta principal o consulta externa.
Clasificación:
según la posición en la que aparece la subconsulta: después de la
selección, solo
se admiten subconsultas después de las subconsultas
* dónde o teniendo; después de las subconsultas * subconsultas estándar (una sola fila) * subconsultas (múltiples filas) subconsultas
después de que existan subconsultas de fila (subconsultas correlacionadas) Tabla las subconsultas
difieren según el número de filas y columnas en el conjunto de resultados:
subconsulta escalar (el conjunto de resultados tiene solo una fila y una columna)
subconsulta de columna (el conjunto de resultados tiene solo una columna y varias filas)
subconsulta de fila (el conjunto de resultados tiene una fila y varias columnas)
subconsulta de la tabla (el conjunto de resultados es generalmente varias filas y varias columnas)
# ------------------------------------------------- ---
# 一, detrás de donde y teniendo
Características:
1. Las subconsultas se colocan entre paréntesis
2. Las subconsultas generalmente se colocan en el lado derecho de la condición
3. Subconsultas escalares: generalmente se utilizan con operadores de una sola línea> <> = <= = <>
Columna sub- consultas: por lo general más colocaciones que el operador usa en fila, cualquier / algunos, todos
4. la ejecución de la subconsulta tiene prioridad sobre la consulta principal
# 1. 标 地震 Consulta
#Caso 1: Cuyo salario es más alto que Abel
SELECT last_name
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name='Abel'
);
#Caso 2: Devuelve el nombre, job_id y salario del empleado cuyo job_id es el mismo que el empleado 141 y el salario es mayor que el del empleado 143
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: Devuelve el apellido, id_trabajo, salario del empleado menos pagado de la empresa
SELECT last_name,job_id,salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees
);
#Caso 4: Consultar el ID del departamento cuyo salario mínimo es mayor que el salario mínimo del departamento No. 50 y su salario mínimo
#step 1.50号部门最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id=50;
#step 2.最低工资大于1的部门id和其最低工资
SELECT department_id,MIN(salary) 最低工资
FROM employees
GROUP BY department_id
HAVING 最低工资>(
SELECT MIN(salary)
FROM employees
WHERE department_id=50
);
# 2 Subconsulta de columna (subconsulta de varias líneas )
# Caso 1: Devuelve los nombres de todos los empleados del departamento cuyo location_id es 1400 o 1700
#step 1 查询location_id是1400或1700的部门编号
SELECT department_id
FROM departments
WHERE location_id IN(1400,1700);
#step 2 查询员工姓名,要求部门号是1列表中的某一个
SELECT last_name
FROM employees
WHERE department_id IN(
SELECT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
#Caso 2: Devuelva la identificación del empleado, el nombre, el job_id y el salario de cualquier empleado cuyo salario sea más bajo que cualquiera de los trabajos cuyo job_id sea 'IT_PROG' en otros tipos de trabajo
#step 1 job_id为IT_PROG的员工工资
SELECT DISTINCT salary
FROM employees
WHERE job_id='IT_PROG';
#step 2 其他工种中比1任意工资低的员工信息
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ALL(
SELECT DISTINCT salary
FROM employees
WHERE job_id='IT_PROG'
)
AND job_id <> 'IT_PROG';
#或
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<(
SELECT MIN(salary)
FROM employees
WHERE job_id='IT_PROG'
)
AND job_id <> 'IT_PROG';
# 3. Subconsulta de fila (conjunto de resultados con una fila y varias columnas o varias filas y varias columnas) Menos utilizado
# Caso: Consulta la información del empleado con el número de empleado más pequeño y el salario más alto
SELECT *
FROM employees
WHERE (employee_id,salary)=(
SELECT MIN(employee_id),MAX(salary)
FROM employees
);
# ------------------------------------------------- --------
# 二 , seleccione de nuevo
#Solo admite consulta cuántica estándar
#Caso 1: Consultar el número de empleados en cada departamento
#分组查询不能得出员工个数为0的部门
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
#标量子查询
SELECT d.*,(
SELECT COUNT(*)
FROM employees e
WHERE e.department_id=d.`department_id`
)
FROM departments d;
#Caso 2: Consultar el nombre del departamento del número de empleado = 102
#法一:多表连接
SELECT d.department_name,e.employee_id
FROM departments d
JOIN employees e
ON d.`department_id`=e.`department_id`
WHERE e.`employee_id`=102;
#法二:标量子查询
SELECT department_name
FROM departments
WHERE department_id=(
SELECT department_id
FROM employees
WHERE employee_id=102
);
# ------------------------------------------------- ------------------
# 三 , de 后 # El
resultado de la
subconsulta se usa como una tabla, y se requieren alias. # Caso: Consulta el grado salarial del salario promedio de cada departamento
SELECT ag_dep.*,g.grade_level
FROM (
SELECT AVG(salary) 平均工资,department_id
FROM employees
GROUP BY department_id;
) ag_dep
JOIN job_grades g
ON ag_dep.平均工资 BETWEEN lowest_sal AND highest_sal
# ------------------------------------------------- ------------------
# 四, detrás existe (subconsulta relacionada)
Sintaxis: after
existe (declaración de consulta completa)
resultado:
1 o 0
# Caso 1: Consultar el nombre del departamento con los empleados
# Utilizar subconsulta de columna
#step 1查询有员工的部门
SELECT DISTINCT department_id
FROM employees
WHERE department_id IS NOT NULL;
#step2 查询部门名
SELECT department_name
FROM departments d
WHERE d.department_id IN (
SELECT DISTINCT department_id
FROM employees
WHERE department_id IS NOT NULL
);
# 用 existe
SELECT department_name
FROM departments d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE d.`department_id`=e.`department_id`
);
# Caso 2: Consultar información sobre un dios masculino que no tiene novia
#in
SELECT bo.*
FROM boys bo
WHERE bo.`id` NOT IN(
SELECT DISTINCT be.boyfriend_id
FROM beauty be
);
#exists
SELECT bo.*
FROM boys bo
WHERE NOT EXISTS(
SELECT be.boyfriend_id
FROM beauty be
WHERE be.`boyfriend_id`=bo.`id`
);
# ---------------------------------------
# 测试
# 1. Consultar el mismo departamento que Nombre y salario del empleado de 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, nombre y salario de los empleados cuyo salario sea superior al salario promedio de la empresa
SELECT employee_id,last_name,salary
FROM employees
WHERE salary>(
SELECT AVG(salary)
FROM employees
);
# 3 *. Consultar el número de empleado, nombre y salario de los empleados en cada departamento cuyo salario sea superior al salario promedio del departamento
#step 1查询各部门的平均工资
SELECT AVG(salary),department_id
FROM employees ep
GROUP BY department_id;
#step 2平均工资与员工表连接,并添加筛选条件
SELECT employee_id,last_name,salary
FROM employees e
JOIN (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) avg_de
ON avg_de.department_id=e.`department_id`
WHERE e.salary>avg_de.ag;
# 4. Consulta el número de empleado y el nombre del empleado cuyo nombre contiene la letra u en el mismo departamento
SELECT employee_id,last_name,department_id
FROM employees
WHERE department_id IN (
SELECT DISTINCT department_id
FROM employees
WHERE last_name LIKE '%u%'
);
# 5. Consultar el número de empleados de empleados que trabajan 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 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. Consulte el nombre del empleado con el salario más alto, requiriendo que el nombre y apellido se muestren como una columna, los nombres de las columnas son apellido y nombre
SELECT CONCAT(first_name,',',last_name) '姓,名'
FROM employees
WHERE salary>=ALL(
SELECT salary
FROM employees
);
# 8. Consulta la información del empleado con menor salario: apellido, salario
SELECT last_name,salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees
);
# 9 *. Consultar información sobre el departamento con el salario medio más bajo
SELECT *
FROM departments
WHERE department_id=(
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
);
# 10. Consulta la información del puesto con el salario promedio más alto
SELECT *
FROM jobs
WHERE job_id=(
SELECT job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 1
);
# 11. Consulta qué departamentos tienen un salario medio superior al salario medio de la empresa.
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)>(
SELECT AVG(salary)
FROM employees
);
# 12. Consultar la información detallada de todos los gerentes de la empresa
SELECT *
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL
);
# 13. Consulta cuál es el salario mínimo de menor salario en cada departamento
SELECT MIN(salary)
FROM employees
WHERE department_id=(
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1
);