MySQL数据库查询练习(二)

MySQL数据库查询练习

练习01(行转列):

行转列:

有一张学生成绩表sc(sno学号,clazz课程,score成绩),需要查询出每个学生的语文,数学,英语成绩(行转列,一个学生只要一行记录)。
在这里插入图片描述
查询得到如下结果:
在这里插入图片描述
方法一:

-- 行转列
select distinct a.sno, 
(select score from sc b where a.sno = b.sno and b.clazz = '语文') as '语文',
(select score from sc b where a.sno = b.sno and b.clazz = '数学') as '数学',
(select score from sc b where a.sno = b.sno and b.clazz = '英语') as '英语' from sc a;

方法二:

-- 行转列 用max()
select sno,
max(case clazz when '语文' then score end) '语文',
max(case clazz when '数学' then score end) '数学',
max(case clazz when '英语' then score end) '英语' 
from sc group by sno;

这里再加一个条件:汇总每个学生的总分,为了适应特殊情况,我将原表进行了改动:
在这里插入图片描述
得到如下结果:
在这里插入图片描述

-- 加一个条件进行汇总每个学生的总分 sum()
select sno,
sum(case clazz when '语文' then score else 0 end)'语文',
sum(case clazz when '数学' then score else 0 end)'数学',
sum(case clazz when '英语' then score else 0 end)'英语',
sum(score)'总分' 
from sc group by sno;

练习02(字符串函数):

给一张楼号和门牌号的销售表,查询楼号和单元号:
在这里插入图片描述
运用字符串函数进行查询:

-- 查询
select * from sales;
-- 检索-的位置
select locate('-',snum) from sales;
-- 查询每个的楼号
select snum,left(snum,locate('-',snum) - 1) from sales;
-- 查询每个门牌号
-- 这里注意,一个字符串长度的问题 上方left可以,但是如果用right也是一样的函数方法就行出现错误
select snum,right(snum,locate('-',snum) + 1) from sales;-- 错误!!!因为这里会出现漏掉或者多出符号的情况

如下会有少一个字符或者多一个‘-’符号的情况,因为这里right是从最后面开始算,所以会进行多算或者少算是情况;
在这里插入图片描述
所以正确的是,这里有个规律:
在这里插入图片描述

-- 所以这里有个规律 8-502:【总长度-2】   8-1202:【总长度-2】  12-502:【总长度-3】
select snum,right(snum,length(snum) - locate('-',snum)) from sales;
select snum,convert(right(snum,length(snum)-locate('-',snum)),signed) from sales;
-- 也可以使用字段切割,把符号‘-’后面的门牌号切割出来
-- substr(str,pos) 或者 substr(str from pos):从pos开始的位置,一直截取到最后。
-- 还有一种比较常用的是:
-- substr(str,pos,len) 或者 substr(str from pos len);从pos开始的位置,截取len个字符(空白也算字符)。
select snum,convert(substr(snum,locate('-',snum)+1),signed) from sales;
-- 查询后按照楼号排序
select * from sales order by convert(LEFT(snum,locate('-',snum)-1),signed);
-- 楼号从小到大,在按照门牌号从大到小排序
select * from sales order by convert(LEFT(snum,locate('-',snum)-1),signed ),
convert( substr(snum,locate('-',snum)+1),signed)  desc;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、建立以下五个: 教师:Teacher,学生:Student, 课程:Course,选课SC,授课:TC 、完成以下查询: 1.查询成绩在80-90之间的记录。 2.查询至少4个同学选修的课程名。 3.查询其他系中比“信息系”所有学生年龄都大的学生名单及年龄,并按年龄降序输出: 4.查询与学生张建国同岁的所有学生的学号。姓名和系别。 5.查询选修了2门以上课程的学生名单。 6.查询至少有一门与“张建国”选课相同的学生的姓名,课程号,系别 7.查询成绩比该课程平均成绩高的学生的成绩。 8.查询选课号为01001课程且成绩高于课程01002学生的姓名,此两门课的课程名和成绩。 9.查询所有没选修01001号课程的学生名单 10、查询每个同学各门课程的平均成绩和最高成绩,按降序输出姓名、平均成绩、最高成绩; 11、查询所有学生都选修了的课程号和课程名; 12、查询选修了991102号学生选修了的课程的学生学号和姓名。 三、使用SQL创建视图,修改记录 1.创建成绩视图SCORE_VIEW,包含学号sno,姓名sn,课程名cn,成绩score; 2.创建一个计算机系学生名单视图S_VIEW,包含学号sno,姓名sn,性别sex; 3.通过上面的视图,修改学号为991102,课程号01001的成绩记录; 4,创建一个视图,计算机系学生的成绩单score_view_CDEPT,包含学号sno,姓名sn,课程名cn,成绩score
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值