语法
DELETE删除表中所需内容
删除表中满足特点条件的行:DELETE FROM 表名 WHERE 条件;
删除表中所有行:DELETE FROM 表名;
WHERE子句
WHERE
子句用于指定从表中选取记录的条件。允许筛选数据,只返回满足特定条件的记录。
WHERE
子句可以包含各种条件,这些条件可以基于一个或多个列的值。可以使用逻辑运算符(如
AND
、
OR
、
NOT
)来组合多个条件。后文示例可供提供and和not的用法。
子查询
子查询(Sub Query)或称为内查询(Inner Query)、嵌套查询(Nested Query),是SQL语言中一种常用的程序模块,用于在一个查询语句中嵌套另一个查询语句。当一个查询的结果是另一个查询的条件时,这个查询就被称为子查询。
- 子查询必须括在圆括号中。
- 子查询SELECT子句通常只有一个列,除非主查询中多个列与子查询中的列进行比较。
- 子查询不能直接使用ORDER BY,但可以在子查询中使用GROUP BY。
- 返回多行数据的子查询只能与多值操作符(如IN)一起使用。
需求
表:
Person
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
id 是该表的主键列(具有唯一值的列)。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
编写解决方案** 删除** 所有重复的电子邮件,只保留一个具有最小
id
的唯一电子邮件。
运行脚本后,显示的答案是
Person
表。驱动程序将首先编译并运行代码片段,然后再显示
Person
表。
Person
表的最终顺序 无关紧要 。
示例
**输入:**
Person 表:
+----+------------------+
| id | email |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+----+------------------+
**输出:**
+----+------------------+
| id | email |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
+----+------------------+
**解释:** [email protected]重复两次。我们保留最小的Id = 1。
分析
编写解决方案 删除 所有重复的电子邮件,只保留一个具有最小 id 的唯一电子邮件。
相当于删除所有id较大且重复的电子邮箱
仅提供一个Person表,包含id和email
可以直接作笛卡尔积,比较id大小和电子邮箱,删除所有id较大且相同的电子邮箱
通过where语句和and并列即可实现,where a.id>b.id and a.email=b.email
同样的思路,也可以通过子查询实现
通过子查询查找id最小的电子邮箱,
select min(id) as id from Person group by email
再通过where not in 剔除其他信息
where id not in
(
select id from
(
select min(id) as id
from Person
group by email
) u
)
代码
delete a
from Person a, Person b
where a.id>b.id and a.email=b.email
OR
delete from Person
where id not in
(
select id from
(
select min(id) as id
from Person
group by email
) a
)
版权归原作者 F_D_Z 所有, 如有侵权,请联系我们删除。