P26 笛卡尔积的错误与正确的多表查询

第06章_多表查询

#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;

1. 出现笛卡尔积的错误

#2. 出现笛卡尔积的错误
#错误的原因:缺少了多表的连接条件
#错误的实现方式:每个员工都与每个部门匹配了一遍
SELECT employee_id,department_name
FROM employees,departments;  #查询出2889条记录

#错误的方式
SELECT employee_id,department_name
FROM employees CROSS JOIN departments;#查询出2889条记录

SELECT *
FROM employees; #107条记录

SELECT 2889/107
FROM DUAL;

SELECT *
FROM departments; #27条记录

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

#3.多表查询的正确方式:需要有连接条件
SELECT employee_id,department_name
FROM employees,departments
#两个表的连接条件
WHERE employees.`department_id`=departments.`department_id`;

#4.如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表
SELECT 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`=dept.`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`;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值