group by子句:
如果select选择列表的列,既有普通列,又有聚集函数的列,则一定要分组(即加group by子句)。
如何分组?
答:把select选择列表的普通列,全部作为group by子句的分组列。
注意:
where子句中不能用聚集函数作为条件表达式。聚集函数只能用于select子句和group by中的having子句。
/*查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列*/
select *
from Student
order by Sdept,Sage desc
--(聚集函数)
/*查询学生总人数*/
select COUNT(*) 学生总人数
from Student
/*查询选修了课程的学生人数*/
select COUNT(distinct sno)
from SC
/*计算选修1号课程的学生的平均成绩*/
select AVG(grade)
from SC
where Cno='1'
/*查询选修1号课程的学生最高分数*/
select MAX(grade)
from SC
where Cno='1'
/*查询学生201215121选修课程的总学分数
select SUM(Ccredit) */
from Course,SC
where course.Cno=sc.Cno and Sno='201215121' and Grade>=60
/*求各个课程号及相应的选课人数*/
select Cno,COUNT(*)
from SC
group by Cno
/*查询选修了三门及以上课程的学生学号*/
select Sno
from SC
group by Sno
having COUNT(*)>=3
/*求各个课程号,课程名及相应的选课人数*/
select SC.Cno,Cname,COUNT(*)
from Course,SC
where Course.Cno=SC.Cno
group by SC.Cno,Cname
/*查询平均成绩大于等于80分的学生学号和平均成绩*/
select Sno,AVG(grade)
from SC
group by Sno
having AVG(grade)>=80
--连接查询
/*查询每个学生及选课情况*/
select *
from Student,SC
where Student.Sno=SC.Sno
/*查询每个学生及选课情况(自然连接实现)*/
select Student.*,Cno,Grade
from Student,SC
where Student.Sno=SC.Sno
/*查询选修2号课程且成绩在90分以上的所有学生的学号和姓名*/
select SC.Sno,Sname
from Student,SC
where Student.Sno=SC.Sno and SC.Cno='2' and Grade>=90
/*查询每个学生及选课情况(左外连接)*/
select Student.*,Cno,Grade
from Student left outer join SC on (Student.Sno=SC.Sno)
/*sc表右外连接course表*/
select *
from SC right outer join Course on SC.Cno=Course.Cno
/*course表左外连接sc表*/
select *
from Course left outer join SC on SC.Cno=Course.Cno
/*查询每个学生的学号、姓名、选修的课程名及成绩*/
select SC.Sno,Sname,Cname,Grade
from Student,SC,Course
where student.Sno=SC.Sno and SC.Cno=Course.Cno
/*查询每个学生的学号、姓名、选修的课程名及成绩,包括没有选修课程的学生,包括没有被选修的课程(完整外连接)*/
select SC.Sno,Sname,Cname,Grade
from (Student full outer join SC on Student.Sno=SC.Sno)
full outer join Course on SC.Cno=Course.Cno
附宝藏随笔:
传送门