LeetCode刷题日记(一)

这篇博客记录了作者在LeetCode上进行SQL练习的经历,涉及了如何合并两个表、查找第N高的数据以及查找收入超过经理的员工。作者通过具体题目解析,介绍了外部联结(LEFT/RIGHT JOIN)、LIMIT和OFFSET的用法,以及在特定情况下使用IFNULL和DISTINCT函数。同时,文章比较了内部联结和自联结在效率上的差异,并强调了使用表别名的重要性。
摘要由CSDN通过智能技术生成

1.合并两个表
2.查找第N高的数据
3.查找第N高的数据
4.查找超过经理收入的员工
o( ̄▽ ̄)ブ

1.合并两个表
(第一次在leetcode刷SQL!疯狂合影咔咔咔
175题
许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。
例如,可能需要使用联结来完成以下工作:
 对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户;
 列出所有产品以及订购数量,包括没有人订购的产品;
 计算平均销售规模,包括那些至今尚未下订单的客户。
在上述例子中,联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结。
SELECT语句使用了关键字OUTER JOIN来指定联结的类型(而不是在WHERE子句中指定)。但是,与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字
指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。

SELECT FirstName,LastName,City,State
FROM Person LEFT OUTER JOIN Address
ON Person.PersonId = Address.PersonId;`

2.查找第2高的数据
176题
使用limit和offset
limit n字句表示查询结果返回前n条数据
offset n字句表示跳过n条语句
limit x offset y表示跳过y条数据返回前x条

例如寻找第二大的值,先进行降序排序,然后利用limit和offset跳过第一条返回前一条

如果遇到没有第N高的特殊情况,用ifnull函数
ifnull(a, b) 的含义是:
如果value1 值非空,则返回a;
如果value1 值空,则返回b

考虑到可能存在同样的值,用distinct去重

SELECT ifnull(    
(SELECT DISTINCT Salary    
FROM Employee    
ORDER BY Salary DESC    
LIMIT 1,1), null)as SecondHighestSalary

3.同2,查找第N高的值
177题(竟然超过了100%我好牛逼噻!
但要注意limit在存储中不能使用参数,要在RETURN之前,BEGIN之后
进行

SET n = N - 1
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN  
SET n = N - 1;  
RETURN (      # Write your MySQL query statement below. 
     SELECT ifnull(          
     (SELECT DISTINCT Salary          
     FROM Employee          
     ORDER BY Salary DESC          
     LIMIT n, 1 ), null
           )as NthHighestSalary  );
     END

4.超过经理收入的员工
第1题
解决一个问题需要使用表中有联系的两列,可以看做是将内容完全相同的两张表使用两次

这就涉及到一个知识点,即表别名,这样做有两个主要理由:
 缩短SQL语句;
 允许在单条SELECT语句中多次使用相同的表。
应该注意,表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机。
此外,这里还涉及到自联结,如前所述,使用表别名的主要原因之一是能在单条SELECT语句中不止一次引用相同表。查询中需要的两个表实际上是相同的表,即同一张表FROM子句中出现了两次。虽然这是完全合法的,但对同一张表的引用具有二义性,因为MySQL不知道你引用的是表中的哪个实例。为解决此问题,使用了表别名。

SELECT a.Name AS Employee
FROM Employee AS a, Employee AS b
WHERE  a.ManagerId = b.Id 
AND a.Salary > b.Salary

另一种方法,考虑到两张表相同,所以可以用内部联结来做,等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。

两个表之间的关系是FROM子句的组成部分,以INNER
JOIN指定。在使用这种语法时,联结条件用特定的ON子句不是WHERE子句给出。传递给ON的实际条件与传递WHERE的相同。(此处必须要用ON指出条件,不然会形成笛卡尔积

SELECT a.Name AS Employee
FROM Employee AS a INNER JOIN Employee AS b 
ON  a.ManagerId = b.Id 
AND a.Salary > b.Salary

此处惊讶的发现!!使用内部联结的效率远远高于使用自联结!!所以两种方式一定要对比着来~

第一天刷题准备到此为止啦★,°:.☆( ̄▽ ̄)/$:.°★ 。计划六点起来开刷但是很自然??的失败了,现在厨房里的香味已经超出了我的控制范围,我要不顾一切冲出去了!不过还是收获满满,甚至有点喜欢这种做题的感觉~坚持每天刷,时间能久一点更好,冲鸭!!盯着目标不动摇!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值