入门-MySQL查询语句的45道练习
一、设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。
表1-1数据库的表结构
表(一)Student (学生表)
| 属性名 | 数据类型 | 可否为空 | 含 义 | 
| Sno | varchar (20) | 否 | 学号(主码) | 
| Sname | varchar (20) | 否 | 学生姓名 | 
| Ssex | varchar (20) | 否 | 学生性别 | 
| Sbirthday | datetime | 可 | 学生出生年月 | 
| Class | varchar (20) | 可 | 学生所在班级 | 
表(二)Course(课程表)
| 属性名 | 数据类型 | 可否为空 | 含 义 | 
| Cno | varchar (20) | 否 | 课程号(主码) | 
| Cname | varchar (20) | 否 | 课程名称 | 
| Tno | varchar (20) | 否 | 教工编号(外码) | 
表(三)Score(成绩表)
| 属性名 | 数据类型 | 可否为空 | 含 义 | 
| Sno | varchar (20) | 否 | 学号(外码) | 
| Cno | varchar (20) | 否 | 课程号(外码) | 
| Degree | Decimal(4,1) | 可 | 成绩 | 
| 主码:Sno+ Cno | |||
表(四)Teacher(教师表)
| 属性名 | 数据类型 | 可否为空 | 含 义 | 
| Tno | varchar (20) | 否 | 教工编号(主码) | 
| Tname | varchar (20) | 否 | 教工姓名 | 
| Tsex | varchar (20) | 否 | 教工性别 | 
| Tbirthday | datetime | 可 | 教工出生年月 | 
| Prof | varchar (20) | 可 | 职称 | 
| Depart | varchar (20) | 否 | 教工所在部门 | 
表1-2数据库中的数据
表(一)Student
| Sno | Sname | Ssex | Sbirthday | class | 
| 108 | 曾华 | 男 | 1977-09-01 | 95033 | 
| 105 | 匡明 | 男 | 1975-10-02 | 95031 | 
| 107 | 王丽 | 女 | 1976-01-23 | 95033 | 
| 101 | 李军 | 男 | 1976-02-20 | 95033 | 
| 109 | 王芳 | 女 | 1975-02-10 | 95031 | 
| 103 | 陆君 | 男 | 1974-06-03 | 95031 | 
表(二)Course
| Cno | Cname | Tno | 
| 3-105 | 计算机导论 | 825 | 
| 3-245 | 操作系统 | 804 | 
| 6-166 | 数字电路 | 856 | 
| 9-888 | 高等数学 | 831 | 
表(三)Score
| Sno | Cno | Degree | 
| 103 | 3-245 | 86 | 
| 105 | 3-245 | 75 | 
| 109 | 3-245 | 68 | 
| 103 | 3-105 | 92 | 
| 105 | 3-105 | 88 | 
| 109 | 3-105 | 76 | 
| 101 | 3-105 | 64 | 
| 107 | 3-105 | 91 | 
| 108 | 3-105 | 78 | 
| 101 | 6-166 | 85 | 
| 107 | 6-166 | 79 | 
| 108 | 6-166 | 81 | 
表(四)Teacher
| Tno | Tname | Tsex | Tbirthday | Prof | Depart | 
| 804 | 李诚 | 男 | 1958-12-02 | 副教授 | 计算机系 | 
| 856 | 张旭 | 男 | 1969-03-12 | 讲师 | 电子工程系 | 
| 825 | 王萍 | 女 | 1972-05-05 | 助教 | 计算机系 | 
| 831 | 刘冰 | 女 | 1977-08-14 | 助教 | 电子工程系 | 




#建学生信息表student
create table student
(
sno varchar(20) not null primary key,
sname varchar(20) not null,
ssex varchar(20) not null,
sbirthday datetime,
class varchar(20)
);
#建立教师表
create table teacher
(
tno varchar(20) not null primary key,
tname varchar(20) not null,
tsex varchar(20) not null,
tbirthday datetime,
prof varchar(20),
depart varchar(20) not null
);
#建立课程表course
create table course
(
cno varchar(20) not null primary key,
cname varchar(20) not null,
tno varchar(20) not null,
foreign key(tno) references teacher(tno)
);
#建立成绩表
create table score
(
sno varchar(20) not null primary key,
foreign key(sno) references student(sno),
cno varchar(20) not null,
foreign key(cno) references course(cno),
degree decimal
);
#添加学生信息
insert into student values('108','曾华','男','1977-09-01','95033');
insert into student values('105','匡明','男','1975-10-02','95031');
insert into student values('107','王丽','女','1976-01-23','95033');
insert into student values('101','李军','男','1976-02-20','95033');
insert into student values('109','王芳','女','1975-02-10','95031');
insert into student values('103','陆君','男','1974-06-03','95031');
#添加教师表
insert into teacher values('804','李诚','男','1958-12-02','副教授','计算机系');
insert into teacher values('856','张旭','男','1969-03-12','讲师','电子工程系');
insert into teacher values('825','王萍','女','1972-05-05','助教','计算机系');
insert into teacher values('831','刘冰','女','1977-08-14','助教','电子工程系');
#添加课程表
insert into course values('3-105','计算机导论','825');
insert into course values('3-245','操作系统','804');
insert into course values('6-166','数字电路','856');
insert into course values('9-888','高等数学','831');
#添加成绩表
insert into score values('103','3-245','86');
insert into score values('105','3-245','75');
insert into score values('109','3-245','68');
insert into score values('103','3-105','92');
insert into score values('105','3-105','88');
insert into score values('109','3-105','76');
insert into score values('103','3-105','64');
insert into score values('105','3-105','91');
insert into score values('109','3-105','78');
insert into score values('103','6-166','85');
insert into score values('105','6-166','79');
insert into score values('109','6-166','81');
1、 查询Student表中的所有记录的Sname、Ssex和Class列。
| 1 | selectSname,Ssex,Class fromstudent | 
2、 查询教师所有的单位即不重复的Depart列。
| 1 | selectdistinctDepart fromteacher | 
3、 查询Student表的所有记录。
| 1 | select*  fromstudent | 
4、 查询Score表中成绩在60到80之间的所有记录。
| 1 | select*  fromScore whereDegree between60 and80 | 
5、 查询Score表中成绩为85,86或88的记录。
| 1 | select*  fromScore whereDegree in(85,86,88) | 
6、 查询Student表中“95031”班或性别为“女”的同学记录。
| 1 | select*  fromStudent whereclass='95031'orSsex='女' | 
7、 以Class降序查询Student表的所有记录。
| 1 | select*  fromstudent orderbyclass desc | 
8、 以Cno升序、Degree降序查询Score表的所有记录。
| 1 | select*  fromScore orderbycno asc,degree desc | 
9、 查询“95031”班的学生人数。
| 1 | selectcount(*)  fromstudent whereclass='95031' | 
10、 查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
| 1 | selectSno,Cno  fromScore whereDegree=(selectmax(Degree) fromScore) | 
| 1 | selectSno,Cno  fromScore orderbyDegree desclimit 0,1 | 
11、 查询每门课的平均成绩。
| 1 | selectCno,avg(degree) fromScore groupbyCno | 
12、 查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
| 1 | selectavg(Degree) fromscore whereCno like'3%'andCno in(selectCno fromscore groupbyCno havingcount(*)>=5) 用in不用= 是因为可能会有多个 | 
| 1 | 简单写法:selectavg(Degree) fromscore whereCno like'3%'andgroupbyCno havingcount(*)>=5 | 
13、 查询分数大于70,小于90的Sno列。
| 1 | selectSno fromScore wheredegree>70 anddegree<90 | 
14、 查询所有学生的Sname、Cno和Degree列。
| 1 | selectSname, Cno,Degree fromScore , student whereScore.Sno=student.Sno | 
15、 查询所有学生的Sno、Cname和Degree列。
| 1 | selectSno,Cname,Degree fromScore , Course whereScore.Cno=Course.Cno | 
16、 查询所有学生的Sname、Cname和Degree列。
| 1 | selectSname,Cname,Degree fromstudent,course,score wherestudent.Sno=score.Sno andcourse.Cno=score.Cno | 
| 1 | join.. on写法:selectSname,Cname,Degree fromstudent joinscore onstudent.Sno=score.Sno joincourse oncourse.Cno=score.Cno | 
17、 查询“95033”班学生的平均分。
| 1 | selectavg(degree) as'class=95033'fromScore whereSno in(selectSno fromStudent whereClass='95033')   | 
18、 假设使用如下命令建立了一个grade表:
create table grade(low int(3),upp int(3),rank char(1))
insert into grade values(90,100,’A’)
insert into grade values(80,89,’B’)
insert into grade values(70,79,’C’)
insert into grade values(60,69,’D’)
insert into grade values(0,59,’E’)
现查询所有同学的Sno、Cno和rank列。
| 1 | selectSno,Cno,rank fromScore,grade wheredegree betweenlow andupp | 
19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
| 1 | <span style="color: #000000; font-size: 15px">109同学,选修是3-105课的</span> | 
| 1 | select* fromscore whereCno='3-105'anddegree>(selectmax(degree ) fromScore whereSno='109'andCno='3-105') | 
| 1 | <span style="font-size: 15px">109同学,没有选修3-105课</span> | 
| 1 | select* fromscore whereCno='3-105'anddegree>(selectmax(degree ) fromScore whereSno='109') | 
and degree<( select max(degree ) from Score where sno in (select Sno from score group by Sno having count(*)>1))
| 1 | 选了多门课程并且是这个课程下不是最高分的 | 
| 1 | select* fromscore a whereSno in(selectSno fromscore groupbySno havingcount(*)>1) anddegree<( selectmax(degree ) fromScore b whereb.cno = a.cno) | 
21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
| 1 | Select* fromscore wheredegree>(selectdegree fromScore whereSno='109'andCno='3-105') | 
22、查询和学号为108、101的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
| 1 | selectsno,sname,sbirthday  fromstudent whereyear(sbirthday) = (selectyear(sbirthday) fromstudent wheresno='108') | 
| 1 | selectsno,sname,sbirthday  fromstudent whereyear(sbirthday) = (selectyear(sbirthday) fromstudent wheresno='101') | 
23、查询“张旭“教师任课的学生成绩。
| 1 | selectSno,degree fromscore,Course  wherescore.Cno=Course.Cno andCourse.Tno= (selectTno fromTeacher whereTname='张旭') | 
| 1 | selectdegree fromscore whereCno in(selectcno fromcourse whereTno= (selectTno fromTeacher whereTname='张旭') ) | 
24、查询选修某课程的同学人数多于5人的教师姓名。
| 1 | selectTname fromTeacher,  Course whereTeacher.Tno=Course.Tno andCourse.Cno =(selectCno fromScore groupbyCno havingcount(*)>5) | 
| 1 | selectTname fromTeacher wheretno=( selectTno fromCourse wherecno=( selectCno fromScore groupbyCno havingcount(*)>5 )) | 
25、查询95033班和95031班全体学生的记录。
| 1 | select* fromstudent whereclass in('95033','95031') | 
26、 查询存在有85分以上成绩的课程Cno.
| 1 | selectCno fromscore wheredegree>85 | 
27、查询出“计算机系“教师所教课程的成绩表。
| 1 | select* fromcourse  wherecno in(selectcno fromcourse  wheretno in(selecttno fromteacher whereDepart='计算机系')) | 
28、查询“计算 机系”与“电子工程系“不同职称的教师的Tname和Prof。
| 1 | selectTname,Prof fromTeacher whereDepart ='计算机系'andProf  notin( selectProf fromTeacher whereDepart ='电子工程系')<br>union<br>selectTname,Prof fromTeacher whereDepart ='电子工程系'andProf  notin( selectProf fromTeacher whereDepart ='计算机系') | 
29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
any:代表括号中任意一个成绩就可以
| 1 | selectCno,Sno,Degree fromscore wherecno='3-105'anddegree >any(selectdegree fromscore wherecno='3-245') orderbydegree  desc | 
30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
all:代表括号中的所有成绩
| 1 | selectCno,Sno,Degree fromscore wherecno='3-105'anddegree >all(selectdegree fromscore wherecno='3-245') orderbydegree desc | 
31、 查询所有教师和同学的name、sex和birthday.
| 1 | selecttname,tsex,tbirthday fromTeacher unionselectsname,ssex,sbirthday fromStudent | 
32、查询所有“女”教师和“女”同学的name、sex和birthday.
| 1 | selectTname,Tsex,Tbirthday fromTeacher whereTsex='女'unionselectSname,Ssex,Sbirthday fromStudent whereSsex='女' | 
33、 查询成绩比该课程平均成绩低的同学的成绩表。
| 1 | select* fromscore a  wheredegree < (selectavg(degree) fromscore b whereb.cno=a.cno) | 
34、 查询所有任课教师的Tname和Depart.
| 1 | selectTname,Depart fromTeacher wheretno in(selecttno fromcourse ) | 
35 、 查询所有未讲课的教师的Tname和Depart.
| 1 | selectTname,Depart fromTeacher whereTno notin(selectTno fromCourse wherecno in(selectcno fromscore  )) | 
36、查询至少有2名男生的班号。
| 1 | selectclass fromstudent wheressex='男'groupbyclass havingcount(*)>1 | 
37、查询Student表中不姓“王”的同学记录。
| 1 | select* fromStudent whereSname notlike'王%%' | 
38、查询Student表中每个学生的姓名和年龄。
| 1 | selectSname, year(now())-year(sbirthday)  fromStudent | 
39、查询Student表中最大和最小的Sbirthday日期值。
| 1 | selectMax(Sbirthday ),Min(Sbirthday ) fromStudent | 
40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
| 1 | select* fromStudent  orderbyclass desc, Sbirthday | 
41、查询“男”教师及其所上的课程。
| 1 | selectTname,Cname fromcourse,teacher wherecourse.tno= teacher.tno andteacher.Tsex='男' | 
42、查询最高分同学的Sno、Cno和Degree列。
| 1 | selectSno,Cno,Degree fromscore wheredegree=(selectmax(degree) fromscore) | 
排序写法:
| 1 | selectSno,Cno,Degree fromscore orderbydegree desclimit 0,1 | 
43、查询和“李军”同性别的所有同学的Sname.
| 1 | selectSname fromStudent whereSsex = (selectSsex fromStudent whereSname='李军') | 
44、查询和“李军”同性别并同班的同学Sname.
| 1 | selectSname fromStudent whereSsex = (selectSsex fromStudent whereSname='李军') andclass=( selectclass fromstudent whereSname='李军') | 
45、查询所有选修“计算机导论”课程的“男”同学的成绩表。
| 1 | selectSno,Cno,degree fromscore whereCno=( selectCno fromcourse whereCname='计算机导论') andSno in(selectSno fromstudent whereSsex='男') | 
 
                    
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号