【数据库】联合查询
2026/8/10 12:01:58 网站建设 项目流程

第六章 联合查询


文章目录

  • 第六章 联合查询
  • 前言
  • 一、联合查询
  • 二、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 语句 ;


总结

好多好多东西 , 一起加油吧 !

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询