说明:这是我在学习SQL时写的这篇文章,写这篇文章的目的完全是为了加深我对SQL语句的理解,文中难免有错误之处,请见谅!!! 练习环境为:MySQL 首先创建三张表 创建STUDENT(学生表)表: CREATE TABLE STUDENT (sno varchar(20) not null, sname varchar(10) not null, ssex varchar(2) not null, sdept varchar(10) not null); 给STUDENT表添加数据: insert into student (sno, sname, ssex, sage, sdept) values ('9512101', '李勇', '男', '19', '计算机系'); insert into student (sno, sname, ssex, sage, sdept) values ('9512102', '刘晨', '男', '20', '计算机系'); insert into student (sno, sname, ssex, sage, sdept) values ('9512103', '王敏', '女', '20', '计算机系'); insert into student (sno, sname, ssex, sage, sdept) values ('9521101', '张立', '男', '22', '信息系'); insert into student (sno, sname, ssex, sage, sdept) values ('9521102', '吴宾', '女', '21', '信息系'); insert into student (sno, sname, ssex, sage, sdept) values ('9521103', '张海', '男', '20', '信息系'); insert into student (sno, sname, ssex, sage, sdept) values ('9531101', '钱小力', '女', '18', '数学系'); insert into student (sno, sname, ssex, sage, sdept) values ('9531102', '王大力', '男', '19', '数学系');  注:sno(学生学号),sname(学生姓名),ssex(学生性别),sage(学生年龄),sdept(系别) 创建COURSE(课程表)表: CREATE TABLE COURSE (cno varchar(10) not null, cname varchar(20) not null, hours varchar(10) not null); 给COURSE表添加数据: insert into course (cno, cname, hours) values ('c01', '计算机文化学', '70'); insert into course (cno, cname, hours) values ('c02', 'VB', '90'); insert into course (cno, cname, hours) values ('c03', '计算机网络', '80'); insert into course (cno, cname, hours) values ('c04', '数据库基础', '108'); insert into course (cno, cname, hours) values ('c05', '高等数学', '180'); insert into course (cno, cname, hours) values ('c06', '数据结构', '72');  注:cno(课程编号),cname(课程名称),hours(课时) 创建SC(成绩表)表: CREATE TABLE SC (sno varchar(10) not null, cno varchar(10) not null, grade varchar(10)); 给SC表添加数据: insert into sc (sno, cno, grade) values ('9512101', 'c01', '90'); insert into sc (sno, cno, grade) values ('9512101', 'c02', '86'); insert into sc (sno, cno, grade) values ('9512101', 'c06', ''); insert into sc (sno, cno, grade) values ('9512102', 'c02', '78'); insert into sc (sno, cno, grade) values ('9512102', 'c04', '66'); insert into sc (sno, cno, grade) values ('9521102', 'c01', '82'); insert into sc (sno, cno, grade) values ('9521102', 'c02', '75'); insert into sc (sno, cno, grade) values ('9521102', 'c04', '92'); insert into sc (sno, cno, grade) values ('9521102', 'c05', '50'); insert into sc (sno, cno, grade) values ('9521103', 'c02', '68'); insert into sc (sno, cno, grade) values ('9521103', 'c06', ''); insert into sc (sno, cno, grade) values ('9531101', 'c01', '80'); insert into sc (sno, cno, grade) values ('9531101', 'c05', '95'); insert into sc (sno, cno, grade) values ('9531102', 'c05', '85');  注:sno(学生学号),cno(课程编号),grade(成绩) 练习题: 1、分别查询学生表和学生课程表中的全部数据。 查询学生表:select * from student;  查询课程表:select * from course;  2、查询成绩在70到80分之间的学生的学号、课程号和成绩。 select sno as 学号, cno as 课程号, grade as 成绩 from sc where grade between 70 and 80;  3、查询c01号课程成绩最高的分数。 select grade as c01课程成绩最高分 from sc where cno='c01' order by grade desc limit 1;  4、查询学生都选修了哪些课程,要求列出课程号。 select cname as 学生选修的课程, cno as 课程号 from course where cno in (select distinct cno from sc);  5、查询选了C02号课程的所有学生的平均成绩、最高成绩和最低成绩。 select avg(grade) as 平均成绩, max(grade) as 最高成绩, min(grade) as 最低成绩 from sc where cno='c02';  6、统计每个系的学生人数。 select sdept as 系别, count(*) as 人数 from student where sdept in (select distinct sdept from student) group by sdept;  7、统计每门课程的选课人数和考试最高分。 select cname as 课程名, count(*) as 选课人数, max(grade) as 考试最高分 from sc, course where sc.cno in (select distinct cno from sc) and course.cno=sc.cno group by course.cname;  8、统计每个学生的选课门数,并按选课门数的递增顺序显示结果。 select student.sname as 学生姓名, student.sno as 学生学号, count(sc.cno) as 选课门数 from student inner join sc on sc.sno=student.sno group by student.sname, student.sno order by count(sc.sno) asc;  9、统计选修课的学生总数和考试的平均成绩。 select count(distinct(sno)) as 学生总数, avg(grade) as 平均成绩 from sc;  10、查询选课门数超过2门的学生的平均成绩和选课门数 select a.sname, avg(c.grade) as 平均成绩, count (c.sno) as 选课门数 from sc c join (student a, course b) on c.sno=a.sno and c.cno=b.cno group by a.sname having count(distinct b.cno)>2;  11、列出总成绩超过200分的学生,要求列出学号、总成绩。 select sno as 学号, sum(grade) as 总成绩 from sc group by sno having sum(grade)>200;  12、查询选修了c02号课程的学生的姓名和所在系。 select a.sname as 学生姓名, a.sdept as 系别, c.cno as 课程号 from student a join sc c on a.sno=c.sno where c.cno='c02';  13、查询成绩80分以上的学生的姓名、课程号和成绩,并按成绩的降序排列结果。 select a.sname as 学生姓名, c.cno as 课程号, c.grade as 成绩 from student a join sc c on a.sno=c.sno where c.grade>80 order by c.grade desc;  14、查询计算机系男生修了"数据库基础"的学生的姓名、性别、成绩。 select a.sname as 学生姓名, a.ssex as 学生性别, c.grade as 成绩 from student a join (sc c, course b) on a.sno=c.sno and b.cno=c.cno where b.cname='数据库基础' and a.ssex='男';  15、查询哪些学生的年龄相同,要求列出年龄相同的学生的姓名和年龄。 select a.sname as 年龄相同的学生姓名, a.sage as 年龄 from student a join student b where a.sage=b.sage and a.sname!=b.sname group by a.sname, a.sage order by a.sage;  16、查询哪些课程没有人选,要求列出课程号和课程名。 select cno as 课程号, cname as 课程名称 from course where cno not in (select distinct cno from sc); 17、查询有考试成绩的所有学生的姓名、修课名称及考试成绩。 select a.sname as 有考试成绩的学生姓名, b.cname as 课程名称, c.grade as 成绩 from student a jion (course b, sc c) on a.sno=c.sno and b.cno=c.cno where c.grade is not null and c.ggrade!='';  18、分别查询信息系和计算机系的学生的姓名、性别、修课名称、修课成绩,要求将这两个查询结果合并成一个结果集,并以系名、姓名、性别、修课名称、修课成绩的顺序显示各列。   19、将所有选修了"c01"课程的学生的成绩加10分。 
|