SQL的多表联查

时间:2021-08-20 21:22:12   收藏:0   阅读:23

SQL的多表联查

表关联 association

概念

表table代表了生活中一个主体,如部门表dept,员工表emp。表关联则代表了表之间的关系,如:部门和员工,商品和商品分类,老师和学生,教室和学生。

同时,也要知道,表并不都有关系,它们形成自己的小圈子。如商品和商品详情一圈,部门和员工一圈,出圈就可能没关系了,如商品和员工无关,商品和学生无关。

下面我们讨论表的关系分为四种:

多表联查

多表查询是指基于两个和两个以上的表的查询。在实际应用中,查询单个表可能不能满足你的需求,如显示员工表emp中不只显示deptno,还要显示部门名称,而部门名称dname在dept表中。

笛卡尔积 Cartesian product

笛卡尔积(Cartesian product),又称直积。一般笛卡尔积没有实际的业务意义,但多表查询都是先生成笛卡尔积,再进行数据的筛选过滤。

注意:实际开发中尽量少用多表联查,其根本原因就在这里,查询过程中,现在内存中构建一个大大的结果集,然后再进行数据的过滤。那这个构建过程,和所使用的内存资源,包括过滤时的判断,都是既耗费资源,又浪费时间。

SELECT * FROM students,scores  #查询这两张表
WHERE students.id = scores.sid #两张表的关联关系
AND students.name = ‘柒‘ #查询条件

连接查询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=‘柒‘);

多行子查询

#查询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

原文:https://www.cnblogs.com/fangweicheng666/p/15168072.html

评论(0)
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!