- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
描述
编写一个 SQL 语句,来删除 contacts 表中所有重复的姓名,重复的姓名里只保留 id 最小的那个。
表定义: contacts (联络表)
| 列名 | 类型 | 注释 |
|---|---|---|
| id | int unsigned | 主键 |
| name | varchar | 姓名 |
**
使用 delete 语句 执行你的 SQL 语句之后,返回的是整个 contacts 表 我们会单独验证数据库中的数据是否都被修改为如下的信息。
样例
样例一:
表内容: contacts
| id | name |
|---|---|
| 1 | Song Jiang |
| 2 | Lu Junyi |
| 3 | Wu Yong |
| 4 | Song Jiang |
| 5 | Wu Yong |
| 6 | Lin Chong |
在运行你的 SQL 语句之后,上面的 contacts 表应返回以下几行:
| id | name |
|---|---|
| 1 | Song Jiang |
| 2 | Lu Junyi |
| 3 | Wu Yong |
| 6 | Lin Chong |
样例二:
表内容: contacts
| id | name |
|---|---|
| 1 | Song Jiang |
| 2 | Lu Junyi |
| 3 | Wu Yong |
| 4 | Song Jiang |
在运行你的 SQL 语句之后,上面的 contacts 表应返回以下几行:
| id | name |
|---|---|
| 1 | Song Jiang |
| 2 | Lu Junyi |
| 3 | Wu Yong |
题解
mysql delete:
DELETE FROM table_name [WHERE Clause]
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
- 你可以在 WHERE 子句中指定任何条件
- 可以在单个表中一次性删除记录。
仔细看本题的要求:重复的姓名里只保留 id 最小的那个,所以这里只要找到最小的id,然后不是最小id的数据直接删除就可以了。因为id是主键,不必担心有重复的id. 思路:首先使用group by 按照姓名分组,然后使用min函数找到最小的id。最后使用delete进行删除。这里使用的not in 来判断是不是最小的id。
delete from contacts
where id not in (
select *
from (
select min(id)
from contacts
group by name
)
)