2021-10-21

数据库 分组及多表查询

create database ST
default character set=utf8
use ST
1、运行老师给出的脚本,创建实验所需的数据库ST,在ST数据库中创建教师表teacher。要求:teacher表包括tid(教师编号)、tname(教师姓名)、sex(性别)、title(职称),其中tid为int 类型主键,自动增长,tname为非空约束,sex 只能取“男”或“女”,默认值为“男”,职称取值为“教授”、“高级工程师”、“副教授”、“工程师”、“讲师”、“助教”,并任意插入两个教师信息。
create table teacher
(tid int primary key auto_increment,
tname varchar(10) not null,
sex enum('男','女') default '男',
title enum('教授','高级工程师','副教授','工程师','讲师','助教')
)
insert into teacher values(202101,'张华','男','教授')
,(202102,'王芳','女','高级工程师')
2、数据更新:在ST数据库中按要求进行数据更新
(1)使用SQL语句向Student表中插入元组(学号:201215111,姓名:张三,性别:男,年龄:17,所在系:ISinsert into student values('201215111','张三','男','17','IS')2)主键重复插入:向Student表中插入元组('201215123', '王慧敏', '女', '17', 'MA'),注意主键重复可以用on duplicate key updatereplace into实现 。
    desc student
    replace into student values('201215123', '王慧敏', '女', '17', 'MA')
(3)批量数据的插入:对每门课程,求学生的选课人数和学生的平均成绩,并把结果存入数据库,使用INSERT INTO实现。(提示:用INSERT INTO语句实现要求先创建一个课程选课情况表,包括课程名,选课人数,平均成绩字段,然后再用INSERT INTO语句实现数据的复制)
    create table coursegrade
    (coursename varchar(20) primary key,
      cnum int,
      avggrade int
     )
insert into coursegrade
select cname 课程名,count(*) 选课人数,avg(grade) 平均成绩
from course join sc
on course.cno=sc.cno
group by cname
select * from coursegrade
(4)在Student表中使用SQL语句将“李晨”的年龄改为20update student set sage=20 where sname='李晨'
select * from student where sname='李晨'5)在SC表中使用SQL语句将所有成绩不及格的学生成绩上浮10%select grade from sc where grade<60
update sc set grade=grade*1.1 
where grade<606)把成绩表中成绩后5名学生成绩加上10分。
update sc 
set grade=grade+10 
order by grade asc limit 57)删除成绩后3名的学生成绩
delete from sc
order by grade asc limit 38)把成绩最高的学生成绩下调5%update sc 
set grade=grade*0.95 
order by grade desc limit 1
3、在学生-课程数据库(ST)中用SQL语句完成以下查询:
(1)查找每个学生的学号、姓名,选修门数和平均分。
select sc.sno 学号,sname 姓名,count(*) 选修门数,avg(grade) 平均分
from student join sc
on student.sno=sc.sno
group by sc.sno,sname
(2)查找每门课程的课程号、课程名,平均分、最高分和最低分。
select sc.cno 课程号,cname 课程名,avg(grade) 平均分,Max(grade) 最高分,Min(grade) 最低分
from course join sc
on course.cno=sc.cno
group by sc.cno,cname
(3)求出至少被两名学生选修的课程名及其选修的人数;
select cname 课程名,count(*) 选修的人数
from course join sc
on course.cno=sc.cno
group by cname
having count(*)>24)查询至少选修了三门课程的学生姓名及其选修的门数;
select sname 姓名, count(*) 选修的门数
from student join sc
on student.sno=sc.sno
group by sname
having count(*)>35)查询学生的姓名,选修的课程名和该课程的成绩;
select sname,cname,grade
from  student join sc join course
on student.sno=sc.sno
and sc.cno=course.cno
(6)查找选修“离散数学”课程的学生姓名和离散数学的成绩
select sname,grade
from  student join sc join course
on student.sno=sc.sno
and sc.cno=course.cno
and cname='离散数学'7)查找数据库成绩前3名的学生姓名和数据库的成绩
select sname,grade
from  student join sc join course
on student.sno=sc.sno
and sc.cno=course.cno
and cname='数据库'
order by grade desc  limit 38)查询学号为201215121的学生的姓名及其选修的课程名及成绩;
select sname,cname,grade
from  student join sc join course
on student.sno=sc.sno
and sc.cno=course.cno
and sc.sno='201215121'9)查询选修了“信息系统”课程的学生学号和姓名;
select sc.sno,sname
from  student join sc join course
on student.sno=sc.sno
and sc.cno=course.cno
and cname='信息系统'10)找出成绩表SC中成绩后10名学生的姓名和成绩
select sname,grade
from  student join sc
on student.sno=sc.sno
order by grade asc limit 1011)查询所选修“数学”课程成绩大于90分的学生的姓名和该生“数学”课的成绩;
select sname,grade
from  student join sc  join course
on student.sno=sc.sno
and sc.cno=course.cno
and cname='数学'
and grade>9012)查询数据库课程的平均成绩;
select avg(grade) 数据库平均成绩
from sc join course
on sc.cno=course.cno
and cname='数据库'13)查询计算机系(CS)选修了3门以上课程的学生的学号和姓名;
select sc.sno,sname
from  student join sc
on student.sno=sc.sno
and sdept='CS'
group by sc.sno,sname
having count(*)>314)查询成绩第3名的学生姓名,第3名成绩对应的课程名和成绩;
select sname,cname,grade
from  student join sc  join course
on student.sno=sc.sno
and sc.cno=course.cno
order by grade desc limit 2,115)查询计算机系(CS)和信息系(IS)的学生姓名、性别和年龄;
select sname,ssex,sage
from  student
where sdept='CS' or sdept='IS'16)查询既不是计算机系又不是信息系的学生姓名;
select sname
from  student
where sdept !='CS' and sdept !='IS'17)查询姓“王”且全名为3个汉字的学生姓名;
select sname
from student
where sname like '王__'18)查询姓名以“明”字结尾的学生信息;(用正则表达式实现)
select sname
from student
where sname regexp '明$'19)查询姓名中含有两个“明”字的学生信息;(用正则表达式实现)
select sname
from student
where sname regexp '明{2}'20)查所有不姓“张”也不姓“李”的学生的姓名;
select sname
from student
where sname  not like '张%' and sname  not like '李%'21)查年龄为空值的学生的学号和姓名
select sno,sname
from student
where sage is null22)查询平均成绩最高的学生姓名和平均成绩;
select sname,avg(grade) 平均成绩
from  student join sc
on student.sno=sc.sno
group by sname
order by avg(grade) desc limit 123)查询年龄最大的学生信息;
select *
from  student 
order by sage desc limit 124)找出选修课程“信息系统”成绩最高的学生的学号;
select sc.sno
from  student join sc  join course
on student.sno=sc.sno
and sc.cno=course.cno
and cname='信息系统'
order by grade desc limit 125)查询数据库成绩最高的学生姓名;
select sname
from  student join sc  join course
on student.sno=sc.sno
and sc.cno=course.cno
and cname='数据库'
order by grade desc limit 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_48691931

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值