SQL的多表联查

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

posted @ 2021-08-20 20:28  贪玩的阿柒  阅读(573)  评论(0编辑  收藏  举报