前一段时间的面试,问道这个问题,不太清楚了,感觉有必要来总结一下。话不多说,直接开始吧!
一、order by的用法
使用order by,一般是用来,依照查询结果的某一列(或多列)属性,进行排序(升序:ASC;降序:DESC;默认为升序)。
当排序列含空值时:
ASC:排序列为空值的元组最后显示。
DESC:排序列为空值的元组最先显示。
为了好记忆,我的理解是,可以把null值看做无穷大,因为不知道具体为多少。然后去考虑排序,asc升序null肯定在最后,而desc降序,null肯定在最前面。(我的想法,轻喷。。。)
1》单一列属性排序
举例1:默认排序:
select * from s
select * from s order by sno desc
按照sno降序:
2》多个列属性排序
选择多个列属性进行排序,然后排序的顺序是,从左到右,依次排序。
如果前面列属性有些是一样的话,再按后面的列属性排序。(前提一定要满足前面的属性排序,因为在前面的优先级高)。
举例2:
select * from s
order by sname desc, sage desc
首先按照sname降序排序,然后出现了xx一样的,在按照sage降序排序。(默认sage是升序)。
如果最开始使用sno排序,
select * from s
order by sno desc, sage asc
必须先满足前面列属性的排序(sno在前优先级高)。才会去考虑后续列属性的排序。
二、group by的用法group by按照查询结果集中的某一列(或多列),进行分组,值相等的为一组。
1》细化集函数(count,sum,avg,max,min)的作用对象:
未对查询结果分组,集函数将作用于整个查询结果。
对查询结果分组后,集函数将分别作用于每个组。
例子3:
求各个课程号及相应的选课人数:
SELECT cno,count(sno) from sc
对整个表进行count。
SELECT cno,count(sno) from sc group by cno
对分组的表进行count
sc表内容如下:
2》GROUP BY子句的作用对象是查询的中间结果表
分组方法:按指定的一列或多列值分组,值相等的为一组。
使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性(比如:sno)和集函数(比如:count())。
select sno,count(cno) from sc group by sno
select cno,grade,count(cno) from sc group by cno,grade
cno为1且成绩为66的,有3个
4》使用HAVING短语筛选最终输出结果
只有满足HAVING短语指定条件的组才输出。
HAVING短语与WHERE子句的区别:作用对象不同。
1》WHERE子句作用于基表或视图,从中选择满足条件的元组。
2》HAVING短语作用于组,从中选择满足条件的组。
举例:
查询选修了3门以上课程的学生学号:
select sno from sc group by sno having count(cno)>3
查询选修了3门以上课程,且所有课程成绩都高于60分的学生学号及课程数
select sno , count(cno)
from sc
where grade > 60
group by sno having count(cno) > 3
好的,先就总结到此吧,后续还会继续。由于水平有限,难免有不对的地方,还请指教。加油!!!