光学不练假把式,MySQL练习之SQL操作(持续更新)

前言

学习了几天的MySQL,发现只是看视频记笔记的话,很多内容根本记不住。即使记住一些,对于SQL命令也只是有一点模糊的概念,没有深刻的理解。前面一句是通常的理解,学了肯定要练习嘛。后面一句是练习之后发现的,本来不想写这篇笔记的,但是做题的时候发现自己对一些SQL语句的用法有了很多新的理解,想要写下来。

这里要贴一下题目的原帖经典SQL练习题MySQL版,然后有任何侵权的问题,希望告知,我会立即删帖,这方面我不是特别懂,所以希望大家能多给点意见,当然,理解不对的地方也希望大家能够不吝指教,多评论,谢谢大家

正文开始

----------------------------------------------------------分割线---------------------------------------------------------------------------------

原题1:用一条SQL 语句 查询出每门课都大于80 分的学生姓名

name course grade
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
select name from table group by name having min(grade) > 80

解析:首先分析题目

  1. 一条SQL语句
  2. 每门功课都大于80分
  3. 查询结果为学生的姓名

通过题目的信息可以知道,最后显示出来的只有一个字段,就是学生的姓名,所以语句前面一定是select name from table,然后是查询的条件——门功课都大于80分,显然我们需要把张三、李四、王五的成绩分别分组,然后对比它们的成绩对比是否满足条件。所以这里就要用到,并且是以学生的姓名进行分组的group by name,然后就是最后一步,这里需要画一个图比较好理解
在这里插入图片描述
这就是分组之后的逻辑结构,并且这样直接查询是没办法显示的。查询条件是没门成绩都大于80,grade中最小的值都比80大,所以用聚合函数min(grade)>80,题目就做完啦。

这里提一下where和having,为什么这里不用where而用having?

要回答这个问题,我们首先得知道having和where的区别:

1. having是where在分组之前进行限定,having在分组之后限定
2. where后不可以跟聚合函数的判断,having可以

根据分析这里用having。

原题2:现有学生表如下:

自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息

delete tablename where 自动编号 not in (
    select min( 自动编号) 
    from tablename 
    group by 学号, 姓名, 课程编号, 课程名称, 分数
)

解析:分析题目

  1. 数据表中,姓名为张三的学生中有一条重复数据。
  2. 删除这种住了自动编号不同,其他数据都相同的数据。

解析答案
这道题我自己没什么思路,就直接解析答案本身的含义吧。首先这是个删除的操作,所以前面的delete tablename where 删除条件没什么好说的。比较巧妙的是答案用了group by给数据分组,使得只要满足其他数据相同,而自动编号不同的数据就会被分到一个组,接着找保留最小的自动编码的那一条数据,接着将这些组成一个不重复的自动编号的集合,最后判断自动编码(因为重复的数据只有自动编码不同,所以删除的依据也只能用自动编码来判断),凡是不在集合中==(not in())==的数据就是冗余的数据,删除这些数据就可以完成这道题。

原题3:一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球队,现在四个球队进行比赛,用一条sql 语句显示所有可能的比赛组合

分析题目

  1. 一个字段name
  2. 4条数据a,b,c,d
  3. 一条sql
  4. 四条数据两两组合

解析答案
一开始不懂a.name和b.name是什么意思,后来看到后面team a,team b,才知道,这是分别给team 取了两个别名——a和b,然后一个表就成了两张表,a中的name字段和b中的name字段自由组合,也就是笛卡尔积,接着用字典序a.name>b.name去掉例如ab与ba这种重复组合与aa这种不存在组合的情况。

原题4:请用SQL 语句实现:从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。

请注意:TestDB 中有很多科目,都有1~12月份的发生额。
AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。
数据库名:JcyAudit ,数据集:Select * from TestDB

以后再更新吧,太难了,根本不是基础练习,以后更新吧,我得找点基础题目写了,抱歉了,我太难了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值