目录
一、多表查询
在查询的时候,我们可能需要查询多张表的数据,比如为了整理一张完整的学生信息表,我们可能需要同时查询学生表、班级表。
1、笛卡尔积
多表查询的结果不是像下面这样直接拼凑起来的
而是会发生笛卡尔积,表1的每一条记录都合表2形成一个记录块,最后将这些记录块拼凑在一起,就是多表查询的结果。由于笛卡尔积会产生相当大的数据量,多表查询时,需要搭配where子句来筛掉无效记录。
2、多表查询的过程
现在我们已经知道查询两个表时会发生笛卡尔积,那我们就先获取到笛卡尔积以后的结果。
我们实际需要的是学生和对应的成绩信息,学生表的result_id 对应 成绩表的 id,此时的筛选条件就是 result_id = id,其实就是以该条件在上述笛卡尔积结果的基础上筛选。
二、子查询(嵌套查询)
子查询指的是嵌入在其他sql语句中的select语句,也叫嵌套查询,根据select查询得到的记录数量,以及查询的字段个数,我们可以分为 单行 / 多行子查询、多列子查询。
1、单行单列子查询
顾名思义,单行子查询表示select查询到的记录数只有一行,单列表示仅查询一个字段。
在查询结果为单行单列的情况下,我们可以直接把这个查询结果作为其他select语句的筛选条件使用,注意字段类型需保持一致。
2、多行单列子查询
多行单列子查询,其实可以看做是一个字段的集合,下面例子中的查询结果就可以看做是name字段的一个集合 ['唐三藏' , '孙悟空' , '猪悟能']
同样可以作为筛选条件使用,不过此时需要搭配 in 来使用
3、多行多列子查询
此时的查询结果完全可以看做是一个临时表
我们可以给查询结果起别名,来当做一个表来使用
三、合并查询
合并查询其实就是将两个select的执行结果合并为一个,虽说是合并,但也分为取交集还是取并集
1、union(取交集合并)
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
2、union all(取并集合并)
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行