MySQL-- 多表查询,笛卡尔积错误

目录

多表查询

1,用分段式查找多表

2.尝试直接查找多表,发现笛卡尔积错误

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

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

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

6. 结论:如果有n个表实现多表的查询,则需要至少n-1个连接条件

方法


多表查询

1,用分段式查找多表

熟悉常见的几个表

DESC employees;

DESC departments;

DESC locations;
#查询员工名为'Abel'的人在哪个城市工作?
SELECT * 
FROM employees
WHERE last_name = 'Abel';

SELECT *
FROM departments
WHERE department_id = 80;


SELECT *
FROM locations 
WHERE location_id = 2500;

不够高效

2.尝试直接查找多表,发现笛卡尔积错误

错误的原因:缺少了多表的连接条件

错误的实现方式:每个员工都与每个部门匹配了一遍。
 

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

寻找原因

SELECT *
FROM employees;  #107条记录

SELECT 2889 / 107
FROM DUAL;

SELECT *
FROM departments; # 27条记录

我们发现,107*27=2889.相当于employees表上的所有人都与departments表中的部门匹配了一遍,缺少“筛选条件”,也就是连接条件。

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

SELECT employee_id,department_name
FROM employees,departments
#两个表的连接条件
WHERE employees.`department_id` = departments.department_id;

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

SELECT employees.employee_id,departments.department_name,employees.department_id
FROM employees,departments
WHERE employees.`department_id` = departments.department_id;

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

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

SELECT emp.employee_id,dept.department_name,emp.department_id
FROM employees emp,departments dept
WHERE emp.`department_id` = dept.department_id;

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

比如下的操作是错误的:
 

SELECT emp.employee_id,departments.department_name,emp.department_id
FROM employees emp,departments dept
WHERE emp.`department_id` = departments.department_id;


6. 结论:如果有n个表实现多表的查询,则需要至少n-1个连接条件


 

#练习:查询员工的employee_id,last_name,department_name,city
SELECT e.employee_id,e.last_name,d.department_name,l.city,e.department_id,l.location_id
FROM employees e,departments d,locations l
WHERE e.`department_id` = d.`department_id`
AND d.`location_id` = l.`location_id`;

方法

演绎式:提出问题1 ---> 解决问题1 ----> 提出问题2 ---> 解决问题2 ....

归纳式:总--分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值