目錄
語法
需求
示例
分析
代碼
語法
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 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
±—±-----------------+
輸出:
±—±-----------------+
| id | email |
±—±-----------------+
| 1 | john@example.com |
| 2 | bob@example.com |
±—±-----------------+
解釋: john@example.com重復兩次。我們保留最小的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
)