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)
Tabla de contenido
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).
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%';
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;
Ordenar en orden descendente por salario anual
mysql> select ename, sal*12+ifnull(comm, 0) as 年薪 from emp order by 年薪 desc;
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.
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);
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);
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;
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;
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;
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:
tabla de departamentos:
producto cartesiano de dos tablas
mysql> select * from emp, dept;
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
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
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.
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.
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;
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;
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;
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');
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';
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');
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
in
palabras 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
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;
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.
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);
Utilice
any
palabras 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);
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';
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和any
palabras 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,
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 > 平均工资;
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
, 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=最高工资;
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
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;
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;
Cinco, consulta combinada
La consulta combinada se refiere a la combinación de múltiples resultados de consulta, palabras clave union
yunion 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.
Puedes usar el operador o para conectar las dos condiciones en la cláusula donde.
También puedes usar union
SQL 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';
Se puede utilizar union all
y el resultado no es la deduplicación.
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
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
或有谬误或不准确之处,敬请读者批评指正。