Consulta MySQL de múltiples tablas (súper detallada)

1. Relación de varias tablas

        Durante el desarrollo del proyecto, al diseñar la estructura de la tabla de la base de datos, la estructura de la tabla se analizará y diseñará en función de las necesidades del negocio y la relación entre los módulos de negocio. Dado que los negocios están interrelacionados, existen varias conexiones entre cada estructura de la tabla. Básicamente hay tres tipos:

  • Uno a muchos (muchos a uno)
  • muchos a muchos
  • Cara a cara

1.1 Uno a muchos

Caso: departamento y empleado
Relación: un departamento corresponde a varios empleados y un empleado corresponde a un departamento
Implementación: establezca una clave externa en muchos lados, apuntando a la clave primaria de un lado (en desarrollo, la configuración de Las claves generalmente se cancelan, es decir, en muchos lados Una parte puede crear un campo que apunte a la clave principal de una parte)

1.2 Muchos a muchos

Caso: Estudiantes y cursos
Relación: Un estudiante puede elegir varios cursos, y un curso también puede ser tomado por varios estudiantes. Implementación
: Crear una tercera tabla intermedia. La tabla intermedia contiene al menos dos claves foráneas, que están relacionadas con las claves primarias. de las dos partes (desarrollo En general, puede cancelar la configuración de claves externas, es decir, crear dos campos en la tabla intermedia que apunten a las claves primarias de ambas partes)

1.3 Uno a uno

Caso: usuario y detalles de usuario
Relación: relación uno a uno, utilizada principalmente para dividir una sola tabla. Coloque los campos básicos de una tabla en una tabla y otros campos de detalles en otra tabla para mejorar la eficiencia operativa. Implementación: en cualquier lado
Agregar una clave externa, asociarla con la clave principal de la otra parte y configurar la clave externa para que sea única (ÚNICA) (Durante el desarrollo, la configuración de la clave externa generalmente se cancela, es decir, agregar un campo en cualquiera de las partes a asociar la clave primaria de la otra parte)

2. Consulta de varias tablas: producto cartesiano

Consulta combinada (producto cartesiano, se mostrarán todos los resultados combinados):
  select * from employee, dept;

Producto cartesiano: todas las combinaciones de dos conjuntos A y B (en consultas de varias tablas, los productos cartesianos no válidos deben eliminarse)

Eliminar productos cartesianos no válidos:
  select * from employee, dept where employee.dept_id = dept.id;

3. Unión interna de consultas de varias tablas

La combinación interna consulta la intersección de las dos tablas.

Unión interna implícita:
  SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;

Unión interna explícita:
  SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;

ejemplo:

  1. -- 查询员工姓名,及关联的部门的名称
  2. -- 隐式
  3. select e.name, d.name from employee as e, dept as d where e.dept = d.id;
  4. -- 显式
  5. select e.name, d.name from employee as e inner join dept as d on e.dept = d.id;

4. Unión externa de consulta de varias tablas (unión externa izquierda, unión externa derecha)

Unión externa izquierda:
     consulta todos los datos de la tabla de la izquierda y los datos de intersección de las dos tablas,
  SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;
     lo que equivale a consultar todos los datos de la tabla 1, incluidos los datos de intersección de la tabla 1 y la tabla 2.

Unión externa derecha:
     consulta todos los datos en la tabla derecha y algunos datos en la intersección de las dos tablas
  SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;

ejemplo:

  1. -- 左
  2. select e.*, d.name from employee as e left join dept as d on e.dept = d.id;
  3. select d.name, e.* from dept d left join emp e on e.dept = d.id; -- 这条语句与下面的语句效果一样
  4. -- 右
  5. select d.name, e.* from employee as e right join dept as d on e.dept = d.id;

5. Autounión de consultas de varias tablas

Consulta la conexión entre la tabla actual y ella misma. Se deben utilizar alias de tabla para las autouniones.

gramática:
  SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;

     Consulta de autounión, que puede ser una consulta de unión interna o una consulta de unión externa.

ejemplo:

  1. -- 查询员工及其所属领导的名字
  2. select a.name, b.name from employee a, employee b where a.manager = b.id;
  3. -- 没有领导的也查询出来
  4. select a.name, b.name from employee a left join employee b on a.manager = b.id;

6. Consulta conjunta de varias tablas

Combine los resultados de varias consultas para formar un nuevo conjunto de consultas

gramática:

    SELECT 字段列表 FROM 表A ...

    UNION [ALL]

    SELECT 字段列表 FROM 表B ...

Precauciones

  • UNION ALL tendrá resultados duplicados, UNION no
  • La consulta de unión es más eficiente que usar o y no invalidará el índice.
  • Para consultas conjuntas, el número de columnas en varias tablas debe ser coherente y los tipos de campos también deben ser coherentes.

A continuación se muestra un ejemplo que muestra cómo utilizar una consulta de unión para obtener datos de dos tablas:

SELECT column1, column2 FROM table1 UNION SELECT column3, column4 FROM table2;

En el ejemplo anterior, SELECT column1, column2 FROM table1y SELECT column3, column4 FROM table2son dos declaraciones independientes SELECTque obtienen datos de columnas específicas de table1las tablas y respectivamente. table2Al fusionarlos mediante UNIONoperadores, puede obtener un conjunto de resultados que contenga datos de ambas tablas. (En términos generales, la tabla 1 y la tabla 2 de la consulta conjunta son la misma tabla. Por ejemplo, si consulta la tabla de empleados para empleados con un salario superior a 5000 o empleados con una edad superior a 40, puede utilizar una consulta conjunta)

Cabe señalar que UNIONcuando se utiliza una consulta conjunta, el SELECTnúmero de columnas, los nombres de las columnas y los tipos de datos de las dos declaraciones deben coincidir. Si necesita conservar filas duplicadas, utilice UNION ALLen su lugar UNION.

7. Subconsulta de varias tablas (consulta anidada)

Anidar una instrucción SELECT en una instrucción SQL se denomina consulta anidada, también conocida como subconsulta.
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
La declaración fuera de la subconsulta puede ser cualquiera de INSERTAR / ACTUALIZAR / ELIMINAR / SELECCIONAR

Según los resultados de la subconsulta, se pueden dividir en:

  • Subconsulta escalar (el resultado de la subconsulta es un valor único)
  • Subconsulta de columna (el resultado de la subconsulta es una columna)
  • Subconsulta de fila (el resultado de la subconsulta es una fila)
  • Subconsulta de tabla (los resultados de la subconsulta son varias filas y columnas)

Según la posición de la subconsulta, se puede dividir en:

  • Después de DONDE
  • DESDE después
  • Después de SELECCIONAR

7.1 Subconsultas escalares

 El resultado devuelto por una subconsulta es un valor único (número, cadena, fecha, etc.).
Operadores de uso común: - < > > >= < <=

ejemplo:

  1. -- 查询销售部所有员工
  2. select id from dept where name = '销售部';
  3. -- 根据销售部部门ID,查询员工信息
  4. select * from employee where dept = 4;
  5. -- 合并(子查询)
  6. select * from employee where dept = (select id from dept where name = '销售部');
  7. -- 查询xxx入职之后的员工信息
  8. select * from employee where entrydate > (select entrydate from employee where name = 'xxx');

7.2 Subconsulta de lista

 El resultado devuelto es una columna (pueden ser varias filas).

Operadores de uso común:

Operador describir
EN Dentro del rango de colección especificado, seleccione uno de más de uno
NO EN No dentro del rango de colección especificado
CUALQUIER En la lista devuelta por la subconsulta, cualquiera de ellos puede satisfacerse.
ALGUNO Igual que ANY, ANY se puede usar dondequiera que se use SOME.
TODO Todos los valores de la lista devuelta por la subconsulta deben satisfacer

ejemplo: 

  1. -- 查询销售部和市场部的所有员工信息
  2. select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');
  3. -- 查询比财务部所有人工资都高的员工信息
  4. select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
  5. -- 查询比研发部任意一人工资高的员工信息
  6. select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));

7.3 Subconsulta de fila

El resultado devuelto es una fila (pueden tener varias columnas).
Operadores comunes: =, <, >, EN, NO EN

ejemplo:

  1. -- 查询与xxx的薪资及直属领导相同的员工信息
  2. select * from employee where (salary, manager) = (12500, 1);
  3. select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');

7.4 Subconsulta de tabla

El resultado devuelto son varias filas y varias columnas.
Operadores comunes: IN

ejemplo:

  1. -- 查询与xxx1,xxx2的职位和薪资相同的员工
  2. select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2');
  3. -- 查询入职日期是2006-01-01之后的员工,及其部门信息
  4. select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;

Supongo que te gusta

Origin blog.csdn.net/weixin_55772633/article/details/132121779
Recomendado
Clasificación