【MySQL学习记录】第六章:多表查询(内连接、外连接、等值查询、非等值查询)

这篇博客介绍了MySQL中多表查询的基本概念和操作,包括内连接、外连接(左外、右外、满外)的实现方式,以及等值连接和非等值连接的区别。通过实例讲解了如何避免笛卡尔积错误,并讨论了自连接、自然连接和USING连接的用法。最后,提出了课后练习题,帮助读者巩固所学知识。
摘要由CSDN通过智能技术生成

1. 熟悉几张表

DESC employees;
DESC departments;
DESC locations;

employees
departments
locations
查询员工名为 "Abel"的工作城市

SELECT * 
FROM employees
WHERE last_name = 'Abel';

SELECT *
FROM departments
WHERE department_id = 80;

SELECT city
FROM locations
WHERE location_id = 2500;

2. 为什么使用多张表

  1. 解决存储时数据冗余的问题
  2. 加载数据到内存时,数据少、速度快
  3. 维护简单

3. 多表查询实现

笛卡尔积错误

查询employee_id,department_name

SELECT employee_id, department_name
FROM employees, departments;	# 共2889条记录

/*
出错原因:每个员工都与每个部门匹配了一遍,出现笛卡尔积错误

产生原因:
缺少连接条件
*/

在这里插入图片描述

笛卡尔积(交叉连接)

在这里插入图片描述

正确方式

查询employee_id,department_name

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

在这里插入图片描述

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

查询employee_id,department_name,department_id

SELECT employee_id, department_name, department_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;	# 报错

错误:department_id不明确

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

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

在这里插入图片描述

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

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

如果给表起了别名,就必须使用别名,不可以再用表的原名

练习:查询员工的employee_id, last_name, department_name, city

SELECT emp.employee_id, emp.last_name, dept.department_id, loc.city
FROM employees emp, departments dept, locations loc
WHERE emp.`department_id` = dept.`department_id` AND dept.`location_id` = `loc.location_id`;

在这里插入图片描述
若有n个表,则至少需要n-1个连接条件

4. 多表的分类

等值连接 VS 非等值连接

非等值连接举例:

查询员工last_name, salary, grade_level

SELECT last_name, salary, grade_level
FROM employee e, job_grades j
WHERE e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal`;

在这里插入图片描述

自连接 VS 非自连接

自连接

查询员工姓名,员工id,及其管理者的id和姓名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值