sql练习看这里,你想要的这里都有

一.基本知识点

Mysql中的连接分为四种种:内连接(inner join),全连接(full join),左连接(left join)和右连接(right join)
左右连接区别:
A left join B 的连接的记录数与A表的记录数同 ,也就是说包含A表的所有行,即使在右表中没有匹配的记录
A right join B 的连接的记录数与B表的记录数同 ,也就是说包含B表的所有行,即使在左表中没有匹配的记录
内连接和外连接区别:
inner join 就等于 join ,也称为等值连接,返回两张表都满足条件的部分
全连接是A表的所有行并上B表的所有行得出的结果集

二.leetcode实例

题目列表:
在这里插入图片描述

175. 组合两个表(简单)

在这里插入图片描述
SQL语句:
在这里插入图片描述

176. 第二高的薪水

题目如下:
在这里插入图片描述
SQL编写:
在这里插入图片描述
IFNULL函数
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。语法格式如下:IFNULL(expression, alt_value)。
如果第一个参数的表达式 expression 为 NULL,则返回第二个参数的值alt_value。

limit和offset用法
mysql里分页一般用limit来实现

  1. select * from student limit 1,3;
    如果limit后面跟两个参数,第一个参数表示要跳过的数量,第二个表示要读取的数量。这里表示跳过第一条记录,读取2,3,4条记录。
  2. select * from student limit 3;
    如果limit后面跟一个参数,指要读取多少条数据。这里表示直接读取前三条记录。
  3. select * from student limit 1 offset 2;
    如果limit和offset结合使用,offset后的表示要跳过几条数据,limit后面表示要取几条数据。这里表示跳过两条数据,取一条数据,也就是读取第3条记录。

DISTINCT:
在表中,可能会包含重复值,关键词 DISTINCT 用于返回唯一不同的值。也就是说,相同的值只会被在结果集中被列出一次。

这道题首先根据distinct关键字进行了去重,然后根据Salary将查询的记录进行了一个降序排序,之后用到IFNULL函数,如果表中只有一行记录,那么就不会有第二高的值,这时返回第二个值NULL;如果存在第二高的值就返回查询到的值,limit 1 offset 1,跳过最高的值,取第二行的记录,也就是第二高的值。

其实这个题目还有第二种sql写法,如下:
在这里插入图片描述
但是不能写成如下的模式:
在这里插入图片描述
有的同学可能就疑惑了,这两种sql语句不是一样的吗,为什么第二种不行?首先说下这两种区别,第二种是直接查询,第一种是将查询的结果作为一个临时表然后对临时表进行查询。下面直接去数据库看看两者运行的结果有什么不同。
如下图,把age当做本题的salary,可以看到只有一条记录,是不存在第二高的值
在这里插入图片描述
如下图,第一种方式的查询结果为NULL
在这里插入图片描述
如下图,是用第二种方式查询的,没有用到临时表,虽然没有报错,但是什么都查不出来,也不会返回NULL
在这里插入图片描述
本题中很明确的提示了,如果不存在第二高的薪水,那么查询应返回 null,所以只能用采用临时表的那种方式,或者IFNULL函数的。

177. 第N高的薪水

题目:该题和上面一题的思想一样
在这里插入图片描述
SQL编写:
在这里插入图片描述

178. 分数排名

题目即思路:
在这里插入图片描述
SQL语句编写:
在这里插入图片描述

180. 连续出现的数字

题目:
在这里插入图片描述
SQL语句编写:
在这里插入图片描述
思路:
从题目中可以看到,我们要得到的是连续出现过三次或者三次以上的数字,所以可以用三个表来找。当三个id连续,且Num值相等时,输出这个Num值,但是如果有四个id连续且Num值相等,那输出的结果有两个相等的Num,这不是我们想要的,我们期待的是输出一个就可以了,所以用distinct关键字去重

184. 部门工资最高的员工

题目:
在这里插入图片描述
SQL编写:
在这里插入图片描述
思路:
先根据DepartmentId分组找到每组中工资的最高值,然后查询两张表Department,Employee,当只有当部门Id是当前部门,工资和当前部门中最高值相等才输出。

185. 部门工资前三高的所有员工

题目:
在这里插入图片描述
SQL编写:
在这里插入图片描述

196. 删除重复的电子邮箱

题目:
在这里插入图片描述
SQL代码编写:
在这里插入图片描述

197. 上升的温度

题目:
在这里插入图片描述
SQL编写:
在这里插入图片描述
知识点:
DATEDIFF() 函数返回两个日期之间的天数。如果date1比date2大,那么datediff(date1,date2) = 1 就是指date1和date2相差一天,如果写成反了,datediff(date2,date1),那么结果就为-1了

183. 从不订购的客户

题目:
在这里插入图片描述
sql编写:
在这里插入图片描述
知识点:
in:表示在什么范围中
on:一般用作连接两个表的

181. 超过经理收入的员工

题目和sql语句如下图:
在这里插入图片描述

182. 查找重复的电子邮箱

题目与答案:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值