leetcode刷题笔记-MySQL

本文深入探讨SQL中各种连接类型(如INNER JOIN、LEFT JOIN、RIGHT JOIN和OUTER JOIN)的应用场景,并详解子查询与LIMIT子句在数据筛选与排序中的作用。通过具体案例,如查找第二高的薪水和超过经理收入的员工,展示如何利用SQL解决复杂的数据分析问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Eg175 组合两个表
  • 知识点: select … from table a (…) join table b on … = …
    • 1)INNER JOIN (内连接,或JOIN): 只连接匹配的行
      select * from table A inner join table B on A.key = B.key //内连接
    • 2)LEFT JOIN (左连接):包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
    • 3)RIGHT JOIN (右连接):包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
    • 4)OUTER JOIN (外连接): 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

由于题目要求:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:,所以应该用LEFT JOIN 才会返回table A 有 而 table B 无(值为Null)的行

select p.FirstName, p.LastName, a.City, a.State from Person p left join Address a on p.PersonId = a.PersonId;
Eg176 第二高的薪水

即:输出某列中第二大的数字

  • 知识点:
    1.limit子句可以被用于强制select语句返回指定记录数
    2.limit接受一个或两个整型参数
    3.第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目
    4.初始记录行的偏移量是0(不是1)
    5.为了与pgsql兼容,MySQL也支持语法 limit # offset #
    6.limit子句位于order by子句之后
  1. select distinct 可以保证元素不重复
  2. order by column 默认是升序排序,若需为降序,应为 order by column desc

方法一:
将该column的值降序(order by column desc),再限制(limit)从第1行后开始,仅输出1行(limit 1,1)

select distinct Salary SecondHighestSalary from Employee order by Salary desc limit 1,1

但是,当不存在第二高元素值时,上述并不返回null,与题目意思不符。
修正:

select (select distinct Salary  from Employee order by Salary desc limit 1,1) as SecondHighestSalary
Eg181. 超过经理收入的员工
select Name Employee
from Employee as e 
where Salary > (select 
Salary from Employee 
where
 Id = e.ManagerId)

±—±------±-------±----------+
| Id | Name | Salary | ManagerId |
±—±------±-------±----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | NULL |
| 4 | Max | 90000 | NULL |
±—±------±-------±----------+

分析:
数据库按照一行一行的模式对table进行扫描。现在目的是,对当前扫描的object,比较object.Salary 与 object.ManagerId 对应的Salary。如何保证,我第二次扫描的是上一次扫描的object.ManagerId呢?用实例对象e来指向。

Eg182 查找重复的邮箱

错误的想法:

select Email from Person.Personnel
where Email = any(select Email from Person.Personnel);
  • 1)any()表示若有任何一个满足就返回
    eg:
    elect * from student where 班级=’01’ and age > any (select age from student where 班级=’02’);
    就是说,查询出01班中,年龄大于 02班任意一个 的 同学
  • 2) 如果没有any() 会报错:Subquery returns more than 1 row

正确做法:

select Email from Person 
group by Email having 
count(Email) > 1
  • 1 )GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组
  • 2 )GROUP BY必须得配合聚合函数来用,分组之后你可以计数(COUNT),求和(SUM),求平均数(AVG)等。
Eg.196 删除重复的电子邮箱
delete p1 from Person p1, Person p2
where p1.Email = p2.Email and p1.Id > p2.Id 
  • 分析:
    from Person p1, Person p2即实例化两个对象p1,p2。这个对象是迭代的Person table的每条数据。实际上p1,p2都指向同一个对象(table Person)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值