Mysql练习题01

今天闲来无事,在Leetcode上写了几道Mysql的练习题,发现自己编写Sql的能力几乎为0

  • 175组合两个表
    这个题目练习的就是left join、inner join、right join
    left join:左连接的结果就是左表中的所有记录,右表中没有的字段全部是NULL
    right join:右连接的结果就是右表中的所有记录,左表中没有的字段全部用NULL填充
    inner join:内连接的结果是两张表中都要有的
    请添加图片描述
    请添加图片描述
    teacher表和address表如上所示
    left join的结果
select FirstName,LastName,city,state
from teacher left join address
on teacher.personid = address.personid;

请添加图片描述
right join的结果

select FirstName,LastName,city,state 
from teacher right join address 
on teacher.personid = address.personid

请添加图片描述
inner join的结果

select FirstName,LastName,city,state 
from teacher 
inner join address on teacher.personid = address.personid

请添加图片描述

  • 176第二高的薪水
    这个题目在理解上会存在歧义(第二高的薪水不是排名第二的薪水),例如,第一名的薪水是100,第二名的薪水也是100,那这个表里面就不存在第二高的薪水!
    根据题意,我们使用一个ifNull的函数,如果不存在那我们就返回null
    Employee表
    请添加图片描述
    请添加图片描述
    对应的结果
    请添加图片描述
    请添加图片描述
select
ifNull(
    (select distinct salary
     from Employee
     order by salary desc
     limit 1,1),NULL)
AS SecondHighestSalary

limit关键字

 - limit x,y——从索引为x的记录开始取y条数据(数据库的索引是从0开始的)
 - limit x offset y——从索引为y的记录开始取x条数据
 - limit x——从索引0开始取x条数据
  • 177.第N高的薪水
    这个和第176很像,这里我们换一种写法
    group by可以起到去重的作用
    order by按照薪水降序排序
    limit N,1 从索引为N的记录开始取一条就是取索引为N的数据
    set N := N-1;第一高的薪水就是索引0,第二高的薪水就是索引1…
    输入
    请添加图片描述
    结果
    请添加图片描述
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    set N := N-1;
  RETURN (
      # Write your MySQL query statement below.
      select salary
      from employee
      group by salary
      order by salary desc
      limit N,1
  );
END
  • 178.分数排名
    这个题目是用到了mysql中的窗口函数 RANK()函数
    RANK()——存在相同的位次会跳过 1,1,1,4这种
    DENSE_RANK()——存在相同的位次不会跳过之后的位次 1,1,1,2,2,3这样的
    ROW_NUMBER()——给予唯一的连续位次,1,2,3,4这种
    请添加图片描述
select id,money,dense_rank() over (order by money) as 'rank' from student;

请添加图片描述

select id,money,rank() over (order by money) as 'rank' from student;

请添加图片描述

select id,money,row_number() over (order by money) as 'rank' from student;

请添加图片描述
数据库的练习还是要抓一抓的!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值