先创建三个表,分别为student,course,SC(即学生表,课程表,选课表)
建表语句:
create table student(
Sno int,
Sname varchar(255),
Sage int,
Sex varchar(10),
Sdept varchar(100),
primary key(Sno)
);
create table course(
Cno varchar(10),
Cname varchar(255),
hours int,
primary key(Cno)
);
create table sc(
Sno int,
Cno varchar(10),
Grade int
);
insert into student values
(9512101,'李勇',19,'男','计算机系'),
(9512102,'刘晨',20,'男','计算机系'),
(9512103,'王敏',20,'女','计算机系'),
(9521101,'张立',22,'男','信息系'),
(9521102,'吴斌',21,'女','信息系'),
(9521103,'张海',20,'男','信息系'),
(9531101,'钱小利',18,'女','数学系'),
(9531102,'王大利',19,'男','数学系');
insert into course values
('C01','计算机文化学',70),
('C02','VB',90),
('C03','计算机网络',80),
('C04','数据库基础',108),
('C05','高等数学',180),
('C06','数据结构',72);
insert into sc values
(9512101,'C01',90),
(9512101,'C02',86),
(9512101,'C06',null),
(9512102,'C02',78),
(9512102,'C04',66),
(9512102,'C01',82),
(9521102,'C02',75),
(9521102,'C04',92),
(9521102,'C05',50),
(9521103,'C02',68),
(9521103,'C06',null),
(9531101,'C01',80),
(9531101,'C05',90),
(9531102,'C05',85);
建表情况如下:
1.分别查询学生表和学生修课表中的全部数据。
select * from student;
select * from course;
2.查询成绩在70到80分之间的学生的学号、课程号和成绩。
select Sno,Cno,Grade from sc where Grade between 70 and 80
3.查询C01号课程成绩最高的分数
select max(Grade) from sc where Cno='C01'
select Grade from sc where Cno='C01' order by Grade desc limit 1
4.查询学生都选修了哪些课程,要求列出课程号。
select Cname,Cno from course where Cno in (select Cno from sc)
5.查询修了C02号课程的所有学生的平均成绩、最高成绩和最低成绩。
select avg(Grade),max(Grade),min(Grade) from sc where Cno='C02'
6.统计每门课程的修课人数和考试最高分。
select Cname,count(*),max(Grade) from course,sc where sc.Cno=course.Cno group by sc.Cno;
7.统计每个学生的选课门数,并按选课门数的递增顺序显示结果。
select Sname,count(*) as '选课门数' from student,sc where student.Sno=sc.Sno group by sc.Sno order by count(*)
8.统计选修课的学生总数和考试的平均成绩。
select count(distinct Sno),avg(Grade) from sc
9.查询选课门数超过2门的学生的平均成绩和选课门数。
select Sname,avg(Grade),count(*) from student,sc where sc.Sno=student.Sno group by sc.Sno having count(*)>2
10.列出总成绩超过200分的学生,要求列出学号、总成绩。
select Sno,sum(Grade) from sc group by Sno having sum(Grade)>200
11.查询选修了c02号课程的学生的姓名和所在系。
select Sname,Sdept from student where Sno in (select Sno from sc where Cno='C02')
select Sname,Sdept from student,sc where student.Sno=sc.Sno and Cno='C02'
12.查询成绩80分以上的学生的姓名、课程号和成绩,并按成绩的降序排列结果。
select Sname,Cno,Grade from student,sc where student.Sno=sc.Sno and Grade>80 order by Grade desc
13.查询计算机系男生修了”数据库基础”的学生的姓名、性别、成绩。
select Sname,Sex,Grade from student,course,sc where student.Sno=sc.Sno and course.Cno=sc.Cno and Sdept='计算机系' and Cname='数据库基础'
14.查询哪些学生的年龄相同,要求列出年龄相同的学生的姓名和年龄。
select s1.Sname,s1.Sage from student s1 inner join student s2 on s1.Sage in (select Sage from student where s1.Sage=s2.Sage and s1.Sname !=s2.Sname) group by s1.Sname,s1.Sage order by s1.Sage
15.查询哪些课程没有人选,要求列出课程号和课程名。
select Cno,Cname from course where Cno not in (select Cno from sc)
16.查询有考试成绩的所有学生的姓名、修课名称及考试成绩
select Sname,Cname,Grade from student,course,sc where student.Sno=sc.Sno and course.Cno=sc.Cno and sc.Grade is not null
17.分别查询信息系和计算机系的学生的姓名、性别、修课名称、修课成绩,
select Sname,Sex,Cname,Grade from student,sc,course where student.Sno=sc.Sno and course.Cno=sc.Cno and student.Sdept='计算机系'
select Sname,Sex,Cname,Grade from student,sc,course where student.Sno=sc.Sno and course.Cno=sc.Cno and student.Sdept='信息系'
18.用子查询实现如下查询:
(1) 查询选修了C01号课程的学生的姓名和所在系。
select Sname,Sdept from student where Sno in (select Sno from sc where Cno='C01')
(2) 查询数学系成绩80分以上的学生的学号、姓名。
select Sno,Sname from student where Sno in (select Sno from sc where Grade>80) and Sdept='数学系'
(3) 查询计算机系学生所选的课程名.
select Cname from course where Cno in (select Cno from sc where Sno in ( select Sno from student where Sdept='计算机系'))