数据库建表脚本和使用的数据请参考:http://www.cnblogs.com/zhtzyh2012/p/5235826.html
sql50题练习参看:http://blog.sina.com.cn/s/blog_6d1d0bf80100zm8l.html
-- 创建教学系统的数据库,表,以及数据
-- student(sno,sname,sage,ssex) 学生表
-- course(cno,cname,tno) 课程表
-- sc(sno,cno,score) 成绩表
-- teacher(tno,tname) 教师表
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
step1:查询所有学生的学号和成绩关联的表是sc表
step2:查询课程1和课程2的成绩
select score, sno from sc where sc.cno = 1; -- alias a
select score, sno from sc where sc.cno = 2; -- alias b
step3:查询同一人的课程1和2的分数进行比较
a.score > b.score and a.sno = b.sno
select a.sno from (select score, sno from sc where sc.cno = 1) a,
(select score, sno from sc where sc.cno = 2) b
where a.score > b.score and a.sno = b.sno;
此题知识点,嵌套查询和给查出来的表起别名
2.查询平均成绩大于60分的同学的学号和平均成绩;
step1:查询所涉及的表是sc
step2:平均成绩 avg()方法,根据学号进行分组,聚合函数算取平均分
select sno, avg(score) from sc group by sno having avg(score) > 60;
此题知识点,GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。group by后面不能接where,having代替了where
3.查询所有同学的学号、姓名、选课数、总成绩;
step1:学号和姓名来自学生表,选课数和总成绩来自成绩表
step2:select sno, sname from student; -- 获取学号和姓名
step3:select sno, count(*), sum(score) from sc group by sno; -- 获取总成绩和选课数
select s.sno, s.sname, count(sc.cno), sum(sc.score) from student s left join sc on s.sno = sc.sno group by s.sno, s.sname;
此题主要考察左关联查询和分组使用