Tabla de contenido
Consulta conjunta de varias tablas
Consulta de combinación de varias tablas
Clasificación de consultas de varias tablas
Consulta cruzada (producto cartesiano)
Diferentes resultados para subconsultas
Diferentes lugares donde se aplican las subconsultas
Aplicación de subconsultas en diferentes declaraciones externas
Consulta conjunta de varias tablas
1. Mediante consulta conjunta, puede obtener el conjunto de registros en dos tablas o el conjunto de registros comunes, o el conjunto de registros en una de las tablas
2. La consulta conjunta opera sobre la tabla en unidades de filas, principalmente para aumentar o disminuir el número de filas
3. El número de columnas y el tipo del número de columnas entre varias tablas utilizadas como consulta conjunta deben ser iguales (por ejemplo: qué columnas se consultan en la tabla 1, qué columnas se consultan en la tabla 2)
4. La consulta conjunta eliminará los registros duplicados de forma predeterminada
5. La consulta conjunta puede usar cualquier declaración SELECT, pero la cláusula ORDER BY solo se puede usar en la última vez
Tipo de consulta de unión
UNION agrega registros de ciertos campos de dos tablas (unión)
ALL se usa como palabra clave, lo que indica que el resultado de la operación de conjunto retiene filas duplicadas (generalmente UNION ALL)
INTERSECT extrae (intersección) registros comunes de algunos campos de dos tablas (MySQL no existe, puede usar la siguiente consulta de conexión en su lugar)
EXCEPT resta los registros comunes de algunos campos de las dos tablas y luego devuelve los registros restantes (conjunto de diferencias) de una tabla (MySQL no existe, use el campo NOT IN para lograrlo)
Formato de consulta de unión
formato de unión
SELECCIONE la lista de campos DE la tabla A ... UNION SELECCIONE la lista de campos DE la tabla B ...;
Devolver la unión de la consulta de la tabla A y la consulta de la tabla B (y deduplicar el procesamiento)
Unión todo formato
En comparación con la consulta de unión, esta consulta no puede desduplicar los datos combinados
Demostración de consulta de unión
Usamos las siguientes dos tablas para la demostración.
seleccionar nombre , edad del personal 1 donde origo = ' Chongqing ' unión seleccionar nombre , edad del usuario; # consultar tabla 1 origo es el nombre de Chongqing , el resultado del campo de edad más el resultado de la consulta de tabla 2 nombre , edad y deduplicación procesamiento ( Se requiere que los tipos de datos de nombre y edad de las dos tablas sean consistentes)seleccionar nombre , edad del personal1 donde origo = ' Chongqing ' union all seleccionar nombre , edad del usuario; #Sin procesamiento de deduplicaciónseleccione nombre , edad del personal1 donde ( nombre , edad ) no está en ( seleccione nombre , edad del usuario ) ; #Consulte la diferencia entre la tabla 1 y la tabla 2 (reste la intersección de la tabla 1 y la tabla 2 del resultado de la consulta de la tabla 1 )
Consulta de combinación de varias tablas
La consulta de tablas múltiples se basa en columnas horizontales, principalmente agregando algunas columnas de otras tablas
Al realizar consultas de tablas múltiples, las columnas en la cláusula SELECT generalmente se escriben en el formato de nombre de tabla alias.nombre de columna
Usamos dos tablas para la demostración.
Clasificación de consultas de varias tablas
consulta cruzada
Combinando todos los registros de las dos tablas, el número de registros obtenidos es el producto del número de filas en las dos tablas
consulta de unión interna
Consultar los datos en la intersección de las tablas A y B
Consulta de unión externa
Combinación externa izquierda: consulta todos los datos de la tabla de la izquierda y los datos de la intersección de las dos tablas
Combinación externa derecha: consulta todos los datos en la tabla derecha y los datos en la intersección de las dos tablas
consulta de unión automática
Solo hay una tabla y la tabla actual está conectada a sí misma (la subunión debe usar el alias de la tabla)
Consulta cruzada (producto cartesiano)
Las uniones cruzadas se realizan utilizando el operador set GROSS JOIN (producto cartesiano)
Combinando todos los registros de las dos tablas, mientras se agregan otros campos de la tabla, la cantidad de registros obtenidos es el producto de la cantidad de filas en las dos tablas
Formato
SELECCIONE la lista de campos DE la tabla 1, tabla 2; el volumen de datos mostrado es el volumen de datos de la tabla 1 * el volumen de datos de la tabla 2
Precauciones
Podemos ver a través del fenómeno que hay demasiados resultados y hay errores, no hay mucho valor práctico y toma mucho tiempo de cómputo, por lo que esta consulta no se usará en negocios reales.
Pero esta consulta es la base para todas las consultas de tablas.
seleccione usuario .nombre , carrera .nombre from usuario , carrera ; #No se utilizan alias seleccione u.nombre , c.nombre from usuario u , carrera c ; #Usar alias para consulta cruzada
consulta de unión interna
Se pueden seleccionar los datos que existen en ambas tablas, es decir, los datos de intersección de las dos tablas
Divididos en conexión interna implícita y conexión interna explícita, los dos se escriben de manera diferente y los resultados obtenidos son exactamente los mismos.
unión interna implícita
SELECCIONE la lista de campos DE la tabla 1, la tabla 2 DONDE la lista de condiciones;
unión interna explícita
SELECCIONE la lista de campos DE la tabla 1 [INTERIOR] ÚNASE a la tabla 2 EN la lista de condiciones de conexión [DONDE declaración de juicio];
INTERIOR puede omitirse
Si desea agregar Dónde a esta declaración, debe prestar atención a que la declaración ON debe estar entre DESDE y DONDE
La secuencia de ejecución es: primero mostrar la conexión interna y luego ejecutar Where en el resultado de la conexión
Precauciones
Es posible que falten datos al usar uniones internas, y se perderán los valores NULL
seleccione u. nombre , u. edad , c. nombre del usuario u , carrera c donde u. carrera_id = c. id ; # consulta implícita ; seleccione los registros con el mismo usuario.carrera_id y carrera.id , y muestre los registros correspondientes Los campos user.name , user, age , carrera.nombre ; en este momento, si user.career_id tiene un valor nulo o carrera.id tiene un valor nulo, se perderán los datos correspondientes al valor nulo (en este momento, el sexto Los datos)seleccione u. nombre , u. edad , c. nombre del usuario que se une a la carrera c en u. carrera_id = c. id ; #consulta explícita; los resultados de las dos consultas son los siguientesseleccione u. nombre , u. edad , c. nombre del usuario que se une a carrera c on u. id_carrera = c. id donde u. edad > 20 ; #Consulta explícita para filtrar los resultados anteriores, seleccione los datos cuya edad es mayor que 20
Consulta de unión externa
Seleccione toda la información de una sola tabla (tabla principal), y luego agregue la información de la intersección de las dos tablas
izquierda combinación externa
SELECCIONE la lista de campos DESDE la tabla 1 IZQUIERDA [EXTERIOR] ÚNASE a la tabla 2 EN la lista de condiciones;
[EXTERIOR] se puede omitir
Consultar todos los datos en la tabla 1, incluidos los datos en la intersección de la tabla 1 y la tabla 2
seleccione u. nombre , u. edad , c. nombre del usuario que dejó unirse a la carrera c en u.carrera_id = c.id ; #La combinación externa izquierda muestra toda la información de los campos de nombre y edad correspondientes de la tabla de usuarios , y luego agrega usuario La intersección de y career.idunión externa derecha
SELECCIONE la lista de campos DESDE la tabla 1 DERECHA [EXTERIOR] ÚNASE a la tabla 2 EN la lista de condiciones;
[EXTERIOR] se puede omitir
Consultar todos los datos en la tabla 2, incluidos los datos en la intersección de la tabla 1 y la tabla 2
seleccione u. nombre , u. edad , c. nombre del usuario u right join carrera c on u. carrera_id = c. id ; #La combinación externa derecha muestra toda la información de la sección de nombre correspondiente de la tabla de carreras y luego agrega user.career_id e Intersección de career.id
consulta de unión automática
Utilice esta tabla para hacer una demostración de la consulta de autounión (esta tabla registra la tabla de identificación de los empleados y sus supervisores correspondientes, es decir, el nombre de la identificación correspondiente a managerid es el nombre del supervisor)
Conéctese para consultar por sí mismo, que puede ser una conexión interna o una conexión externa
Formato
SELECCIONE la lista de campos DE la tabla A alias A ÚNASE a la tabla A alias B EN la lista de condiciones;
seleccione e1.name , e2.name ' supervisor ' de emp e1 únase a emp e2 en e1.managerid = e2.id ; #Display query , consulta quién es el supervisor correspondiente a cada empleado; puede entenderse como copiar emp como tabla e1 y la tabla e2 tiene dos tablas, asocie el ID de administrador de la tabla e1 con el ID de e2 como clave externa y luego muestre el nombre de la tabla e1 y el nombre de la tabla e2 (aquí, habrá omisiones al usar el método de unión interna explícito )seleccione e1.name , e2.name ' Boss ' from emp e1 left join emp e2 on e1.managerid = e2.id ; #Izquierda conexión externa, también se muestran los empleados sin líderes
reglas de subconsulta
Una subconsulta (Subconsulta) también se puede denominar consulta anidada, que es una consulta anidada en la cláusula Where de otras consultas SQL; una instrucción que contiene una subconsulta se denomina instrucción externa
- Las subconsultas deben estar encerradas entre ()
- Por lo general, la declaración SELECT de una subconsulta tiene solo un campo, a menos que haya varias columnas en la declaración externa que deban compararse con las columnas de la subconsulta.
- Las subconsultas no se pueden aplicar directamente a funciones agregadas y las subconsultas no pueden usar ORDER BY
- Los tipos de datos Ntext, texto e imagen no se pueden usar en la lista de selección de una subconsulta
- La palabra clave DISTINCT no se puede utilizar con subconsultas que contengan GROUP BY
Clasificación de Subconsultas
Según los diferentes resultados de la subconsulta, se puede dividir en 4 categorías
subconsulta escalar resultados de subconsulta como un solo valor
Subconsulta de columna El resultado de la subconsulta es una columna y múltiples filas
Subconsulta de fila El resultado de la subconsulta es una fila con múltiples columnas
Subconsulta de tabla El resultado de la subconsulta son varias filas y varias columnas.
De acuerdo con las diferentes posiciones de la subconsulta, se puede dividir aproximadamente en tres categorías
Hay tres casos principales en los que se aplican subconsultas:
Están después de DONDE, después DE y después de SELECCIONAR
De acuerdo con las diferentes declaraciones externas de la subconsulta, se puede dividir aproximadamente en cuatro categorías
Las declaraciones fuera de la subconsulta pueden ser
Cualquiera de INSERTAR / ACTUALIZAR / ELIMINAR / SELECCIONAR
Diferentes resultados para subconsultas
Consulta a través de las siguientes dos tablas
Subconsulta escalar: el resultado de la consulta solo debe devolver una fila y una columna de resultados, es decir, un valor determinado
Dado que el resultado de su subconsulta es un valor único, se puede utilizar para realizar operaciones aritméticas
Operadores comunes: = , <> , > , >= , < , <=
select * from emp where dept_id =( select id from dept where name = ' sales department ' ) ; #Consulte a todos los empleados correspondientes al departamento de ventas (primero consulte la identificación correspondiente al departamento de ventas y luego consulte a los empleados de acuerdo con la identificación ) seleccione * de emp donde fecha de entrada >= ( seleccione fecha de entrada de emp donde nombre = ' Zhang San ' ) ; #Consulte toda la información del empleado después de la entrada de Zhang San (primero consulte la información de entrada de Zhang San y luego consulte la información del empleado después de esta horaSubconsulta de columna: el resultado devuelto es una columna con varias filas
Operadores de uso común:
IN Seleccione uno del rango establecido especificado por IN
NOT IN no está dentro del rango establecido especificado
Cualquiera de la lista de retorno de subconsulta ANY es suficiente
ALGUNOS es equivalente a CUALQUIER
Todos los valores de la lista devuelta por la subconsulta ALL deben cumplir
seleccione * de emp donde salario > todos ( seleccione salario de emp donde dept_id =( seleccione id de dept donde nombre = ' Departamento de I + D ' )) ; #Consulte la información del empleado cuyo salario es más alto que el de todos los empleados financieros (primero consulte la identificación correspondiente del departamento financiero , use esta identificación para consultar el salario de los empleados en el departamento financiero y luego busque la información de los empleados cuyo salario es mayor que este)Subconsulta de fila: el resultado devuelto es una fila con varias columnas
Operadores comunes: =, <>, IN, NOT IN
select * from emp where ( salario , managerid ) = ( select Salary , managerid from emp where name = ' Li Si ' ) ; #Consulte la información de otros empleados con el mismo salario y liderazgo que Li SiSubconsulta de tabla: el resultado devuelto es varias filas y varias columnas
Operadores de uso común: IN
a menudo aparece después de
seleccione * de emp donde ( dept_id , salario ) en ( seleccione dept_id , salario de emp donde nombre = ' Old Five ' o nombre = ' Li Si ' ) ; # consulta para otros empleados con el mismo departamento y el mismo salario que Lao Wu o Li Si Información del empleado seleccione e.* , nombre del departamento de ( seleccione * de emp donde fecha de entrada > '2001-01-01' ) eleft join dept on e.dept_id = dept.id ; #Consulta la información del empleado y la información del departamento correspondiente cuyo tiempo de entrada es mayor que 2001-01-01
EXISTE 和 NO EXISTE
El formato es: EXISTE (subconsulta)
EXISTS se utiliza para comprobar si la subconsulta devuelve al menos una fila de datos; si la subconsulta devuelve al menos una fila de datos, es verdadero; si la subconsulta no devuelve datos, es falso
En algunos casos, también se pueden usar los campos IN o ANY en su lugar
NO EXISTE es lo contrario de EXISTE
select * from emp donde existe ( select * from emp where id = 10 ) ; #Mientras haya un valor de id=10 , consulta la tabla emp y el resultado no es ningún dato select * from emp where exist ( select * from emp donde id = 1 ) ; #Mientras haya un valor de id=1 , consulta la tabla emp y el resultado son los datos de la tabla emp
Diferentes lugares donde se aplican las subconsultas
Hay tres situaciones principales en las que se aplica la subconsulta: después de DONDE, después DE y después de SELECCIONAR
En la cláusula Where , las subconsultas generales se aplican después de where
Lo que hemos demostrado arriba son todas las subconsultas después de where
Generalmente formal: SELECT * FROM t1 WHERE column1= ( SELECT column1 FROM t2 );
En la cláusula From : el conjunto de resultados devuelto por la subconsulta en este momento se usará como una tabla temporal, que también se denomina tabla derivada.
La tabla derivada debe configurarse con un alias y los nombres de las columnas de la tabla derivada deben ser únicos.
select * from ( select origo , count ( * ) as number from staff1 group by origo ) as emp where emp.number > 2 ; #Grupo por lugar de residencia, y consulta el número de personas en el lugar de residencia mayor que 2 (el el alias de la tabla derivada es emp)Después de Seleccionar : solo se admite la subconsulta escalar, la subconsulta devuelve un valor único
SELECT (subconsulta) FROM table1;
El valor único devuelto por la subconsulta es un campo en la Tabla 1; esta consulta rara vez se usa
Aplicación de subconsultas en diferentes declaraciones externas
La declaración fuera de la subconsulta puede ser cualquiera de INSERT/UPDATE/DELETE/SELECT
Experimentos basados en las siguientes dos tablas
Subconsulta en declaración SELECT
seleccionar * del usuario donde carrera_id = ( seleccionar id de carrera donde nombre = ' chef ' ) ; #consultar quién es un chef en el usuario (subconsulta consulta id del chef , y luego declaración externa para consultar a la persona correspondiente a esta identificación)Subconsultas en sentencias INSERT
inserte en usuario1 ( nombre , edad , carrera_id ) seleccione * del usuario donde carrera_id en ( seleccione id de carrera) ; #Agregue datos a la tabla de usuario1 , los datos agregados son la persona con una posición en la tabla de usuariosSubconsultas en sentencias UPDATE
actualice el conjunto de usuarios edad = edad * 1.5 donde carrera_id = ( seleccione id de carrera donde nombre = ' chef ' ) ; #multiplique la edad del chef por 1.5Subconsulta en declaración DELETE
borrar del usuario donde carrera_id = ( seleccionar id de carrera donde nombre = ' chef ' ) ; #Explicar la información de que la ocupación en la tabla de usuario es un chef