一.基本知识点
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来实现
- select * from student limit 1,3;
如果limit后面跟两个参数,第一个参数表示要跳过的数量,第二个表示要读取的数量。这里表示跳过第一条记录,读取2,3,4条记录。 - select * from student limit 3;
如果limit后面跟一个参数,指要读取多少条数据。这里表示直接读取前三条记录。 - 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. 查找重复的电子邮箱
题目与答案:
|