第六章 联合查询
文章目录
- 第六章 联合查询
- 前言
- 一、联合查询
- 二、join on实现内链接
- 三、外连接
- 四、自连接
- 五、单行子查询
- 六、多行子查询
- 七、from表中进行子查询
- 八、合并查询
- 总结
前言
呱唧呱唧
一、联合查询
查询的时候通常把多个实体的信息放到一起进行查询 , 联合查询也称作“多表查询” , 比单个表查询更加复杂,更低效
select * from 表1 , 表2 ;
笛卡尔积是两张表之间进行的预算 , 其结果是一个更大的表列的个数
列数是两个表的列数之和,行数是两个表行数之积
笛卡尔积存在一些有效数据或无效数据
无效数据 : 学生表的 classid 与 班级表的 classid 对不上
可以给表起别名 , 同时用 where 语句筛选有效数据
如用where语句,不能直接写列=列 , 要用 表名 . 列名
二、join on实现内链接
join一样效果 , 也可算出笛卡尔积
select * form 表1 join 表2 ;
指定条件 , 同样可以其别名
select * from 表1 as 别名 join 表2 as 表名 on 条件 ;
可以用where对条件进行进一步补充
select * from 表1 as 别名 join 表2 as 表名 on 条件 where 条件;
join前面可以有个inner , 可以省略
用where无论几张表都是一样的 , join on是不一样的
多表查询是个低效操作,不要拿两个很大的表进行联合查询,即使是小的表,也不要一次性联合太多表,因为SQL执行的非常慢,容易系统卡顿
我们可以多次查询
三、外连接
以上都是内连接 , mysql还提供了外连接也能进行联合查询, 外链接得到的结果和内链接有些不同
左外链接 : 当左侧表拥有的数据在右侧表没有相匹配的时候 , 仍然会有显示
select * from 表名 left join 表名 on 条件 ;
右外连接 : 与左外连接相反
select * from 表名 right join 表名 on 条件 ;
有全外连接,mysql不支持,oracle支持
全外连接用于行和行之间的比较
四、自连接
提问:
select * from score , score ;
这句SQL是正确的吗?
错 ! 两个不能是同名,所以我们需要用别名
自连接代价非常明显 , 笛卡尔积开销非常大
针对这样的问题,如果表很大不方便进行自连接 , 先通过普通SQL查询出每个同学所有课程成绩转成JAVA对象,保存到一个list中,接下来再通过JAVA代码遍历list,挑选出这里面符合条件的有效数据
实际开发中数据库大多情况是通过代码来操控的
五、单行子查询
本质是把多个查询合成一个SQL , 这个引以为戒,实际开发中慎用,除非还是比较好理解
如果括号里的查询结果有多个 , 会报错 , 需要用到多行子查询
六、多行子查询
多行用in
七、from表中进行子查询
前面几个子查询,都是在条件中使用的~~
还可以在from中使用 , 把select查询的结果作为一个“临时表”
后续的其他查询,就可以基于这个临时表,做进一步的查询~
八、合并查询
两表合并并且去重 , 并且看这一操作列名的个数和类型不一样 , 和名字没有干系
select 语句 union select 语句 ;
不想去重
select 语句 union all select 语句 ;
总结
好多好多东西 , 一起加油吧 !