mysql

一、联合查询

在两种情况下可能用到: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语句有没有查询到数据

 

 

posted @ 2016-12-09 23:22  醉人  阅读(230)  评论(0编辑  收藏  举报