Database_08_subquery

# 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
);

Supongo que te gusta

Origin blog.csdn.net/Yungang_Young/article/details/104731453
Recomendado
Clasificación