本文共 1554 字,大约阅读时间需要 5 分钟。
0、SQL语句的执行顺序
select语句的写法顺序为:select -- from -- where -- group by -- having -- order by
执行顺序为:from -- where -- group by -- having -- select -- order by
即,先from的一个表或多个表中创建工作表,再用where在创建的工作表的基础上保留满足条件的行,接着group by将这些行分成多个组,然后having对每个组进行条件过滤,只保留符合条件的组,最后order by对结果进行排序。
1、从学生表中,检索所有比“王华”年龄大的学生姓名、年龄和性别
#首先求出王华的年龄,然后把所有年龄与王华的年龄比较select sname, age, sex from studentwhere age > (select age from student where sname = '王华');
2、统计学生表中,不同班级各自的男生、女生的人数
select class, sum(case when sex='男' then 1 else 0 end) as 男, sum(case when sex='女' then 1 else 0 end) as 女 from student group by class;select t1.class, t1.男, t2.女 from (select class, count(*) 男 from student where sex='男' group by class) t1 inner join(select class, count(*) 女 from student where sex='女' group by class) t2;
关于case的用法可以参考:
类似的,给定一个积分表result,有A、B、C、D四列,要求:1)当A列值大于等于B列时,选择A列否则选择B列;2)当C列值大于等于D列时,选择C列否则选择D列。其SQL语句如下:
select (case when A>=B then A else B end) max_ab, (case when C>=D then C else D end) max_cd from result;
3、从成绩表中,检索所有科目成绩都大于80分的学生的学号
#先找到存在一科成绩小于80的学生的学号集合,然后找到不在这个集合中的学号select distinct(sno) from gradewhere sno not in (select distinct(sno) from grade where score < 80);#第二种做法:先将所有成绩按学号分组,然后找到组里的最小成绩大于等于80的那些组select sno from gradegroup by sno having min(score) >= 80;#第三种做法:前两种的结合select name from grade group by sno having sno not in (select name from stu where score < 80);
4、从成绩表中,检索选修了3门以上课程的学生的学号
#先按学号分组,然后找到科目数量大于3的组select sno from grade group by sno having count(*) > 3;
小结:聚合函数count、max、min、avg等通常用在select后面展示统计分组信息、或者用在having后面作为过滤分组的条件(普通的SQL视为一个分组)。聚合函数不能用在where后面。
参考:
转载地址:http://wbnii.baihongyu.com/