SQL的多表联查
在奋斗,90在追求。勇往无前,斗志昂扬,激情澎湃。我们在坚定的毅志中一天天的长大,一天天的成熟。岁月蹉跎,只为追求此生无悔!
表关联 association
概念
表table代表了生活中一个主体,如部门表dept,员工表emp。表关联则代表了表之间的关系,如:部门和员工,商品和商品分类,老师和学生,教室和学生。
同时,也要知道,表并不都有关系,它们形成自己的小圈子。如商品和商品详情一圈,部门和员工一圈,出圈就可能没关系了,如商品和员工无关,商品和学生无关。
下面我们讨论表的关系分为四种:
- 一对一 one to one QQ和QQ邮箱,员工和员工编号
- 一对多 one to many 最常见,部门和员工,用户和订单
- 多对一 many to one 一对多反过来,员工和部门,订单和用户
- 多对多 many to many 老师和学生,老师和课程
多表联查
多表查询是指基于两个和两个以上的表的查询。在实际应用中,查询单个表可能不能满足你的需求,如显示员工表emp中不只显示deptno,还要显示部门名称,而部门名称dname在dept表中。
笛卡尔积 Cartesian product
笛卡尔积(Cartesian product),又称直积。一般笛卡尔积没有实际的业务意义,但多表查询都是先生成笛卡尔积,再进行数据的筛选过滤。
注意:实际开发中尽量少用多表联查,其根本原因就在这里,查询过程中,现在内存中构建一个大大的结果集,然后再进行数据的过滤。那这个构建过程,和所使用的内存资源,包括过滤时的判断,都是既耗费资源,又浪费时间。
SELECT * FROM students,scores #查询这两张表
WHERE students.id = scores.sid #两张表的关联关系
AND students.name = "柒" #查询条件
连接查询join
- 内连接 inner join
- 左(外)连接 left join
- 右(外)连接 right join
SELECT * FROM students
#inner join scores #两边都满足的交集
LEFT JOIN scores #左边的所有和右边满足了的
#right JOIN scores #右边的所有和左边满足了的
ON students.id = scores.sid #描述关联关系
WHERE students.name = "柒" #具体过滤条件
子查询 subquery
子查询是指嵌入在其他select语句中的select语句,也叫嵌套查询。子查询执行效率低慎用。记录少时效率影响不大、图方便直接使用,记录多时最好使用其它方式替代。
单行子查询
- 返回结果为一条
#查询学生名字为柒的成绩 名字为柒的只有一个返回的id只有一个值
select * from scores where id = (select id from students where name="柒");
多行子查询
- 返回结果为多条(使用in或者any)
#查询7086班级的所有学生信息
select * from students where id in (select id from classes where class=7086);
select * from students where id = any(select id from classes where class=7086);
常见报错:https://www.cnblogs.com/fangweicheng666/p/15133256.html