一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
前言
上篇我们学习总结了为什么需要做多表查询。有兴趣的小伙伴可以阅读(# MySQL学习-多表查询(一))。
下面继续学习MySQL中的多表查询。
多表查询实现
查询员工姓名和部门名称。
SECLECT name, department_name
FROM employees, departments
运行后,是可以查出结果的。但是查出的结果数量非常大,和实际的数据条数并不相符。通过分别查询两张表的数量条数,可以看出使用上面语句查询出的结果数量 = employees表结果数量 * departments表结果数量。这是因为查询的时候每个员工和每个部门都匹配过一遍,这种错误方式称为:笛卡尔积的错误。
笛卡尔积
笛卡尔乘积是一个数学运算,假设有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。或者也称为交叉连接。它的作用就是可以把任意表进行连接,即使这两张表不相关。
错误原因
- 缺少了多表的连接条件
增加连接条件
SECLECT name, department_name
FROM employees, departments
WHERE employees.'department_id' = departments.department_id
通过增加WHERE条件,就可以查出正确的结果。
示例一
SECLECT name, department_name, department_id
FROM employees, departments
WHERE employees.'department_id' = departments.department_id
运行以上语句,发现报错,这里我们只增加了department_id这个字段,报错的原因是两张表中都有department_id这个字段,我们没有指明要展示的是哪张表的department_id,下面我们指明表名,再运行一下。
SECLECT name, department_name, employees.department_id
FROM employees, departments
WHERE employees.'department_id' = departments.department_id
运行,发现没有报错,可以查出正确的结果。
总结:
如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表。
建议:
从sql优化的角度,建议多表查询时,每个字段前都指明其所在的表。
根据建议,我们把查询的字段前都加上表名。
SECLECT employees.name, departments.department_name, employees.department_id
FROM employees, departments
WHERE employees.'department_id' = departments.department_id
我们会发现语句非常长,且不容易看。这里可以给表起别名,方便查看。
SECLECT emp.name, dept.department_name, emp.department_id
FROM employees emp, departments dept
WHERE emp.'department_id' = dept.department_id
建议:
可以给表起别名,在SELECT和WHERE中使用表的别名。
有时候起别名后,我们会没有注意,运行下面的示例:
SECLECT employees.name, dept.department_name, emp.department_id
FROM employees emp, departments dept
WHERE employees.'department_id' = dept.department_id
运行会发现报错,可以看到有时我们使用了别名,但是有时又没有使用别名,所以报错了。这里需要注意。
注意:
如果给表起了别名,一旦在SELECT和WHERE中使用别名的话,则必须使用表的别名,而不能使用表的原名。
练习一
查询员工的id,姓名,部门名称,城市
SECLECT e.employee_id, e.name, d.department_name, l.city
FROM employees e, departments d, locations l
WHERE e.'department_id' = d.'department_id'
AND d.'location_id' = l.'location_id'
这样就可以查出正确的结果。
结论:
如果有n个表实现多表的查询,则需要至少n-1个连接条件。
今天先学习到这里,明天继续。