[Serie MySQL] Aprendizaje de consultas compuestas de MySQL_ Consulta de varias tablas | Autounión | Subconsulta | Consulta de combinación

El contenido del artículo "Prefacio" es aproximadamente el estudio de las consultas compuestas de MySQL.

"Columna de pertenencia" MySQL

Página de inicio personal "Enlace a la página de inicio"

"Autor" Sr. Maple Leaf (fy)

mysql

1. Revisión de consultas básicas

La consulta de la tabla mysql explicada en el capítulo anterior es consultar una tabla, lo cual está lejos de ser suficiente en el desarrollo real. A continuación se explicará la consulta compuesta y primero se revisará la consulta básica.

La base de datos utilizada es la tabla de información de empleados del capítulo anterior, tabla de empleados (emp), tabla de departamentos (dept) y tabla de grados salariales (salgrade).
inserte la descripción de la imagen aquí

Consulta empleados cuyo salario sea superior a 500 o cuyo cargo sea GERENTE, y sus iniciales deben estar en mayúscula J

mysql> select * from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%';

inserte la descripción de la imagen aquí

Ordenar por número de departamento en orden ascendente y salario de empleado en orden descendente

mysql> select * from emp order by deptno asc, sal desc;

inserte la descripción de la imagen aquí

Ordenar en orden descendente por salario anual

mysql> select ename, sal*12+ifnull(comm, 0) as 年薪 from emp order by 年薪 desc;

inserte la descripción de la imagen aquí
Nota:

  • Dado que el resultado del cálculo es NULL y cualquier valor es NULL, al calcular el salario anual, no puede agregar directamente 12 veces el salario mensual al bono de cada empleado, lo que puede resultar en un valor NULL para el salario anual.
  • Al calcular el salario anual de cada empleado, se debe utilizar la función ifnull para determinar si la bonificación del empleado es NULL. Si no es NULL, la función ifnull devuelve la bonificación del empleado. Si es NULL, la función ifnull devuelve 0 para evitar involucrando valores NULL en el cálculo.

Mostrar los nombres y puestos de trabajo de los empleados mejor pagados

Se requieren dos consultas para resolver este problema.
inserte la descripción de la imagen aquí
Además, se pueden utilizar subconsultas para combinar las dos declaraciones de consulta y la declaración SQL de la primera consulta debe estar entre paréntesis.

mysql> select ename, job from emp where sal = (select max(sal) from emp);

inserte la descripción de la imagen aquí

Mostrar información sobre empleados cuyo salario es superior al salario promedio

También use subconsulta para resolver

mysql> select * from emp where sal > (select avg(sal) from emp);

inserte la descripción de la imagen aquí

Mostrar salarios promedio y máximos para cada departamento

Especifique la agrupación por número de departamento en la cláusula agrupar por y utilice la función promedio y la función máxima en la declaración de selección para consultar el salario promedio y el salario máximo de cada departamento.

mysql> select deptno, format(avg(sal), 2) 平均, max(sal) 最高 from emp group by deptno;

inserte la descripción de la imagen aquí

Mostrar los números de departamento cuyo salario promedio es inferior a 2000 y su salario promedio

En la cláusula agrupar por, especifique la agrupación por número de departamento, use la función promedio en la declaración de selección para consultar el salario promedio de cada departamento y especifique en la cláusula tener que la condición de filtro es que el salario promedio sea inferior a 2000

mysql> select deptno, avg(sal) 平均工资 from emp group by deptno having 平均工资 < 2000;

inserte la descripción de la imagen aquí

Mostrar el número total de empleados para cada puesto, salario promedio

mysql> select job, count(*) 人数, format(avg(sal), 2) 平均工资 from emp group by job;

inserte la descripción de la imagen aquí

Dos consultas de varias tablas

Las consultas básicas anteriores se basan en una tabla. En el desarrollo real, los datos a menudo provienen de diferentes tablas, por lo que se requieren consultas de varias tablas.

  • Al realizar una consulta de varias tablas, solo necesita colocar los nombres de las tablas de varias tablas después de la cláusula from y separarlas con comas. En este momento, MySQL tomará el producto cartesiano de las múltiples tablas dadas como la fuente de datos inicial para múltiples tablas. -consultas de tabla
  • La esencia de la consulta de varias tablas es tomar el producto cartesiano de varias tablas dadas y luego consultar la nueva tabla.

Producto cartesiano significa que dados dos conjuntos A y B, cada elemento de A y cada elemento de B pueden formar un par ordenado, y el conjunto de estos pares ordenados es el producto cartesiano de A y B.

Por ejemplo, el producto cartesiano de la tabla de empleados y la tabla de departamentos.

Tabla de empleados:
inserte la descripción de la imagen aquí
tabla de departamentos:
inserte la descripción de la imagen aquí
producto cartesiano de dos tablas

mysql> select * from emp, dept;

inserte la descripción de la imagen aquí
El producto cartesiano de la tabla de empleados y la tabla de departamentos se compone de dos partes. La primera mitad es la información de las columnas de la tabla de empleados y la segunda mitad es la información de las columnas de la tabla de departamentos. Seleccione un registro para combinarlo con todos
inserte la descripción de la imagen aquí
los registros en la tabla de departamentos, y luego seleccione un registro de la tabla de empleados para combinarlo con todos los registros en la tabla de departamentos, y así sucesivamente, y finalmente obtenga una nueva tabla para tomar el producto cartesiano de varias tablas. Los datos resultantes no son
inserte la descripción de la imagen aquí
todos significativo.

Por ejemplo, al tomar el producto cartesiano de la tabla de empleados y la tabla de departamentos, la información de cada empleado en la tabla de empleados se combinará con la información de cada departamento en la tabla de departamentos, pero un empleado real solo puede ser efectivo si se combina con su propio departamento. información Importante, por lo que es necesario filtrar los registros donde el número de departamento del empleado es igual al número de departamento de la nueva tabla generada por el producto cartesiano.
inserte la descripción de la imagen aquí
Nota: El mismo nombre de columna puede existir en varias tablas para el producto cartesiano. En este momento, al seleccionar el nombre de la columna, es necesario especificarlo. 表名.列名Si hay duplicados y no se especifica la columna exacta, se informará un error.
inserte la descripción de la imagen aquí

Mostrar el nombre del empleado, el salario del empleado y el nombre del departamento

Del significado de la pregunta se puede ver que el nombre del departamento solo está disponible en la tabla del departamento, y otros datos provienen de la tabla emp, es decir, los datos provienen de las tablas EMP y DEPT, por lo que se requiere una consulta conjunta. es decir, consulta de varias tablas

mysql> select emp.ename, emp.sal, dept.deptno from emp, dept where emp.deptno = dept.deptno;

inserte la descripción de la imagen aquí

Muestra el nombre del departamento, el nombre del empleado y el salario del departamento número 10.

El nombre del departamento solo está disponible en la tabla de departamentos, y el nombre del empleado y el salario del empleado solo están disponibles en la tabla de empleados, por lo que es necesario utilizar la tabla de empleados y la tabla de departamentos al mismo tiempo para consultas de varias tablas. En la cláusula donde, especifique que la condición de filtro es que el número de departamento del empleado sea igual al número de departamento (filtrar información calificada)

mysql> select ename, sal, emp.deptno, dname from emp, dept where emp.deptno = dept.deptno and dept.deptno = 10;

inserte la descripción de la imagen aquí
Nota: Al filtrar el departamento cuyo número de departamento es igual a 10, puede usar el número de departamento en la tabla de empleados o puede usar el número de departamento en la tabla de departamentos, porque las dos columnas son iguales.

Mostrar el nombre, salario y nivel salarial de cada empleado.

El nombre del empleado y el salario solo están disponibles en la tabla de empleados, y el nivel salarial solo está disponible en la tabla de escala salarial. Por lo tanto, es necesario utilizar la tabla de empleados y la tabla de escala salarial para realizar consultas en varias tablas. cláusula donde, especifique la condición de filtro como el salario del empleado en los registros losal con hisal

mysql> select ename, sal, grade from emp, salgrade where sal between losal and hisal;

inserte la descripción de la imagen aquí

3. Autoconexión

La autounión se refiere a la consulta de unión en la misma tabla, es decir, no solo podemos tomar el producto cartesiano de diferentes tablas, sino también el producto cartesiano de la misma tabla .

Mostrar el número y nombre del supervisor del empleado FORD.

Puede utilizar una subconsulta para consultar la tabla de empleados primero para obtener el número del líder de FORD y luego consultar la tabla de empleados de acuerdo con el número del líder para obtener el nombre del líder de FORD.

mysql> select empno, ename from emp where empno = (select mgr from emp where ename = 'FORD');

inserte la descripción de la imagen aquí
También puede utilizar consultas de varias tablas (autoconsulta), porque el campo mgr en la tabla de empleados puede asociar la información del empleado en la tabla con la información del líder del empleado.

mysql> select leader.empno, leader.ename from emp leader, emp worder where leader.empno = worder.mgr and worder.ename = 'FORD';

inserte la descripción de la imagen aquí
NotaDado que la autounión debe tomar el producto cartesiano de la misma tabla, al menos una tabla debe tener un alias durante la autounión; de lo contrario, las columnas de las dos tablas no se pueden distinguir.

4. Subconsulta

  • Las subconsultas se refieren a declaraciones de consulta integradas en otras declaraciones SQL, también llamadas consultas anidadas.
  • Las subconsultas se pueden dividir en subconsultas de una sola fila, subconsultas de varias filas, subconsultas de varias columnas y subconsultas utilizadas en la cláusula from.

4.1 Subconsulta de una sola fila

Una subconsulta de una sola fila se refiere a una subconsulta que devuelve una sola fila y una sola columna de datos.

Mostrar empleados en el mismo departamento que SMITH

Consulte el número de departamento de SMITH en la subconsulta y especifique la condición de filtro en la cláusula donde, ya que el número de departamento del empleado es igual al número de departamento devuelto por la subconsulta.

mysql> select * from emp where deptno = (select deptno from emp where ename = 'SMITH');

inserte la descripción de la imagen aquí
Además, para solucionar este problema, también puedes utilizar la autounión.

4.2 Subconsultas de varias filas

Una subconsulta de varias filas se refiere a una subconsulta que devuelve varias filas de datos de una sola columna.

Utilice inpalabras clave; consulte el nombre, puesto, salario y número de departamento de los empleados que tienen el mismo puesto de trabajo que el departamento 10, pero no incluya el propio 10.

Primero consulte qué trabajos están en el Departamento No. 10 y elimine los resultados duplicados al realizar la consulta, porque algunos empleados en el Departamento No. 10 pueden tener los mismos trabajos. Luego
inserte la descripción de la imagen aquí
use la consulta anterior como una subconsulta y use dónde al consultar la tabla de empleados La palabra clave in se usa en la cláusula, y la palabra clave in se usa para juzgar que el puesto de trabajo del empleado es uno de varios puestos obtenidos por la subconsulta


mysql> select ename, job, deptno from emp 
    -> where job in (select distinct job from emp where deptno=10) and deptno<>10;

inserte la descripción de la imagen aquí

Palabra clave de utilidad all; muestra el nombre, el salario y el número de departamento de los empleados cuyo salario es superior al de todos los empleados del departamento 30.

Primero consulte el salario de los empleados del departamento 30 y elimine los duplicados.
inserte la descripción de la imagen aquí

Utilice la consulta anterior como subconsulta y utilice la palabra clave all en la cláusula donde al consultar la tabla de empleados. La palabra clave all se utiliza para determinar si el salario del empleado es mayor que todos los salarios obtenidos por la subconsulta.

mysql> select ename, sal, deptno from emp where sal > all(select distinct sal from emp where deptno=20);

inserte la descripción de la imagen aquí

Utilice anypalabras clave; muestre el nombre, el salario y el número de departamento de los empleados cuyo salario es superior al de cualquier empleado del departamento 30 (incluidos los empleados de su propio departamento).

Primero consulte el salario de los empleados en el departamento 30 y luego use la palabra clave any en la cláusula donde al consultar la tabla de empleados para determinar si el salario del empleado es mayor que uno de los salarios obtenidos en la subconsulta.

mysql> select ename, sal, deptno from emp where sal > any(select distinct sal from emp where deptno=30);

inserte la descripción de la imagen aquí

4.3 Subconsultas de varias columnas

Una subconsulta de una sola fila se refiere a una subconsulta que devuelve solo una sola columna y una sola fila de datos; una subconsulta de varias filas se refiere a datos de una sola columna y varias filas devueltos, todo para una sola columna, mientras que una subconsulta de varias columnas subconsulta se refiere a una subconsulta que devuelve múltiples columnas de declaración de datos

Consultar a todos los empleados que tienen el mismo departamento y puesto que SMITH, excluyendo al propio SMITH.

Primero consulte el número de departamento del departamento de SMITH y su puesto, y luego utilice la consulta anterior como subconsulta

mysql> select * from emp where (deptno,job) = (select deptno, job from emp where ename = 'SMITH') and ename <> 'SMITH';

inserte la descripción de la imagen aquí
Nota:

  • El resultado obtenido por una subconsulta de varias columnas son datos de varias columnas. Al comparar datos de varias columnas, las múltiples columnas que se van a comparar deben estar entre paréntesis.
  • Si la subconsulta de varias columnas devuelve varias filas de datos, también se pueden utilizar in、all和anypalabras clave al filtrar datos.

4.4 Uso de subconsultas en la cláusula from

  • Las declaraciones de subconsulta pueden aparecer no solo en la cláusula donde, sino también en la cláusula from.
  • La declaración de subconsulta aparece en la cláusula from y el resultado de su consulta se utilizará como una tabla temporal.

Muestra el nombre, departamento, salario y salario promedio de cada empleado cuyo salario sea superior al salario promedio de su departamento.

Primero consulte el salario promedio de cada departamento, use esta tabla como tabla temporal,
inserte la descripción de la imagen aquí
luego realice una consulta de varias tablas en la tabla de empleados y los resultados de la consulta anterior, especifique la condición de filtro en la cláusula donde ya que el número de departamento del empleado es igual al número de departamento en la tabla temporal y el salario del empleado es mayor que el salario promedio en la tabla temporal

mysql> select ename, emp.deptno, sal, 平均工资 from emp, (select deptno, avg(sal) 平均工资 from emp group by deptno) tmp 
    -> where emp.deptno=tmp.deptno and sal > 平均工资;

inserte la descripción de la imagen aquí
Nota: Cuando utilice una subconsulta en la cláusula from, debe asignar un alias a la tabla temporal obtenida por la subconsulta; de lo contrario, la consulta fallará.

Encuentre el nombre, salario, departamento, salario más alto de la persona con el salario más alto en cada departamento

Primero consulte el salario más alto de cada departamento
inserte la descripción de la imagen aquí
, luego tome el producto cartesiano de la tabla de empleados y los resultados de la consulta anterior, especifique la condición de filtro en la cláusula donde ya que el número de departamento del empleado es igual al número de departamento en la tabla temporal, y el El salario del empleado es igual al salario temporal más alto de la tabla.

mysql> select ename, sal, emp.deptno, 最高工资 from emp, (select max(sal) 最高工资, deptno from emp group by deptno) tmp 
    ->  where emp.deptno=tmp.deptno and sal=最高工资;

inserte la descripción de la imagen aquí

Mostrar la información de cada departamento (nombre del departamento, número, dirección) y la cantidad de personal.

Agrupe por número de departamento, consulte respectivamente la cantidad de personal en cada departamento. La
inserte la descripción de la imagen aquí
consulta anterior se coloca en la cláusula from como una subconsulta, y luego toma el producto cartesiano de la tabla de empleados y la tabla temporal, y especifica el departamento donde se encuentra el filtro. la condición es el empleado en la cláusula donde El número es igual al número de departamento en la tabla temporal

mysql> select dname, dept.deptno, loc, 部门人数 from dept, (select deptno, count(*) 部门人数 from emp group by deptno) 
    -> tmp where dept.deptno = tmp.deptno;

inserte la descripción de la imagen aquí
Lo anterior también se puede resolver utilizando únicamente consultas de varias tablas.

mysql> select dname, dept.deptno, loc, count(*) 人数 from emp, dept 
    -> where emp.deptno = dept.deptno 
    -> group by dept.deptno, dname, loc;

inserte la descripción de la imagen aquí

Cinco, consulta combinada

La consulta combinada se refiere a la combinación de múltiples resultados de consulta, palabras clave unionyunion all

  • La unión se utiliza para obtener la unión de dos resultados de consulta y la unión eliminará automáticamente las filas duplicadas en el conjunto de resultados.
  • union all también se usa para obtener la unión de dos resultados de consulta, pero union all no eliminará filas duplicadas en el conjunto de resultados.

Descubra las personas cuyo salario es superior a 2500 o cuyo puesto es DIRECTOR

Consulta a los empleados cuyo salario es superior a 2500 y consulta a los empleados cuyo puesto es MANAGER.
inserte la descripción de la imagen aquí
Puedes usar el operador o para conectar las dos condiciones en la cláusula donde.
inserte la descripción de la imagen aquí
También puedes usar unionSQL para conectar las dos consultas anteriores y obtendrá dos consultas La unión de los resultados y los resultados combinados se deduplicarán

mysql> select ename, job, sal from emp where sal > 2500 union
    -> select ename, job, sal from emp where sal > 2500 or job = 'MANAGER';

inserte la descripción de la imagen aquí
Se puede utilizar union ally el resultado no es la deduplicación.
inserte la descripción de la imagen aquí
Aviso: El número de columnas de los dos resultados de la consulta que se van a fusionar debe ser el mismo; de lo contrario, no se pueden fusionar
--------------------- FIN ----- ----- ------------

「 作者 」 枫叶先生
「 更新 」 2023.8.25
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。

Supongo que te gusta

Origin blog.csdn.net/m0_64280701/article/details/132412477
Recomendado
Clasificación