MySql语法练习题
一、根据提示完成题目
student表,则包含字段:Sno int(5),Sname varchar(10),Ssex varchar(2),Sage int(3),Sdept varchar(5) Sno 主键 自增;遇SC表,则包含Sno,Cno,Grade, level字段(level 表明该课程是否为选修课)。
1、 创建bookshop数据库
create database if not exists bookshop;
2、创建名为admin_user(管理员用户)的数据表,包含以下字段:uid,uname,password,ulevel,e-mail(数据类型、长度,主键等自己考虑,设计的越合理越好)
create table admin_user(
uid int primary key auto_increment,
uname char(10) not null,
passward varchar(32) default '00000000',
ulevel int default 0,
e-mail char(50))engine=innodb default charset utf8;
3、创建名为members(会员用户)的数据表,包含字段、主键、数据类型等均自由设计,越合理越好。
create table memmbers(
mid int(5) primary key,
mname varchar(10))engine=innodb default charset utf8;
4、创建名为goods的数据表,包含字段:gid,gname,class, category
create table goods(
gid bigint primary key,
gname char(20),
class char(10),
category varchar(10))engine=innodb default charset utf8;
5、删除数据库。
drop database if exists bookshop;
6、 删除数据表student。
drop table if exists student;
7、将student表重命名为user表
alter table student rename user;
8、为admin_user增加一个 TEL字段,数据类型为int,长度为5,非空,唯一
alter table admin_user add tel int(5) not null unique;
9、删除student表中的Sdept字段的约束条件
alter table admin_user modify sdept char(20);
10、将student表中的Ssex字段修改为varchar类型
alter table student modify Ssex varchar(2);
11、将course表中的Cno字段修改为主键,并且自增
alter table course modify Cno int primary key auto_increment;
12、将admin_user表的TEL字段改名为Telephone
alter table admin_user change TEL Telephone numeric(11);
13、查询admin_user表中的所有用户
select * from admin_user;
14、查询admin_user表中,所有ulevel在8级以上的用户
select * from admin_user where ulevel=8;
15、查询姓名为李四的用户的用户等级
select ulevel from admin_user where uname='李四';
16、查询admin_user表除用户密码外的所有用户信息,表头改为用户ID, 用户名, 用户等级, 电子邮箱, 联系电话
select uid 用户ID,uname 用户名,ulevle 用户等级,e-mail 电子邮箱,tel 联系电话 from admin_user;
17、查询SC的Sno,消除重复行
select distinct Sno from SC;
18、询所有年龄在20岁以下的学生姓名及其年龄
select sname,sage from student where age<20;
19、查询年龄在18至20岁之间的学生的学号及姓名(请用3中方法)
select sno,sname from student where between 18 and 20;
20、查询计算机系所有姓刘的学生的全部信息
select * from student where sdept='计算机系' and sname like '刘%';
21、查询电子信息工程专业,所有名字中包含井的学生的全部信息
select * from student where sdept='电子信息工程系' and sanme like '%井%';
22、查询计算机系年龄在20岁以下的学生姓名
select sname from student where sdept='计算机系' and sage<20;
23、查询计算机系、电子信息工程系、信管系,大四学生的详细信息,并按照学号降序排列
select * from student where sdept int ('计算机系','电子信息工程系','信管系') and slevel='大四' order by sno;
24、计算1号课程的学生平均成绩
select avg(score) from SC where kid=1;
25、查询选修1号课程的学生最高分数
select max(score) from SC where kid=1;
26、查询每门课程有多少学生学过
select count(*) from SC group by kid;
27、查询所有学生学过课程的总数
select count(*) from SC;
28、查询所有选修课,有多少学生修过
select count(*) from Sc
29、查询平均成绩大于80分的学生的学号和姓名
select sid,sname from student s inner join score c on s.sid=c.sid group by s.sid s.name having avg(score)>80;
30、查询有3门以上课程(不包含选修课)是90分以上的学生的学号及(90分以上的)课程数
select sno,count(*) from SC where score>90 group by sno having count(*)>3;
二、信息如下,回答下列问题
- student学生信息表
sno | sname | sex | birthday | class |
---|---|---|---|---|
108 | 曾华 | 男 | 1977-01-09 | 95033 |
105 | 匡明 | 男 | 1975-02-01 | 95031 |
107 | 王丽 | 女 | 1976-01-23 | 95033 |
101 | 李军 | 男 | 1976-02-20 | 95033 |
109 | 王芳 | 女 | 1975-02-10 | 95031 |
103 | 陆军 | 男 | 1974-06-03 | 95031 |
- teache老师信息表
tno | tname | sex | birthday | prof | depart |
---|---|---|---|---|---|
804 | 李诚 | 男 | 1958-02-12 | 副教授 | 计算机系 |
825 | 王萍 | 女 | 1972-05-05 | 助教 | 计算机系 |
831 | 刘冰 | 女 | 1977-08-14 | 助教 | 电子工程系 |
856 | 李旭 | 男 | 1969-12-03 | 讲师 | 电子工程系 |
- course课程表
cno | cname | tno |
---|---|---|
3-105 | 计算机导论 | 825 |
3-245 | 操作系统 | 804 |
6-166 | 数字电路 | 856 |
9-888 | 高等数学 | 825 |
- score成绩表
sno | cno | degree |
---|---|---|
103 | 3-245 | 86.00 |
109 | 3-245 | 68.00 |
105 | 3-245 | 75.00 |
103 | 3-105 | 92.00 |
105 | 3-105 | 88.00 |
109 | 3-105 | 76.00 |
101 | 3-105 | 64.00 |
107 | 3-105 | 91.00 |
108 | 3-105 | 78.00 |
101 | 6-166 | 85.00 |
107 | 6-166 | 79.00 |
108 | 6-166 | 81.00 |
创建表信息,并添加约束。
create table student(
sno int primary key,
sname char(10) not null,
sex enum('男','女'),
birthday date,
class int not null)engine=innodb default charset utf8;
create table teacher(
tno int primary key,
name char(10) not null,
sex enum('男','女'),
birthday date,
prof enum('教授','副教授','讲师','助教'),
depart char(10))engine=innodb default charset utf8;
create table course(
cno char(8) primary key,
cname char(10) not null,
tno int ,
foreign key(tno) references teacher(tno) on delete cascade
)engine=innodb default charset utf8;
create table score(
sno int,
cno char(8),
degree numeric(5,2),
foreign key(sno) references student(sno) on delete cascade,
foreign key(cno) references course(cno) on delete cascade
)engine=innodb default charset utf8;
1、列出student表中所有记录的sname、sex和class列;
select sname,sex,class from student;
2、显示教师所有的单位即不重复的depart列
select distinct depart from student;
3、显示学生表的所有信息
select * from student;
4、显示score表中成绩在60到80之间的所有记录
select * from score where degree between 60 and 80;
5、显示score表中成绩为85,86,88的记录
select * from score where degree in(85,86,88);
6、显示student’表中‘93031’班或者性别为女的同学的记录
select * from student class=95031 or sex='女';
7、以class降序显示student表的所有记录
select * from student order by class desc;
8、以cno升序、degree降序显示score表的所有记录
select * frmo score group by cno,degree desc;
9、显示’95031’班的学生人数。
select count(*) student where class='95031';
10、显示score表中最高分的学生号和课程号。
select sno,cno from score where degree(select max(degree) from score);
11、显示’3-105’号课程的平均分。
select avg(degree) from score cid='3-105'
三、建表如下,回答下列问题
create table S(sno bigint primary key auto_increment,sname varchar(10))engine=innodb default charset utf8;
insert into S(sname) values('jurry'),('monkey'),('pig'),(dog);
create table C(cno bigint primary key auto_increment,cname varchar(10),cteacher varchar(10))engine=innodb default charset utf8;
insert into C(cname,cteacher) values('Java','Tom'),('Html','Tomes'),('PHP','jack');
create table SC(sno bigint,cno bigint,scgrade numeric(5,2))engine=innodb default charset utf8;
insert into SC values(1,1,77.1),(1,2,65),(1,3,88),(2,1,12),(2,2,55),(2,3,66),(3,1,55)
1、求没修Tom老师的所有学生姓名
select sname from S where sname not in(select distinct S.sname from S left join SC on S.sno=SC.sno left join C on C.cno=SC.cno group by sname,cteacher having cteacher='Tom');
2、求两门及两门以上不及格课程的学生的姓名和平均成绩
select S.sname,avg(scgrade) from S inner join SC on S.sno=SC.sno where SC.scgrade<60 group by S.sname having count(*)>1 ;
3、求既选修一号课程又选修二号课程的学生姓名
select sname from S where sno in(select s1.sno from SC s1 inner join SC s2 on s1.sno=s2.sno where s1.cno=1 and s2.cno=2);
4、求选修一号课程的分数大于二号课程的分数的学生学号
select s1.sno from SC s1 inner join SC s2 on s1.sno=s2.sno where s1.cno=1 and s2.cno=2 and s1.scgrade>s2.scgrade;
5、求选修一号课程的分数大于二号课程的分数的学生学号及其一号二号课程的成绩
select s1.sno,s1.scgrade,s2.scgrade from SC s1 inner join SC s2 on s1.sno=s2.sno where s1.cno=1 and s2.cno=2 and s1.scgrade>s2.scgrade;
四、建表语句如下回答下列问题
建表语句如下:
create table student(sno varchar(10) primary key,sname varchar(20),sage numeric(2),ssex varchar(5))engine=innodb default charset utf8;;
create table teacher(tno varchar(10) primary key,tname varchar(20))engine=innodb default charset utf8;;
create table course(cno varchar(10),cname varchar(20),tno varchar(20),constraint pk_course primary key (cno,tno))engine=innodb default charset utf8;;
create table sc(sno varchar(10),cno varchar(10),score numeric(4,2),constraint pk_sc primary key (sno,cno)
)engine=innodb default charset utf8;
初始化表中参数:
/*******初始化学生表的数据******/
insert into student values ('s001','张三',23,'男');
insert into student values ('s002','李四',23,'男');
insert into student values ('s003','吴鹏',25,'男');
insert into student values ('s004','琴沁',20,'女');
insert into student values ('s005','王丽',20,'女');
insert into student values ('s006','李波',21,'男');
insert into student values ('s007','刘玉',21,'男');
insert into student values ('s008','萧蓉',21,'女');
insert into student values ('s009','陈萧晓',23,'女');
insert into student values ('s010','陈美',22,'女');
commit;
/******************初始化教师表***********************/
insert into teacher values ('t001', '刘阳');
insert into teacher values ('t002', '谌燕');
insert into teacher values ('t003', '胡明星');
commit;
/***************初始化课程表****************************/
insert into course values ('c001','J2SE','t002');
insert into course values ('c002','Java Web','t002');
insert into course values ('c003','SSH','t001');
insert into course values ('c004','Oracle','t001');
insert into course values ('c005','SQL SERVER 2005','t003');
insert into course values ('c006','C#','t003');
insert into course values ('c007','JavaScript','t002');
insert into course values ('c008','DIV+CSS','t001');
insert into course values ('c009','PHP','t003');
insert into course values ('c010','EJB3.0','t002');
commit;
/***************初始化成绩表***********************/
insert into sc values ('s001','c001',78.9);
insert into sc values ('s002','c001',80.9);
insert into sc values ('s003','c001',81.9);
insert into sc values ('s004','c001',60.9);
insert into sc values ('s001','c002',82.9);
insert into sc values ('s002','c002',72.9);
insert into sc values ('s003','c002',81.9);
insert into sc values ('s001','c003',59);
commit;
1、查询“c001”课程比“c002”课程成绩高的所有学生
select a.sno from sc a inner join sc b on a.sno=b.sno where a.cno='c001' and b.cno='c002' and a.score>b.score;
2、查询平均成绩大于60 分的同学的学号和平均成绩;
select sno,avg(score) from sc group by sno having avg(score)>60;
3、查询所有同学的学号、姓名、选课数、总成绩;
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;
4、查询姓“刘”的老师的个数;
select count(*) from teacher where tname like '刘%';
5、查询没学过“谌燕”老师课的同学的学号、姓名;
select distinct s.sno,s.sname from student s left join sc on s.sno=sc.sno left join course c on sc.cno=c.cno left join teacher t on t.tno=c.tno group by s.sno,s.sname,t.tname having t.tname !='谌燕' or t.tname is null;
6、查询学过“c001”并且也学过编号“c002”课程的同学的学号、姓名;
select s.sno,s.sname from student s inner join sc a on s.sno=a.sno inner join sc b on a.sno=b.sno where a.cno='c001' and b.cno='c002';
7、查询学过“谌燕”老师所教的所有课的同学的学号、姓名;
select s.sno,s.sname from student s left join sc on s.sno=sc.sno left join course c on sc.cno=c.cno left join teacher t on t.tno=c.tno group by s.sno,s.sname,t.tname having t.tname ='谌燕';
8、查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名;
select s.sno,s.sname from student s inner join sc a on s.sno=a.sno inner join sc b on a.sno=b.sno where a.cno='c002' and b.cno='c001' and a.score<b.score;
9、查询所有课程成绩小于60 分的同学的学号、姓名;
select distinct s.sno,s.sname from student s inner join sc on s.sno=sc.sno where sc.score<60 group by s.sno,s.sname;
10、查询没有学全所有课的同学的学号、姓名;
select s.sno,s.sname from student s left join sc on s.sno=sc.sno group by s.sno,s.sname having count(*)<(select count(*) from course);
11、查询至少有一门课与学号为“s001”的同学所学相同的同学的学号和姓名;
select distinct s.sno,s.sname from student s inner join sc on s.sno=sc.sno where sc.cno in (select cno from sc where sno='s001') and s.sno!='s001';
12、查询至少学过学号为“s001”同学所有一门课的其他同学学号和姓名;
select distinct s.sno,s.sname from student s inner join sc on s.sno=sc.sno where sc.cno in (select cno from sc where sno='s001') and s.sno!='s001';
13、把“SC”表中“谌燕”老师教的课的成绩都更改为此课程的平均成绩;
14、查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名;
select s.sno,s.sname from student s inner join sc on s.sno=sc.sno where sc.cno in(select cno from sc where sno='s001') and s.sno!='s001' group by s.sno,s.sname having count(*)=(select count(*) from sc where sno='s001');
15、删除学习“谌燕”老师课的SC 表记录;
delete from sc where cno in (select c.con from crouse c inner join teacher t on c.tno=t.tno where t.tname='谌燕');
16、向SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编号“c002”课程的同学学号、“c002”号课的平均成绩;
17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
select cno 课程ID,max(score) 最高分,min(score) 最低分 from sc group by cno;
18、按各科平均成绩从低到高和及格率的百分数从高到低顺序
select cno from sc group by cno order by avg(score) desc;
19、查询不同老师所教不同课程平均分从高到低显示
select t.tname,c.cname,avg(sc.score) from sc inner join course c on c.cno=sc.cno inner join teacher t on t.tno=c.tno group by t.tname,c.cname order by avg(sc.score) desc;
20、统计列印各科平均成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
21、查询各科成绩前三名的记录:(不考虑成绩并列情况)
select s1.* from sc s1 where(select count(1) from sc s2 where s1.cno=s2.cno and s2.score>=s1.score)<=3 order by s1.cno;
22、查询每门课程被选修的学生数
select cno 课程编号,count(*) 选修人数 from sc group by cno;
23、查询出只选修了一门课程的全部学生的学号和姓名
select s.sno,s.sname from sc inner join student s on sc.sno=s.sno group by s.sno,s.sname having count(*)=1;
24、查询男生、女生人数
select ssex,count(*) from student group by ssex;
25、查询姓“张”的学生名单
select * from student where sname like '张%';
26、查询同名同性学生名单,并统计同名人数
select sname from student group by sname having count(*)>1;
27、2000 年出生的学生名单(注:Student 表中Sage 列的类型是number)
select * from student where sage=year(now())-2000;
28、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
select cno,avg(score) from sc group by cno order by avg(score),cno desc;
29、查询平均成绩大于65 的所有学生的学号、姓名和平均成绩
select s.sno,s.sname,avg(score) from student s inner join sc on s.sno=sc.sno group by s.sno,s.sname having avg(score)>65;
30、查询课程名称为“SSH”,且分数低于60 的学生姓名和分数
select s.sname,sc.score from sc inner join student s on s.sno=sc.sno inner join course c on c.cno=sc.cno where c.cname='SSH' and sc.score<60;
31、查询所有学生的选课情况;
select * from student s inner join sc on s.sno=sc.sno order by s.sno;
32、查询任何一门课程成绩在70 分以上的姓名、课程名称和分数;
select s.sname,c.cname,sc.score from student s inner join sc on sc.sno=s.sno inner join course c on c.cno=sc.cno group by s.sname,c.cname,sc.score having score>70;
33、查询学生不及格的课程,并按课程号从大到小排列
select * from sc where score<60 order by sno,cno desc;
34、查询课程编号为c001 且课程成绩在80 分以上的学生的学号和姓名;
select s.sno,s.sname from student s inner join sc on s.sno=sc.sno where sc.cno='c001' and score>80;
35、求选了课程的学生人数
select count(*) from student where sno in(select sno from sc group by sno);
36、查询选修“谌燕”老师所授课程的学生中,成绩最高的学生姓名及其成绩
select s.sname,score from student s inner join sc on s.sno=sc.sno inner join course c on c.cno=sc.cno inner join teacher t on t.tno=c.tno where t.tname='谌燕' order by score desc limit 1;
37、查询各个课程及相应的选修人数
select c.cno,c.cname,count(*) 选修人数 from sc inner join course c on sc.cno=c.cno group by c.cno,c.cname,c.tno;
38、查询不同课程成绩相同的学生的学号、课程号、学生成绩
select s.sno,s.sname,a.cno,a.score from student s inner join sc a on a.sno=s.sno inner join sc b on a.score=b.score where a.cno!=b.cno;
39、查询每门功课成绩最好的前两名
select s1.* from sc s1 where(select count(1) from sc s2 where s1.cno=s2.cno and s2.score>=s1.score)<=2 order by s1.cno desc;
40、统计每门课程的学生选修人数(超过2 人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
select cno 课程号,count(*) 选修人数 from sc group by cno having count(*)>2 order by count(*) desc,cno;
41、检索至少选修两门课程的学生学号
select sno from sc group by sno having count(*)>1;
42、查询全部学生都选修的课程的课程号和课程名
select c.cno,c.cname from sc inner join course c on c.cno=sc.cno group by c.cno,c.cname having count(*)=(select count(*) from course);
43、查询没学过“谌燕”老师讲授的任一门课程的学生姓名
select distinct s.sname from student s left join sc on s.sno=sc.sno left join course c on sc.cno=c.cno left join teacher t on t.tno=c.tno group by s.sno,s.sname,t.tname having t.tname !='谌燕' or t.tname is null;
44、查询两门以上不及格课程的同学的学号及其平均成绩
select sno,avg(score) from sc where score<60 group by sno having count(*)>1;
45、检索“c004”课程分数小于60,按分数降序排列的同学学号
select sno from sc where cno='c004' and score<60 order by score desc;
46、删除“s002”同学的“c001”课程的成绩
delete from sc where sno='s002' and cno='c001';