首页 > 代码库 > select语句执行的顺序,子查询和联合查询【这三点都是重点】

select语句执行的顺序,子查询和联合查询【这三点都是重点】

select (字段或表达式) (from 资源) where 1(用来先处理筛选后加条件) (AND条件附加)(group by)(order by)(limit);

1.group by分组【分组的作用在于分组统计上使用分组,每组正常只显示一条信息】【基本都是用在分组统计方面,配合聚合函数进行处理】 【这个重点】 group_concat(函数):会将组内的元素进行拼接显示【这个能够显示分组后的组内的显示效果】 多字段分组【group by+多个字段并列即可】 【分组字段的使用主要还是在统计上】

2.where和having的区别【在表示条件上】 主要区别在于字段起别名之后,筛选条件是否能够匹配 将where 1 AND 条件的话相当于是select结束后进行匹配【与having一致】 where相当于是对原数据源进行筛选【这也是正常情况下使用where 1 AND后添加条件的用法(这种用法相当于having)】 having相当于对数据的二次筛选【也就是条件已经筛选出来,然后根据having条件进行进一步筛选】

3.order by对筛选结果进行排序【所以在最末】

4.limit子句【从所有的结果中选择一部分结果显示】

5.select执行顺序: from where group by 字段表达式【聚合函数】 having order by limit

6.子查询【通过select的语句的优先级顺序,将select语句作为一个值嵌入进别的select语句中,实现子查询】 例: select * from select_student where height=select max(height) from select_student; 以上便实现一次子查询【而且很多的分组都是需要子查询处理】

子查询分类: 子查询的位置 (1)where型子查询 (2)from型子查询 子查询的返回数据的格式分类 (1)标量子查询【返回值是一个值】 (2)列子查询【返回一列】 (3)行子查询【返回一行】 (4)表子查询【返回一个表(也就是多表查询)】

子查询语法【重点】 注意各种查询语句需要分类 from型:【所谓的列子查询、行子查询、表子查询常常是from查询,但是列子查询又是也会做where查询(标量子查询可以看做是一个特殊的列子查询)】 from使用多个表进行处理时起别名也是惯例。 例: select * from (select * from select_student order by height desc) as bat group by class_id; 【这样便能将order by与group by 进行顺序交换处理】

只要注意到子查询的位置,那么子查询的情形便都能执行【但是需要注意执行的顺序】 执行过程: (1)执行子查询,其结果不被显示,而是传递给外部查询,作为外部查询的条件使用。 (2)执行外部查询,并显示整个结果。  【正是因为有了这个情况,使得sql语句的嵌套本身具有了复杂的组合特性。但是mysql在子查询方面有优化问题】 【http://blog.csdn.net/yanhui_wei/article/details/22872633】 【子查询优化问题:http://hidba.org/?p=260】

exists型子查询【判断依据不是根据子查询所返回的数据,只是根据子查询是否有返回值来显示】 【用于判断子查询是否可行,或者查符合某种情况的查询结果】【判断存在即可】

7.连接查询【join】 两个表需要联合起来进行查询 例: select stu_name,gender,class_id from select_studengt join select_class on select_student.class_id=select_class.id; 这样实现连接【相当于两个表先根据join和on进行连接之后进行查询:因为from的语法要先执行】

这就是连接查询【join、on】

连接查询又分为:【http://www.360doc.com/content/11/0503/11/2631212_114003885.shtml】 【http://www.jb51.net/article/39432.htm】 内连接:记录与真实的记录连接【两条真实存在的记录的连接】【mysql默认是inner连接】【内连接本身是将两个表进行笛卡尔积的运算,所以条件能够省略】 外连接:连接的记录,可能有一方不存在【就算不存在的记录也能保证连接的正常执行,但是要区分左右。那个表的记录要全部显示就使用哪个。这一点注意,想要显示的主体是外连接需要注意的问题】 【内外连接的区别就在于这里,就是万一出现不匹配的记录,看是否能够连接(实质上加外键的两个表经常用连接,而记录是可以保证的)】 交叉连接【cross join】【内连接的一种特殊情况,结果与内连接一致,就是进行笛卡尔积运算】 自然连接【mysql自动判断连接条件,根据表中的同名字段进行连接,这是机制】

【mysql中的unsigned类型表示无符号,也就是整型中不是负数】

8.连接条件 join中的on【只有内连接的时候能够省略】和where的用法 外连接中使用on做条件即可

使用using做字段连接的条件

在连接中,连接条件指的是on和using,where指的是对连接之后的筛选

9.连接查询和子查询的总结: 子查询针对的是子查询的位置【from和where】,而连接查询本身就只有对表的连接【from子句】 子查询将一个的查询结果传到外层查询,而连接查询的好处是将某个并行的两次查询通过将表的连接形成一次的查询【这是两者最大的应用场景】 需要对mysql的命令执行顺序有了解

需要对两者的使用场景注意【但是优化的角度又需要对mysql机制了解和体验】

 

 

10.union查询 union将两条查询直接相连

union会在联合时,需要列数目一致,会在联合时,主动去掉相同的记录 【需要注意二者排序出现冲突时的解决】 【只能在union的最后一个子查询中使用order by,而这个order by是针对整个unioning后的结果集的】 【注意,union只能在最后加order by,不能将两个排序进行处理。union子句不能加排序】 例: select supplier_id as id, supplier_name as name   from suppliers    UNION   select company_id as id, company_name as name   from companies    ORDER BY name; 【http://blog.sina.com.cn/s/blog_6cb0deff0100t4l8.html】

union distinct【默认就是,会将相同的记录去掉(唯一)】

 

select语句执行的顺序,子查询和联合查询【这三点都是重点】