持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
表结构展示:
问题:查询一个员工名为“Abel”的人在哪个城市工作?
Step 1:先查询出他的全部信息
SELECT *
FROM employees
WHERE last_name = 'Abel';
Step 2:得知他在80号部门时,查询80号部门的信息
SELECT *
FROM departments
WHERE department_id = 80;
可得员工名为“Abel”的人在location_id=2500的地方工作
Step 3:查询location_id=2500的城市信息
SELECT *
FROM locations
WHERE location_id = 2500;
如何实现多表查询
出现笛卡尔积(交叉连接)的错误
笛卡尔乘积是一个数学运算。
假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能 组合,也就是第一个
对象来自于 X,第二个对象来自于 Y 的所有可能。
组合的个数即为两个集合中元素个数的乘积数
错误的实现方式:
每个员工都与每个部门匹配了一遍
SELECT employee_id,department_name
FROM employees,departments; # 查询出2889条记录
SELECT employee_id,department_name
FROM employees CROSS JOIN departments;
错误出现的原因
- 省略多个表的连接条件(或关联条件)
- 连接条件(或关联条件)无效
- 所有表中的所有行互相连接
多表查询的正确方式——需要有连接条件
两个表的连接条件
为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id = departments.department_id; #106条 (不包含
NULL)
如果查询语句中出现了多个表都存在的字段,则必须指明此字段所在的表
# department_id在employees和departments表中都存在,未指明具体在哪个表中
SELECT employee_id,department_name,department_id
FROM employees,departments
WHERE employees.department_id = departments.department_id; #106条 (不包含
NULL)
# 指明department_id在employees表中
SELECT employee_id,department_name,employees.department_id
FROM employees,departments
WHERE employees.department_id = departments.department_id; #106条 (不包含
NULL)
从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