196. 删除重复的电子邮箱
表: Person
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
id 是该表的主键列(具有唯一值的列)。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
sql
# Write your MySQL query statement below
DELETE FROM Person
WHERE id NOT IN (
SELECT min_id
FROM (
SELECT MIN(id) AS min_id
FROM Person
GROUP BY LOWER(email)
) t
)
在 SQL 查询中,子查询可以作为一个临时表来使用。t 是给这个临时表起的别名。
在上述查询中,内部的子查询使用了别名 t 来表示结果集。通过为子查询结果集指定一个别名,我们可以在外部查询中引用该别名来访问子查询的结果。
这样做的好处是,我们可以在外部查询中对子查询的结果进行进一步的处理,例如使用 NOT IN 子句来过滤不在子查询结果中的记录。
1407. 排名靠前的旅行者
表:Users
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
id 是该表中具有唯一值的列。
name 是用户名字。
表:Rides
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| user_id | int |
| distance | int |
+---------------+---------+
id 是该表中具有唯一值的列。
user_id 是本次行程的用户的 id, 而该用户此次行程距离为 distance 。
编写解决方案,报告每个用户的旅行距离。
返回的结果表单,以 travelled_distance 降序排列 ,如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列 。
sql
SELECT Users.name, COALESCE(SUM(Rides.distance), 0) AS travelled_distance
FROM Users
LEFT JOIN Rides ON Users.id = Rides.user_id
GROUP BY Users.id, Users.name
ORDER BY travelled_distance DESC, Users.name ASC;
这条查询语句使用了左连接(LEFT JOIN)将两张表关联起来,并通过 GROUP BY 子句按用户 id 和名称分组。使用 COALESCE 函数将 NULL 值转换为 0,以处理没有行程记录的情况。最后,按 travelled_distance 降序和 name 升序进行排序。
197. 上升的温度
SQL Schema
表: Weather
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| recordDate | date |
| temperature | int |
+---------------+---------+
在 SQL 中,id 是该表的主键。
该表包含特定日期的温度信息
找出与之前(昨天的)日期相比温度更高的所有日期的 id 。
返回结果 无顺序要求 。
sql
# Write your MySQL query statement below
SELECT
t1.id
FROM
Weather t1
JOIN
Weather t2
ON
t1.recordDate = DATE_ADD(t2.recordDate, INTERVAL 1 DAY)
WHERE
t1.Temperature > t2.Temperature;
577. 员工奖金
选出所有 bonus < 1000 的员工的 name 及其 bonus。
Employee 表单
+-------+--------+-----------+--------+
| empId | name | supervisor| salary |
+-------+--------+-----------+--------+
| 1 | John | 3 | 1000 |
| 2 | Dan | 3 | 2000 |
| 3 | Brad | null | 4000 |
| 4 | Thomas | 3 | 4000 |
+-------+--------+-----------+--------+
empId 是这张表单的主关键字
Bonus 表单
+-------+-------+
| empId | bonus |
+-------+-------+
| 2 | 500 |
| 4 | 2000 |
+-------+-------+
empId 是这张表单的主关键字
输出示例:
+-------+-------+
| name | bonus |
+-------+-------+
| John | null |
| Dan | 500 |
| Brad | null |
+-------+-------+
sql
# Write your MySQL query statement below
SELECT
Employee.name, Bonus.bonus
From
Employee
LEFT JOIN
Bonus
ON
Employee.empId = Bonus.empId
WHERE
Bonus.bonus < 1000 OR Bonus.bonus IS null;