MySQL小讲07.多表查询

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

表结构展示:

image.png

问题:查询一个员工名为“Abel”的人在哪个城市工作?

Step 1:先查询出他的全部信息

SELECT *
FROM employees
WHERE last_name = 'Abel';

image.png Step 2:得知他在80号部门时,查询80号部门的信息

SELECT *
FROM departments
WHERE department_id = 80;

image.png 可得员工名为“Abel”的人在location_id=2500的地方工作 Step 3:查询location_id=2500的城市信息

SELECT *
FROM locations
WHERE location_id = 2500;

image.png

如何实现多表查询

出现笛卡尔积(交叉连接)的错误

笛卡尔乘积是一个数学运算。
假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能 组合,也就是第一个
对象来自于 X,第二个对象来自于 Y 的所有可能

组合的个数即为两个集合中元素个数的乘积数

image.png

错误的实现方式:

每个员工都与每个部门匹配了一遍

SELECT employee_id,department_name
FROM employees,departments; # 查询出2889条记录

image.png

SELECT employee_id,department_name
FROM employees CROSS JOIN departments;

image.png

错误出现的原因

  • 省略多个表的连接条件(或关联条件)
  • 连接条件(或关联条件)无效
  • 所有表中的所有行互相连接

多表查询的正确方式——需要有连接条件

两个表的连接条件

为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。

SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id = departments.department_id; #106条 (不包含
NULL)

image.png

如果查询语句中出现了多个表都存在的字段,则必须指明此字段所在的表

# department_id在employees和departments表中都存在,未指明具体在哪个表中
SELECT employee_id,department_name,department_id
FROM employees,departments
WHERE employees.department_id = departments.department_id; #106条 (不包含
NULL)

image.png

# 指明department_id在employees表中
SELECT employee_id,department_name,employees.department_id
FROM employees,departments
WHERE employees.department_id = departments.department_id; #106条 (不包含
NULL)

image.png

从sql优化的角度,建议多表查询时,每个字段前都指明其所在的表:

# 建议多表查询时,每个字段前都指明其所在的表
SELECT employees.employee_id,departments.department_name,department_id
FROM employees,departments
WHERE employees.department_id = departments.department_id; #106条 (不包
含NULL)

可以给表起别名,在SELECT和WHERE中使用表的别名

SELECT emp.employee_id,dept.department_name,dept.department_id
FROM employees emp,departments dept
WHERE emp.department_id = dept.department_id; #106条 (不包含NULL)

如果给表起了别名,一旦在SELECT或WHERE中使用表的别名的话,则必须使用表的别名,而不能再使用表的原名

获取testdb.sql

链接:pan.baidu.com/s/1IPjM6E6Z… 提取码:1234