一、联合查询
在两种情况下可能用到:1、想要的结果在一条语句中会引起逻辑冲突,只能放在两条语句中是要使用联合查询
2、一张表的数据量非常大时,会分隔成多张表存储,要查询时也要用到联合查询
使用时要注意:1, 联合查询中如果要使用order by,那么就必须对这个select语句加上一对括号!
2, 联合查询中的order by必须搭配上limit关键字才能生效!因为系统默认的联合查询的结果往往比较多,所以要加以限制,当然,如果想显示全部的数据,可以在limit子句后面加上一个很大的数,比如:999999
关键字:union
语法形式
select语句1
union[union选项]
select 语句2
union[union选项]
select 语句3
union[union选项]
……
union 选项 all:也是缺省值,保留所有的查询结果!
distinct:去重(默认值),去掉重复的查询结果!
二、交叉连接
关键字:cross join
语法:select * | 字段列表 from 表1 cross join 表2
含义:就是从一张表的一条记录去连接另一张表中的所有记录,并且保存所有的记录,其中包括两个表的所有的字段!从结果上看,就是对两张表做笛卡尔积!
三、内连接
语法:select *|字段列表 from 左表 inner join 右表 on 左表.字段 = 右表.字段; 其中inner可以省略
内连接的本质还是在做交叉连接,只不过是在交叉连接的基础之上加上一定的连接条件!符合连接条件的才会被显示,不符合的就不显示!(这样有可能丢失数据)!
所以,如果内连接的时候没有连接条件,此时内连接就相当于是交叉连接!
四、外连接
外连接分为左外连接left outer join(左表为主表)和右外连接right outer join(右表为主表);
是拿主表的每一条记录按照on后面的条件去匹配从表,如果匹配成功,那么就保留两张表的所有的记录,如果匹配失败(也就是主表的一条记录无法匹配从表的所有的记录),此时,只保留主表的记录,从表的记录全部用null代替,这样主表数据不会丢失
五、自然连接
自然连接分为自然内连接natural inner join ,自然左/右连接natural left/right join
自然连接的本质跟前面的内连接和外连接没有太大区别,只是这里的连接条件不是由用户来指定,而是由系统来指定罢了
只要两张表中具有相同的字段名,系统就认为是一个连接条件,就会主动的去匹配这两个相同的字段名的值是否相同,如果两个表的相同的字段名的值相同,就认为匹配成功;如果两张表中有多个字段名相同,则所有相同的字段名的值都要相同才算是匹配成功
六、子查询
1、标量子查询
往往就是把标量子查询的结果当成一个值来使用,比如用来判断,参与运算等
例:
2、列子查询
也就是返回单列的子查询,也叫作列子查询!
列子查询的结果往往就是一系列相同属性的数据的集合,所以,我们一般就是把列子查询的结果当成一个集合来看待,也通常就是配合in和not in集合运算符来使用!
3、行子查询
查询结果为一行的子查询就叫作行子查询!
行子查询使用的不是很多,必须在查询的过程中构造一个行元素才能与子查询的结果进行比较!
所谓的构造行元素,就是一个由多个字段组成的元素,形式上就是将多个字段用一个括号括起来!
4、表子查询
返回结果是多行多列的子查询就叫作表子查询!
表子查询一般都是from型,也就是出现在from之后,一般当成一个数据源来使用!
例:不使用统计函数,而使用表子查询
1), 先对整个表根据score字段进行排序(升序)
2), 对排序后的结果再根据home字段进行group by,因为group by只取每一个分组的第一个记录!
如果想查所有家乡的所有的最低分(可能有重复情况):
select * from php_student natural join (select home,min(score) as score from php_student group by home) as m;
5、exists子查询
exists主要是用来做判断的,返回的结果是一个布尔值!
判断依据:如果子查询可以返回数据,那么exists的结果就是true,否则就是false!
exists的主要作用就是判断后面的select语句有没有查询到数据