MySQL学习-多表查询(七)

152 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

前言

上篇我们又学习了一部分多表查询。有兴趣的小伙伴可以阅读(# MySQL学习-多表查询(六))。
下面继续学习MySQL中的多表查询。

SQL99新特性

自然连接

示例一

写自然连接的概念前,先看个示例。
查询员工表和部门表中所有相同的字段,进行等值比较(也就是=)的数据。

SELECT e.employee_id, e.name, d.department_name
FROM employees e JOIN departments d
ON e.'department_id' = d.'department_id'
AND e.'manager_id' = d.'manager_id'

上述示例,可以使用SQL99新的写法:

SELECT e.employee_id, e.name, d.department_name
FROM employees e NATURAL JOIN departments d

上面的写法就是自然连接,是使用‘NATURAL JOIN’来实现的。它会自动查询两张连接表中所有相同的字段,然后进行等值连接。

USING使用

示例二

SELECT e.employee_id, e.name, d.department_name
FROM employees e JOIN departments d
ON e.'department_id' = d.'department_id'

以上示例可以使用USING简化:

SELECT e.employee_id, e.name, d.department_name
FROM employees e JOIN departments d
USING (department_id)

当进行连接的时候,USING可以指定数据表里的同名字段进行等值连接,但是只能配合JOIN一起使用。

多表连接总结

表连接的约束条件可以有三种方式:WHERE,ON,USING

  • WHERE:适用于所有的关联查询。
  • ON:只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好。
  • USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等。

扩展

多表连接时,也可以使用以下写法:

SELECT e.employee_id, e.name, d.department_name, j.job_title
FROM employees e JOIN departments d JOIN jobs j
ON e.'department_id' = d.'department_id'
AND e.'job_id' = j.'job_id'

三张表连续使用JOIN,后面跟着一个ON。但是不太建议使用这种方式,还是JOIN ON后面接着JOIN ON的方式更好一点。

注意

在进行多表查询的时候,我们要控制连接表的数量。多表连接就相当于嵌套for循环一样,非常消耗资源,会让SQL查询性能下降的很严重,因此不要连接不必要的表。在许多DBMS中,也都会有最大连接表的限制。

到这里,我们就把多表查询全部学完了。
今天先学习到这里,明天继续。