不止是DELETE:MySQL多表關聯刪除的JOIN語法實戰詳解

MySQL 的 ??DELETE?? 語句用于從數據庫表中刪除記錄。這是一項非常強大且危險的操作,因為一旦執行,數據通常無法恢復。理解其語法和安全實踐至關重要。

以下是 MySQL 刪除語句的詳細指南。

一、 核心語法:DELETE

??DELETE?? 語句用于刪除表中的一行或多行記錄。

基本語法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name
[WHERE condition]
[ORDER BY ...]
[LIMIT row_count];
  • ??DELETE FROM table_name??: 指定要從哪個表刪除數據。
  • ??WHERE??: 極其重要! 指定哪些記錄需要被刪除。如果省略 ??WHERE??? 子句,將刪除表中的所有記錄!
  • ??ORDER BY???: 與 ??LIMIT?? 配合使用,指定先按什么順序排序,再刪除。
  • ??LIMIT??: 限制要刪除的記錄數量。

二、 刪除操作示例

假設我們有一個 ??users?? 表,結構如下:

id

username

email

status

1

alice

??alice@example.com?

inactive

2

bob

??bob@example.com?

active

3

charlie

??charlie@example.com?

inactive

4

david

??david@example.com?

active

  1. 刪除特定的記錄(帶 WHERE 條件)

刪除用戶名為 'charlie' 的記錄。

DELETE FROM users
WHERE username = 'charlie';

最佳實踐:盡量使用唯一性強的條件(如主鍵 ??id??)來精準定位要刪除的行,避免誤刪。

DELETE FROM users
WHERE id = 3;
  1. 刪除所有記錄(清空表)

刪除 ??users?? 表中的所有數據。

DELETE FROM users;

警告:這條語句會清空整個表,但表結構(列、索引等)依然存在。執行前必須萬分謹慎

  1. 使用 LIMIT 限制刪除數量

刪除最早注冊的 1 個狀態為 ??inactive?? 的用戶。

DELETE FROM users
WHERE status = 'inactive'
ORDER BY id ASC -- 按ID升序(假設ID越小注冊越早)
LIMIT 1;

三、 清空表:DELETE vs TRUNCATE

除了 ??DELETE??,MySQL 還提供了 ??TRUNCATE TABLE?? 語句來清空整個表。兩者有重要區別:

特性

??DELETE??

??TRUNCATE TABLE??

本質

DML操作(數據操作語言)

DDL操作(數據定義語言)

速度

較慢。逐行刪除,并在事務日志中記錄每一行。

極快。直接釋放存儲表數據的數據頁。

事務

支持。刪除操作可以被 ??ROLLBACK??

在大多數情況下(取決于存儲引擎),無法回滾

自增列

不會重置自增計數器(AUTO_INCREMENT)。下次插入的ID會繼續增長。

會重置自增計數器為初始值。下次插入的ID從 1 開始。

WHERE 條件

支持使用 ??WHERE?? 條件刪除部分數據。

不支持任何條件,只能清空整個表。

如何選擇?

  • 需要刪除特定記錄時,必須使用 ??DELETE ... WHERE ...??。
  • 需要快速清空整個表且不需要回滾時,使用 ??TRUNCATE TABLE??。
  • 需要清空整個表但可能需要回滾時,使用 ??DELETE FROM table_name??。

TRUNCATE 語法:

TRUNCATE [TABLE] table_name;
-- 示例
TRUNCATE TABLE users;

四、 多表刪除 (DELETE with JOIN)

你可以使用 ??JOIN?? 語法基于另一個表的條件來刪除本表的數據。這在處理有關聯的表時非常有用。

語法 1 (使用 DELETE ... JOIN):

DELETE t1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.foreign_key_id
WHERE t2.some_condition;

語法 2 (使用子查詢):

DELETE FROM table1
WHERE id IN (SELECT foreign_key_id FROM table2 WHERE some_condition);

示例: 假設還有一個 ??orders?? 表,存儲用戶的訂單。現在要刪除所有從未下過訂單的用戶。

-- 方法 1: 使用 LEFT JOIN 找到不存在的關聯
DELETE u
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.user_id IS NULL;-- 方法 2: 使用子查詢
DELETE FROM users
WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);

五、 安全注意事項與最佳實踐

1.備份先行 (Backup First) 在執行任何刪除操作,尤其是會影響大量數據的操作之前,務必進行數據備份。

使用 mysqldump 備份單表
mysqldump -u username -p database_name table_name > backup.sql

2.先 SELECT,后 DELETE 這是一個黃金法則。先用 SELECT 語句驗證 WHERE 條件是否正確匹配到了你想要刪除的數據。

-- 1. 先查詢,確認要刪除哪些數據
SELECT * FROM users WHERE status = 'inactive';-- 2. 確認結果無誤后,將 SELECT * 替換為 DELETE
DELETE FROM users WHERE status = 'inactive';

3.使用事務 (Transaction) 對于重要的刪除操作,最好在事務中執行。這樣如果發生錯誤,你可以回滾整個操作。

START TRANSACTION; -- 開始事務DELETE FROM orders WHERE date < '2020-01-01';
DELETE FROM users WHERE status = 'expired';
-- 此時可以檢查一下是否刪對了
SELECT * FROM users WHERE ...;ROLLBACK; -- 如果發現刪錯了,回滾,所有刪除操作取消
-- COMMIT; -- 如果確認無誤,提交事務,使刪除生效

4.權限控制 在生產數據庫中,嚴格限制擁有 DELETE 權限的用戶數量。永遠不要給應用程序賬戶過高的權限。

另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導出導入。可本地連接LINUX里的MYSQL,簡單便捷。可以大大地提高工作效率喔。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98585.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98585.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu 系統使用過程中黑屏問題分析

背景&#xff1a; 工欲善其事&#xff0c;必先利其器。作為程序員&#xff0c;想要得到更好的發展&#xff0c;遇到問題直接baidu, google 雖然可以得到一些參考或者答案&#xff0c;但是也會降低自己的思考能力&#xff0c;本文以ubuntu 使用過程中黑屏這一問題為背景&#x…

Redis(45)哨兵模式與集群模式有何區別?

Redis 提供了兩種高可用性解決方案&#xff1a;哨兵模式和集群模式。它們各自有不同的特點和適用場景。以下是詳細的對比和結合代碼的示例&#xff1a; 哨兵模式&#xff08;Sentinel&#xff09; 特點高可用性&#xff1a; Sentinel 通過監控、通知、故障轉移等功能&#xff0…

微信小程序如何進行分包處理?

目錄 分包是什么&#xff1f; 為什么要分包&#xff1f; 分包前后結構對比 具體操作步驟 第 1 步&#xff1a;規劃分包結構 第 2 步&#xff1a;修改 app.json 進行配置 第 3 步&#xff1a;創建分包目錄并移動文件 第 4 步&#xff1a;處理組件和工具函數的引用 第 5…

Go語言極速入門與精要指南從零到精通的系統化學習路徑

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

git 切換倉庫后清理分支緩存

我明白了&#xff0c;從您的截圖可以看到遠程倉庫中有 feature/v1.4_20250903 分支&#xff0c;但本地 git branch -r 看不到&#xff0c;這是因為之前更換過倉庫地址后需要重新獲取遠程倉庫的所有信息。讓我們執行以下步驟來解決這個問題&#xff1a; 首先執行 git fetch --al…

考研倒計時101天---路由選擇協議

路由選擇協議&#xff1a;RIP 與 OSPFRIP 協議&#xff08;基于距離向量算法&#xff09;RIP&#xff08;Routing Information Protocol&#xff09;是一種內部網關協議&#xff08;IGP&#xff09;&#xff0c;采用距離向量算法進行路由選擇。其主要特點如下&#xff1a;工作機…

「類 vs 實例」對比 ,「類 - 原型 - 實例」的關系

堅持的本身就是意義 目錄直觀類比類 (Class) vs 實例 (Instance)對比表示例代碼類 - 原型 - 實例關系圖解釋&#xff1a;類 (class Person)原型 (Person.prototype)實例 (new Person(...))總結&#xff1a;直觀類比 類&#xff08;Class&#xff09; 圖紙 / 模板實例&#xf…

第一課、Cocos Creator 3.8 安裝與配置

介紹說明 本文主要介紹在windows系統中&#xff0c;安裝開發Cocos使用的軟件工具&#xff0c;主要包含&#xff1a;安裝CocosDashboard控制面板、CocosCreator3.8編輯器和腳本編輯器 VS Code 。 一、Cocos Dashboard 的安裝 說明&#xff1a;Cocos Dashboard 主要作用是能夠同…

從航空FACE的一個落地方案漫談汽車HPC軟件架構的思維轉變(2/3)FACE的“段”同Autosar的“層”概念區別探索

文章目錄PART THREE&#xff1a;段和層的概念比較一、“段”更強調“功能閉環責任歸屬”&#xff0c;而非“單純的層級堆疊”二、“段”規避“層”的“剛性依賴陷阱”&#xff0c;適配航空系統的“靈活組合需求”三、“段”貼合航空工業的“工程化語言習慣”&#xff0c;降低跨…

金融量化指標--6InformationRatio信息比率

InformationRatio信息比率計算公式添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09;一、信息比率&#xff08;IR&#xff09;是什么&#xff1f;核心概念&#xff1a;信息比率衡量的是投資組合經理相對于某個基準指數&#xff08;Benchmark&#xff09;&…

Java全棧開發面試實錄:從基礎到微服務的實戰經驗分享

Java全棧開發面試實錄&#xff1a;從基礎到微服務的實戰經驗分享 一、初識面試場景 我叫李明&#xff0c;28歲&#xff0c;畢業于復旦大學計算機科學與技術專業&#xff0c;碩士學歷。在互聯網行業已經有5年的工作經驗&#xff0c;先后在兩家中型互聯網公司擔任Java全棧開發工程…

【51單片機】【protues仿真】基于51單片機公交報站系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 主要功能如下&#xff1a; 1、LCD12864顯示時間、日期、公交車車站、溫度等 2、按鍵設置時間&#xff0c;顯示公交車信息 3、串口播報相應站點信息 4、按鍵控制上行、下行、手動播…

第1節-PostgreSQL入門-從表中查詢數據

摘要&#xff1a;在本教程中,你將學習如何使用 PostgreSQL 的 SELECT 語句從表中檢索數據。 SELECT 語句 要從表中查詢數據,需使用 PostgreSQL 的 SELECT 語句。 以下是 SELECT 語句的基本語法: SELECT column1, column2, ... FROM table_name;在這種語法中: 首先,在 SELECT 關…

【C++進階】---- map和set的使用

1.序列式容器和關聯式容器 前?我們已經接觸過STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;這些容器統稱為序列式容器&#xff0c;因為邏輯結構為線性序列的數據結構&#xff0c;兩個位置存儲的值之間?般沒有緊密的關聯關系…

430章:Python Web爬蟲入門:使用Requests和BeautifulSoup

在軟件交付日益高頻、用戶需求快速迭代的今天&#xff0c;版本發布流程的規范性直接決定了團隊的交付效率、產品質量和用戶滿意度。然而&#xff0c;許多團隊仍面臨以下痛點&#xff1a;發布混亂&#xff1a;分支管理隨意&#xff0c;代碼沖突頻發&#xff1b;質量失控&#xf…

代碼隨想錄第七天|● 454.四數相加II ● 383. 贖金信 ● 15. 三數之和 18.四數之和

本文所有題目鏈接/文章講解/視頻講解&#xff1a;https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html 454.四數相加II 有四個數組&#xff0c;如果要遍歷則時間復雜度太大 可以選擇分組&#xff0c;a和b一組&#xff0c;c和d一組 這樣就可以等同于…

Vue3源碼reactivity響應式篇之computed計算屬性

概述 vue3中&#xff0c;computed函數用于表示計算屬性&#xff0c;有惰性求值、響應式追蹤依賴的特點。本文將介紹computed的實現原理以及其機制細節。 源碼解析 computed計算屬性和computed方法、ComputedRefImpl類以及refreshComputed方法有關。 computed方法 computed暴露給…

[嵌入式embed]Keil5燒錄后STM32不自動運行,復位才能運行

[嵌入式embed]Keil5燒錄后STM32不自動運行,復位才能運行Keil5-驗證“Reset and Run”功能是否生效參考文章Keil5-驗證“Reset and Run”功能是否生效 參考文章 Keil5燒錄后STM32不自動運行&#xff1f;必須復位才能啟動的終極解決方案

阿里云Qwen3系列模型部署微調評測

與阿里云一起輕松實現數智化讓算力成為公共服務&#xff1a;用大規模的通用計算&#xff0c;幫助客戶做從前不能做的事情&#xff0c;做從前做不到的規模。讓數據成為生產資料&#xff1a;用數據的實時在線&#xff0c;幫助客戶以數據為中心改變生產生活方式創造新的價值。模型…

北京魯成偉業 | 三屏加固筆記本電腦C156F3

在工業控制、應急指揮、測控及無人機作業等對設備穩定性與環境適應性要求較高的領域&#xff0c;一款性能均衡且堅固耐用的計算機往往能為工作效率提供有力支撐。三屏加固筆記本電腦C156F3便是針對這類需求設計的設備&#xff0c;憑借多方面的特性&#xff0c;可滿足不同場景下…