Leetcode-sql刷题


第一题:

表1: Person

因为表 Address 中的 personId 是表 Person 的外关键字,所以我们可以连接这两个表来获取一个人的地址信息。

考虑到可能不是每个人都有地址信息,我们应该使用 outer join 而不是默认的 inner join。
注意:如果没有某个人的地址信息,使用 where 子句过滤记录将失败,因为它不会显示姓名信息。


第二题:

然而,如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,我们可以将其作为临时表。

为什么使用临时表能解决null值问题

select NULL

返回null值


第三题:

表格里存有每个雇员经理的信息,我们也许需要从这个表里获取两次信息。


SELECT *
FROM Employee AS a, Employee AS b
;

从两个表里使用 Select 语句可能会导致产生 笛卡尔乘积 。在这种情况下,输出会产生 4*4=16 个记录。然而我们只对雇员工资高于经理的人感兴趣。所以我们应该用 WHERE 语句加 2 个判断条件。


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

实际上, JOIN 是一个更常用也更有效的将表连起来的办法,我们使用 ON 来指明条件。


SELECT
     a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
     ON a.ManagerId = b.Id
     AND a.Salary > b.Salary
;


第四题:

来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

delete p1 from person p1,person p2 where p1.email=p2.email and p1.id>p2.id;

又是弄了两个表


第五题:

给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。

SELECT
    weather.id AS 'Id'
FROM
    weather
        JOIN
    weather w ON DATEDIFF(weather.date, w.date) = 1
        AND weather.Temperature > w.Temperature
;

DATEDIFF(a,b) a-b=1


 

你可能感兴趣的:(leetcode,sql)