深入理解 DML 和 DQL:SQL 數據操作與查詢全解析

深入理解 DML 和 DQL:SQL 數據操作與查詢全解析

在數據庫管理中,SQL(結構化查詢語言)是操作和查詢數據的核心工具。其中,DML(Data Manipulation Language,數據操作語言)DQL(Data Query Language,數據查詢語言) 是最常用的子集。DML 負責數據的插入、更新和刪除,而 DQL 專注于數據查詢。本文將詳細講解 DML 和 DQL 的核心操作,包括 UPDATEDELETETRUNCATESELECT,以及相關函數和子句,結合示例幫助你快速上手。


一、DML:數據操作語言

DML 用于操作數據庫中的數據,主要包括以下操作:

  • 插入(INSERT):向表中添加新記錄。
  • 更新(UPDATE):修改表中已有記錄。
  • 刪除(DELETE):移除表中記錄。

以下重點講解 UPDATEDELETE,并深入分析 TRUNCATEDELETE 的區別。

1. UPDATE:修改數據

UPDATE 用于修改表中符合條件的記錄,語法如下:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • 作用:更新指定列的值。
  • 注意WHERE 子句指定更新的范圍,未指定會導致全表更新。
示例

假設有一個 student 表:

idnameage
1Alice20
2Bob22
3Charlie20

需求:將年齡為 20 的學生年齡改為 21。

UPDATE student
SET age = 21
WHERE age = 20;

結果

idnameage
1Alice21
2Bob22
3Charlie21

注意

  • 沒有 WHERE 子句時,UPDATE student SET age = 21; 會將所有記錄的 age 改為 21。
  • 建議先用 SELECT 查詢確認受影響的記錄。

2. DELETE:刪除數據

DELETE 用于刪除表中符合條件的記錄,語法如下:

DELETE FROM table_name
WHERE condition;
  • 作用:移除滿足條件的記錄。
  • 注意:不帶 WHERE 會刪除表中所有記錄。
示例

需求:刪除年齡小于 22 的學生。

DELETE FROM student
WHERE age < 22;

結果

idnameage
2Bob22

注意

  • 刪除后,表結構和索引保留,數據可通過事務回滾(如果在事務中)。
  • 自增列計數器行為因存儲引擎不同而異(詳見下文)。

3. TRUNCATE:清空表

TRUNCATE 用于完全清空表中的數據,語法如下:

TRUNCATE TABLE table_name;
  • 作用:刪除表中所有記錄,重置表到初始狀態。
  • 注意:無法指定條件,總是清空整個表。
示例

需求:清空 student 表。

TRUNCATE TABLE student;

結果

  • 表變為空,結構保留。
  • 自增列計數器重置為 1。

二、TRUNCATE 與 DELETE 的區別

TRUNCATEDELETE 都可以刪除數據,但有顯著差異。以下是詳細對比:

特性DELETETRUNCATE
刪除范圍可通過 WHERE 刪除部分記錄刪除整個表,無條件
速度較慢,逐行刪除,記錄日志更快,直接重建表結構
事務支持支持事務,可回滾不影響事務,無法回滾
自增列計數器不重置,保留上次值重置為 1
觸發器觸發 DELETE 觸發器不觸發觸發器
外鍵約束支持(受外鍵限制)不支持(表有外鍵時無法使用)
日志記錄記錄每行操作,占用日志空間僅記錄表結構變更,日志少

TRUNCATE 的優勢

  1. 速度快TRUNCATE 直接重建表結構,效率高于逐行刪除的 DELETE
  2. 重置自增列:適合需要重置主鍵計數器的場景(如測試環境清空數據)。
  3. 不影響事務:執行后不記錄逐行日志,節省日志空間。
  4. 低資源占用:適合快速清空大表。

DELETE 刪除后的行為(重啟數據庫)

DELETE 刪除數據后,自增列計數器的行為因存儲引擎不同而異:

  • InnoDB

    • 自增計數器存儲在內存中。

    • 重啟數據庫后,計數器從 1 重新開始。

    • 示例:

      CREATE TABLE test (id INT AUTO_INCREMENT PRIMARY KEY);
      INSERT INTO test VALUES (1), (2), (3);
      DELETE FROM test;
      INSERT INTO test VALUES (NULL); -- id = 1(重啟后)
      
  • MyISAM

    • 自增計數器存儲在文件中,持久化。

    • 重啟數據庫后,從上一個最大值繼續。

    • 示例:

      DELETE FROM test;
      INSERT INTO test VALUES (NULL); -- id = 4(繼續上一個值)
      
示例:DELETE vs TRUNCATE
-- 創建表
CREATE TABLE student (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),age INT
);
INSERT INTO student (name, age) VALUES ('Alice', 20), ('Bob', 22);-- DELETE
DELETE FROM student;
INSERT INTO student (name, age) VALUES ('Charlie', 21);
-- InnoDB 重啟后:id = 1;MyISAM:id = 3-- TRUNCATE
TRUNCATE TABLE student;
INSERT INTO student (name, age) VALUES ('Charlie', 21);
-- 無論引擎:id = 1

三、DQL:數據查詢語言

DQL 用于從數據庫中檢索數據,主要通過 SELECT 語句實現。以下講解 SELECT 的核心用法,包括簡單查詢、特定字段查詢、別名、去重和條件查詢。

1. 簡單單表查詢

查詢整個表
SELECT * FROM student;
  • 作用:返回 student 表的所有列和記錄。

  • 示例輸出

    (假設表如上):

    id | name    | age
    1  | Alice   | 20
    2  | Bob     | 22
    

注意* 適合快速查看,但生產環境中建議明確指定列以提高性能。

查詢特定字段
SELECT name, age FROM student;
  • 作用:只返回 nameage 列。

  • 示例輸出

    name    | age
    Alice   | 20
    Bob     | 22
    
給結果起別名

使用 AS 關鍵字為列或表達式指定別名:

SELECT name AS student_name, age AS student_age FROM student;
  • 輸出

    student_name | student_age
    Alice        | 20
    Bob          | 22
    

別名提高可讀性,常用在復雜查詢或報表生成中。

2. 函數:CONCAT

CONCAT 函數用于拼接字符串,語法如下:

SELECT CONCAT(column1, ' ', column2) AS result FROM table_name;
示例

需求:將學生的姓名和年齡拼接為一個字符串。

SELECT CONCAT(name, ' is ', age, ' years old') AS info FROM student;

輸出

info
Alice is 20 years old
Bob is 22 years old

注意

  • 不同數據庫對 CONCAT 的支持略有差異(如 MySQL 支持多參數,SQL Server 使用 +)。
  • 可結合其他函數(如 CAST)處理非字符串類型。

3. 去重:DISTINCT

DISTINCT 用于去除查詢結果中的重復行,語法如下:

SELECT DISTINCT column1, column2 FROM table_name;
示例

需求:查詢所有不同的年齡。

SELECT DISTINCT age FROM student;

假設數據

idnameage
1Alice20
2Bob22
3Charlie20

輸出

age
20
22

注意

  • DISTINCT 作用于整行(多列時考慮組合)。
  • 對性能有一定影響,盡量在必要時使用。

4. WHERE 條件子句

WHERE 用于過濾滿足條件的記錄,語法如下:

SELECT column1, column2
FROM table_name
WHERE condition;
示例

需求:查詢年齡大于 20 的學生。

SELECT name, age
FROM student
WHERE age > 20;

輸出

name | age
Bob  | 22

常見條件

  • 比較:=, >, <, >=, <=, !=
  • 邏輯:AND, OR, NOT
  • 范圍:BETWEEN ... AND ...
  • 集合:IN (value1, value2)
  • 模糊匹配:LIKE '%pattern%'
綜合示例

需求:查詢年齡為 20 或 22 的學生,拼接姓名和年齡,去重后顯示。

SELECT DISTINCT CONCAT(name, ' is ', age) AS info
FROM student
WHERE age IN (20, 22);

輸出

info
Alice is 20
Bob is 22
Charlie is 20

四、實際應用場景

  1. 數據清理
    • 使用 DELETE 移除無效記錄(如 WHERE created_date < '2020-01-01')。
    • 使用 TRUNCATE 重置測試環境數據。
  2. 數據更新
    • UPDATE 批量修改用戶信息(如 SET status = 'active' WHERE last_login > '2023-01-01')。
  3. 報表生成
    • SELECT 結合 CONCATDISTINCT 生成用戶統計報表。
    • 使用 WHERE 過濾特定條件的數據。

五、注意事項與優化技巧

  1. DML 操作
    • 事務管理DELETEUPDATE 應在事務中執行,確保可回滾。
    • 日志監控DELETE 操作可能導致日志文件過大,定期清理。
    • 備份:執行 TRUNCATE 前備份數據,因無法回滾。
  2. DQL 查詢
    • 索引優化:為 WHERE 條件中的列建立索引,提高查詢效率。
    • 避免 SELECT \*:明確指定列,減少不必要的數據傳輸。
    • 去重性能DISTINCT 可能影響性能,優先考慮業務邏輯去重。
  3. 存儲引擎選擇
    • InnoDB:適合事務密集場景,自增列需注意重啟行為。
    • MyISAM:適合讀多寫少場景,自增列更穩定。

六、總結

DML 和 DQL 是數據庫操作的核心組成部分:

  • DMLUPDATE, DELETE, TRUNCATE)用于修改和刪除數據,TRUNCATE 適合快速清空表,DELETE 提供更靈活的條件刪除。
  • DQLSELECT)通過 WHEREDISTINCTCONCAT 等功能實現精確查詢,滿足多樣化需求。

通過本文的講解和示例,你應該能熟練掌握這些操作,并在實際項目中靈活運用。如果有更多疑問或高級用法需求,歡迎在評論區交流!

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

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

相關文章

MongoDB數據庫的安裝到入門使用詳細講解

本篇文章主要講解MongoDB的安裝使用教程及基礎的數據庫管理和操作能力的講解,通過本篇文章您可以快速的掌握對MongDB數據庫的基本認識及,基礎開發能力。 一、MongoDB介紹 MongoDB是一款免費開源的非關系型數據庫,該數據庫適應于復雜關系的存儲和管理,非常適合數據結構復雜…

git提交實現文件或目錄忽略

前言 開發中使用git下載項目代碼開發,存在不需要提交文件或目錄&#xff0c;這里記錄下ideajava項目開發添加以下配置可忽略不需要提交文件,以方便我們提交代碼時&#xff0c;查看及提交文件只涉及項目代碼修改文件。 git提交實現文件或目錄忽略 .gitignore 文件的內容列出了在…

go語言的八股文

1.go語言觸發異常的場景有哪些 運行時錯誤 1.空指針解引用&#xff1a;嘗試訪問一個未初始化的指針指向的內存&#xff0c;會導致程序崩潰并觸發異常。 2.數組越界訪問&#xff1a;試圖訪問數組中不存在的索引&#xff0c;比如數組長度為5&#xff0c;卻嘗試訪問索引為10的元素…

Ubuntu安裝MySQL步驟及注意事項

一、安裝前準備 1. 系統更新&#xff1a;在安裝 MySQL 之前&#xff0c;確保你的 Ubuntu 系統軟件包是最新的&#xff0c;這能避免因軟件包版本問題導致的安裝錯誤&#xff0c;并獲取最新的安全補丁。打開終端&#xff0c;執行以下兩條命令&#xff1a; sudo apt update sudo …

【愚公系列】《Python網絡爬蟲從入門到精通》054-Scrapy 文件下載

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

2025最新︱中國信通院靜態應用程序安全測試(SAST)工具能力評估,懸鏡安全靈脈AI通過評估!

背景 研發運營安全&#xff08;DevSecOps&#xff09;從研發運營&#xff08;DevOps&#xff09;的概念延伸和演變而來&#xff0c;其核心理念是將安全貫穿從開發到運營的軟件開發生命周期的每一個環節&#xff0c;在每個階段自動實施安全措施&#xff0c;從而實現快速開發交付…

辛格迪客戶案例 | 浙江高跖醫藥委托生產質量管理協同(OWL MAH)項目

一、案例概述 浙江高跖醫藥科技股份有限公司是一家集“研、產、銷”為一體的專業化藥品持證企業。高跖醫藥自成立之初就建立并運行著一套相對完善的質量管理體系&#xff0c;涵蓋了藥品的研發、生產監管及銷售。高跖醫藥于2022年選擇實施了辛格迪的“委托生產質量管理協同解決…

【NLP 65、實踐 ? 基于Agent優化文章】

羈絆由我而起&#xff0c;痛苦也由我承擔 —— 25.4.18 一、?【核心函數】定義大模型調用函數 call_large_model prompt&#xff1a;用戶傳入的提示詞&#xff08;如 “請分析這篇作文的主題”&#xff09;&#xff0c;指導模型執行任務 client&#xff1a;Zhipu…

【鋰電池SOH估計】BP神經網絡鋰電池健康狀態估計,鋰電池SOH估計(Matlab完整源碼和數據)

目錄 效果一覽程序獲取程序內容研究內容基于BP神經網絡的鋰電池健康狀態估計研究摘要關鍵詞1. 引言1.1 研究背景1.2 研究意義1.3 研究目標2. 文獻綜述2.1 鋰電池SOH估計理論基礎2.2 傳統SOH估計方法2.3 基于BP神經網絡的SOH估計研究進展2.4 研究空白與創新點3. BP神經網絡原理3…

2025第十六屆藍橋杯python B組滿分題解(詳細)

目錄 前言 A: 攻擊次數 解題思路&#xff1a; 代碼&#xff1a; B: 最長字符串 解題思路&#xff1a; 代碼&#xff1a; C: LQ圖形 解題思路&#xff1a; 代碼&#xff1a; D: 最多次數 解題思路&#xff1a; 代碼&#xff1a; E: A * B Problem 解題思路&…

第十二節:原理深挖-React Fiber架構核心思想

鏈表結構、時間切片&#xff08;Time Slicing&#xff09; 優先級調度實現&#xff08;如用戶輸入>網絡請求&#xff09; React Fiber架構深度解析&#xff1a;從鏈表到優先級調度的革命性升級 一、Fiber架構核心設計思想 React Fiber是React 16的底層協調算法重構&#x…

你學會了些什么211201?--http基礎知識

概念 HTTP–Hyper Text Transfer Protocol&#xff0c;超文本傳輸協議&#xff1b;是一種建立在TCP上的無狀態連接&#xff08;短連接&#xff09;。 整個基本的工作流程是&#xff1a;客戶端發送一個HTTP請求&#xff08;Request &#xff09;&#xff0c;這個請求說明了客戶端…

MCU開發學習記錄8 - 基本定時器學習與實踐(HAL庫) - 定時器DMA循環模式修改ARR值、定時器中斷方式修改ARR值 - STM32CubeMX

名詞解釋&#xff1a; TRGO&#xff1a;Trigger Out General Purpose Output ARR&#xff1a;Auto-reload PSC&#xff1a;Prescaler CNT&#xff1a;Counter EGR&#xff1a;event generation register 本文將介紹基本定時器的概念、相關函數以及STM32CubeMX生成定時器的配置…

考研系列-計算機網絡沖刺考點匯總(上)

寫在前面 本文將總結王道408考研課程的計算機網絡沖刺考點的第一章到第三章內容&#xff08;計算機網絡體系結構、物理層、數據鏈路層&#xff09;。【圖片較多&#xff0c;加載需要時間&#xff0c;可以提前打開加載~~】 第一章、計算機網絡體系結構 注意&#xff1a;PCI(頭部…

設計模式每日硬核訓練 Day 14:組合模式(Composite Pattern)完整講解與實戰應用

&#x1f504; 回顧 Day 13&#xff1a;橋接模式小結 在 Day 13 中&#xff0c;我們學習了橋接模式&#xff08;Bridge Pattern&#xff09;&#xff1a; 用于將“抽象”與“實現”分離&#xff0c;適用于雙維度變化場景&#xff08;如圖形類型 渲染方式&#xff09;。它強調…

訊聯桌面TV版apk下載-訊聯桌面安卓電視版免費下載安裝教程

在智能電視的使用過程中&#xff0c;一款好用的桌面應用能極大提升我們的使用體驗。訊聯桌面 TV 版就是這樣一款備受關注的應用&#xff0c;它可以讓安卓電視擁有更個性化、便捷的操作界面。今天&#xff0c;就為大家詳細介紹訊聯桌面 TV 版 apk 的免費下載安裝教程。 一、下載…

Nginx知識點

Nginx發展歷史 Nginx 是由俄羅斯程序員 Igor Sysoev 開發的高性能開源 Web 服務器、反向代理服務器和負載均衡器 &#xff0c;其歷史如下&#xff1a; 起源與早期開發&#xff08;2002 - 2004 年&#xff09; 2002 年&#xff0c;當時 Igor Sysoev 在為俄羅斯門戶網站 Rambl…

uview1.0 tabs組件放到u-popup中在微信小程序中滑塊樣式錯亂

解決思路 重新計算布局信息&#xff1a;在彈窗顯示后重新調用 init 方法來計算組件的布局信息。使用 nextTick&#xff1a;保證在視圖更新之后再進行布局信息的計算。 <u-tabs ref"tabsRef" ></u-tabs> makeClick(){this.makeShowtruethis.$nextTick…

騰訊一面-軟件開發實習-PC客戶端開發方向

1.自我介紹就不多贅述了 2. 請介紹一下你的項目經歷 - 介紹了專輯鑒賞項目&#xff0c;前端使用html語言編寫&#xff0c;后端基于http協議使用C語言進行網頁開發。此外&#xff0c;還提及項目中涉及處理多線程問題以及做過內存池管理項目。 3. 項目中HTTP協議是使用庫實現的…

[數據可視化] Datagear使用心得:從數據整備到可視化聯動實踐

Datagear 是一款功能強大的數據可視化與報表工具&#xff0c;在日常數據分析與展示過程中&#xff0c;能有效幫助用戶構建交互式報表與面板。本文結合實際使用場景&#xff0c;總結了在 Datagear 平臺上關于元數據整備、Board 面板設計、圖表嵌入等方面的使用經驗&#xff0c;供…