¿Cómo implementa MySQL la consulta de varias tablas?

  • ¡Crear juntos y crecer juntos! Este es el cuarto día de mi participación en el "Nuggets Daily New Project·August Update Challenge".

Prefacio:

Significado: consulta de varias tablas, también llamada consulta asociativa, se refiere a dos o más tablas para completar la operación de consulta juntas.

Precondición: Estas tablas consultadas en conjunto están relacionadas (uno a uno, uno a muchos), y debe haber campos asociados entre ellos.Este campo asociado puede o no tener una clave externa establecida. Por ejemplo: tabla de empleados y tabla de departamentos, estas dos tablas están relacionadas por "número de departamento".

Clasificación de consultas multitabla:

Clasificación 1: Conexión equivalente vs conexión no equivalente

Conexión equivalente:

SELECT t1.employee_id, t1.last_name, 
       t2.department_id, t2.location_id
FROM   employees t1, departments t2
WHERE  t1.department_id = t2.department_id;
复制代码

Detalles de unión equitativa:

  • Se utilizan múltiples condiciones de combinación con el operador AND
  • Cuando varias tablas tienen la misma columna, el nombre de la columna debe tener el prefijo del nombre de la tabla
  • El uso de alias simplifica las consultas.
  • El uso del prefijo del nombre de la tabla antes del nombre de la columna puede mejorar la eficiencia de las consultas.
  • Cabe señalar que 如果我们使用了表的别名,在查询字段中、过滤条件中就只能使用别名进行代替no se puede utilizar el nombre de la tabla original, de lo contrario se informará de un error.

Especificación de desarrollo de Ali:

[ 强制] Para la consulta y modificación de registros de tablas en la base de datos, siempre que se trate de varias tablas, se debe agregar el alias (o nombre de la tabla) antes del nombre de la columna para calificar.

Si se conectan n tablas, se requieren al menos n-1 condiciones de conexión. Por ejemplo, para unir tres tablas, se requieren al menos dos condiciones de unión.

unión de no equivalencia

SELECT e.last_name, e.salary, j.grade_level
FROM   employees e, job_grades j
WHERE  e.salary BETWEEN j.lowest_sal AND j.highest_sal;
复制代码

Clasificación 2: autounión frente a no autounión

La mayoría de las consultas son uniones no propias

Consulta de autounión:

#查询出last_name为 ‘Chen’ 的员工的 manager 的信息。
#因为manager本身也是员工,所以要用自连接查询
SELECT t2.* 
FROM employees t1
INNER JOIN employees t2
ON t1.manager_id = t2.employee_id
WHERE t1.last_name = 'Chen';
复制代码

Información parcial de los resultados de la consulta:

-------+----------+----------------+------------+---------------+
| employee_id | first_name | last_name | email    | phone_number |  
+-------------+------------+-----------+----------+--------------+
|         108 | Nancy      | Greenberg | NGREENBE | 515.124.4569 | 
+-------------+------------+-----------+----------+--------------+
复制代码

Categoría 3: unión interna frente a unión externa

  • Inner join: Fusionar las filas de dos o más tablas con la misma columna, **结果集中不包含一个表与另一个表不匹配的行**esto requiere especial atención.

  • Unión externa: durante el proceso de unión de dos tablas, además de devolver filas que cumplen las condiciones de unión, también devuelven filas que no cumplen las condiciones de la tabla izquierda (o derecha) .Esta conexión se denomina izquierda (o derecha). ) unión externa . Cuando no hay filas coincidentes, la columna correspondiente en la tabla de resultados está vacía (NULL).

  • Si se trata de una combinación externa izquierda, la tabla de la izquierda en la condición de combinación también se denomina 主表, y la tabla de la derecha se denomina 从表.

  • 如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表

因为MySQL不支持SQL92的部分语法,所有只要学会SQL99语法就OK了,就用SQL99语法来实现多表查询

  • 内连接(INNER JOIN)的实现

语法

#INNER 可以不写
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;
复制代码

举例:

#这个是三表内连接查询
SELECT employee_id, city, department_name
FROM   employees e 
JOIN   departments d
ON     d.department_id = e.department_id 
JOIN   locations l
ON     d.location_id = l.location_id;
复制代码
  • 外连接(OUTER JOIN)的实现:

左外连接(LEFT OUTER JOIN)

语法:

#实现查询结果是A,即 A是主表
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句;
复制代码

举例:

#OUTER 可以不写
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
LEFT OUTER JOIN departments d
ON   (e.department_id = d.department_id) ;
复制代码

查询结果: 在这里插入图片描述

需要注意的是:因为有的员工没有部门,所以当使用左外连接时,会查到107条记录;若使用的是内连接查询,就会有少一条记录,从这里就应该明白内连接与外连接的根本区别。

右外连接(RIGHT OUTER JOIN)

语法:

#实现查询结果是B
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;
复制代码

举例:

#此时departments是主表
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
RIGHT OUTER JOIN departments d
ON e.department_id = d.department_id;

#也可以写成
SELECT e.last_name, e.department_id, d.department_name
FROM departments d
LEFT JOIN employees e
ON e.department_id = d.department_id ;
复制代码

满外连接(FULL OUTER JOIN)

  • 满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。
  • SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。
  • 需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替。

具体可以看这篇文章:UNION、UNION ALL以及7种SQL JOINS的实现

课后练习题加强:

# 查询哪些部门没有员工 
SELECT t2.department_name
FROM employees t1
RIGHT JOIN departments t2
ON t1.`department_id` = t2.`department_id`
WHERE t1.`employee_id` IS NULL;

SELECT t2.department_name
FROM departments t2
LEFT JOIN employees t1
ON t1.`department_id` = t2.`department_id`
WHERE t1.`employee_id` IS NULL;
复制代码
#查询哪个城市没有部门 
SELECT t1.city
FROM locations t1
LEFT JOIN departments t2
ON t1.`location_id` = t2.`location_id`
WHERE t2.`department_id` IS NULL;
复制代码

爱在结尾:主要学习了:1、多表查询的三个分类;2、要区分内连接、外连接的不同之处;3、等值连接使用时的细节。

Supongo que te gusta

Origin juejin.im/post/7128337573990105096
Recomendado
Clasificación