最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL DML 操作(CRUD)總結(jié)

 更新時間:2026年07月06日 09:35:20   作者:崢無  
本文全面講解 MySQL 核心的 CRUD 增刪改查操作,是數(shù)據(jù)庫入門必備教程,結(jié)合實戰(zhàn)案例詳解 INSERT 插入、SELECT 查詢、UPDATE 修改、DELETE 刪除四大核心語句,下面就來詳細的介紹一下

本文基于 MySQL 8.0 編寫,全面講解數(shù)據(jù)表增(Create)、查(Retrieve)、改(Update)、刪(Delete) 核心語法、實戰(zhàn)案例、易錯點、執(zhí)行順序。

一、前言:什么是 CRUD

數(shù)據(jù)庫最核心的四大操作簡稱 CRUD,對應(yīng)日常數(shù)據(jù)管理所有場景:

英文中文對應(yīng) SQL 操作
Create新增數(shù)據(jù)INSERT
Retrieve查詢數(shù)據(jù)SELECT(使用頻率最高)
Update修改數(shù)據(jù)UPDATE
Delete刪除數(shù)據(jù)DELETE / TRUNCATE

前置準備:本文所有案例統(tǒng)一使用兩張測試表,先執(zhí)行建表語句,后續(xù)案例均基于此表操作。

-- 學(xué)生表:存儲學(xué)生基礎(chǔ)信息
CREATE TABLE students (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵ID,自增',
    sn INT NOT NULL UNIQUE COMMENT '學(xué)號,唯一約束',
    name VARCHAR(20) NOT NULL COMMENT '姓名',
    qq VARCHAR(20) COMMENT 'QQ號,允許為空'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 成績表:存儲學(xué)生考試成績(核心查詢案例表)
CREATE TABLE exam_result (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵ID',
    name VARCHAR(20) NOT NULL COMMENT '學(xué)生姓名',
    chinese FLOAT DEFAULT 0.0 COMMENT '語文成績',
    math FLOAT DEFAULT 0.0 COMMENT '數(shù)學(xué)成績',
    english FLOAT DEFAULT 0.0 COMMENT '英語成績'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 給成績表插入測試數(shù)據(jù)
INSERT INTO exam_result (name, chinese, math, english)
VALUES 
('張三', 67, 98, 56),
('李四', 87, 78, 77),
('王五', 88, 98, 90),
('趙六', 82, 84, 67),
('錢七', 55, 85, 45),
('孫八', 70, 73, 78),
('周九', 75, 65, 30);

二、數(shù)據(jù)新增:INSERT(Create)

2.1 基礎(chǔ)語法

-- 標準語法,INTO 可省略
INSERT [INTO] 表名 
[(字段1, 字段2, ...)] 
VALUES (值1, 值2, ...), (值1, 值2, ...);

規(guī)則:

  1. 字段列表 和 VALUES 值列表 數(shù)量、順序、數(shù)據(jù)類型必須一一對應(yīng);
  2. 自增主鍵、默認值字段可省略不寫,MySQL 自動填充;
  3. 支持單行插入多行批量插入(多行插入效率遠高于多次單行插入)。

2.2 分類實戰(zhàn)案例

2.2.1 全列插入(不指定字段)

不寫字段列表,代表給表中所有字段按順序賦值,自增主鍵也需要手動指定值。

-- 單行全列插入
INSERT INTO students VALUES (1, 1001, '張三', '123456');
-- 多行全列插入
INSERT INTO students VALUES 
(2, 1002, '李四', '654321'),
(3, 1003, '王五', NULL); -- QQ為空,使用 NULL

2.2.2 指定列插入(推薦用法)

只給部分字段賦值,未指定字段會使用默認值/自增規(guī)則,日常開發(fā)最常用。

-- 僅插入學(xué)號、姓名,id自增、qq默認為NULL
INSERT INTO students (sn, name) 
VALUES (1004, '趙六'), (1005, '錢七');

2.2.3 插入沖突處理(主鍵/唯一鍵重復(fù))

當(dāng)主鍵(PRIMARY KEY)唯一鍵(UNIQUE) 重復(fù)時,直接插入會報錯 Duplicate entry,MySQL 提供兩種解決方案。

方案1:存在則更新ON DUPLICATE KEY UPDATE

邏輯:鍵重復(fù)時,更新指定字段;無重復(fù)則正常插入。

-- id=1 已存在,觸發(fā)更新;不存在則新增
INSERT INTO students (id, sn, name) 
VALUES (1, 1009, '小張')
ON DUPLICATE KEY UPDATE sn = 1009, name = '小張';

返回行數(shù)說明(易錯點)

  • 1 row affected:無沖突,數(shù)據(jù)新增成功;
  • 2 row affected:存在沖突,數(shù)據(jù)更新成功;
  • 0 row affected:存在沖突,但新舊數(shù)據(jù)完全一致,無變更。

方案2:存在則替換REPLACE INTO

邏輯:鍵重復(fù)時,先刪除原數(shù)據(jù),再插入新數(shù)據(jù);無重復(fù)則直接插入。

-- 學(xué)號sn是唯一鍵,重復(fù)則刪除舊數(shù)據(jù)、插入新數(shù)據(jù)
REPLACE INTO students (sn, name, qq) VALUES (1001, '新張三', '999999');

區(qū)別總結(jié)

  • ON DUPLICATE KEY UPDATE:原地更新,保留原數(shù)據(jù)主鍵;
  • REPLACE:刪舊插新,自增主鍵會重新生成,慎用。

2.3 拓展:插入查詢結(jié)果

一張表的查詢結(jié)果直接插入另一張表,常用于數(shù)據(jù)備份、去重、數(shù)據(jù)遷移。

-- 語法:INSERT ... SELECT
INSERT INTO 目標表(字段1,字段2) SELECT 字段1,字段2 FROM 源表 [條件];

-- 示例:將成績表中數(shù)學(xué)>80的學(xué)生姓名、成績插入新表
CREATE TABLE temp_result (name VARCHAR(20), math FLOAT);
INSERT INTO temp_result (name, math) 
SELECT name, math FROM exam_result WHERE math > 80;

三、數(shù)據(jù)查詢:SELECT(Retrieve)【重點】

SELECT 是 MySQL 使用率最高的語句,支持字段篩選、條件過濾、排序、分頁、聚合、分組等功能。

3.1 完整語法框架

SELECT [DISTINCT] 字段列表
FROM 表名
[WHERE 條件]          -- 行過濾
[GROUP BY 分組字段]   -- 分組
[HAVING 分組后條件]   -- 分組過濾
[ORDER BY 排序字段]   -- 結(jié)果排序
[LIMIT 分頁限制];     -- 分頁

3.2 基礎(chǔ)查詢

3.2.1 全列查詢*

* 代表查詢表中所有字段。

SELECT * FROM exam_result;

?? 開發(fā)易錯點
禁止在生產(chǎn)環(huán)境隨意使用 SELECT *

  1. 傳輸大量無用數(shù)據(jù),影響性能;
  2. 無法使用索引,查詢效率降低;
  3. 表結(jié)構(gòu)變更后,查詢結(jié)果列會錯亂。

3.2.2 指定列查詢(推薦)

手動指定需要查詢的字段,字段順序可自定義,和表結(jié)構(gòu)順序無關(guān)。

-- 只查詢姓名、語文、數(shù)學(xué)成績
SELECT name, chinese, math FROM exam_result;

3.2.3 查詢表達式 & 字段別名

查詢列可以是算術(shù)表達式(加減乘除),使用 AS 給列起別名(AS 可省略)。

-- 1. 計算總分,并設(shè)置別名 總分
SELECT 
    name,
    chinese,
    math,
    english,
    chinese + math + english AS total_score -- 別名
FROM exam_result;

-- 2. AS 可省略,簡寫形式
SELECT name, chinese + math + english total FROM exam_result;

?? 易錯點WHERE 子句不能使用字段別名(執(zhí)行順序問題),ORDER BY 可以使用別名。

3.2.4 結(jié)果去重DISTINCT

去除查詢結(jié)果中完全重復(fù)的行,寫在 SELECT 之后。

-- 查詢所有不重復(fù)的數(shù)學(xué)成績
SELECT DISTINCT math FROM exam_result;

3.3 條件過濾:WHERE 子句

WHERE 用于篩選符合條件的行,支持比較運算符、邏輯運算符、模糊查詢、空值判斷。

3.3.1 常用運算符匯總

1)比較運算符

運算符作用備注
> >= < <=大小比較常規(guī)數(shù)值判斷
=等于對 NULL 無效,NULL = NULL 結(jié)果仍為 NULL
<=>安全等于支持 NULL 比較,NULL <=> NULL 結(jié)果為真
!= / <>不等于兩種寫法等價
BETWEEN a AND b區(qū)間匹配閉區(qū)間 [a,b],包含兩端值
IN(值1,值2...)枚舉匹配匹配括號內(nèi)任意一個值

2)空值判斷

MySQL 中 NULL 不等于任何值,必須使用專用關(guān)鍵字

  • IS NULL:判斷字段為空
  • IS NOT NULL:判斷字段不為空

3)邏輯運算符

  • AND:并且(所有條件同時成立)
  • OR:或者(任意一個條件成立)
  • NOT:取反(條件不成立)

4)模糊查詢LIKE

搭配通配符使用,常用于搜索場景:

  • %:匹配任意長度字符(包含 0 個字符)
  • _:匹配單個字符

3.3.2 實戰(zhàn)案例

-- 1. 英語成績低于60分的學(xué)生(比較運算)
SELECT name, english FROM exam_result WHERE english < 60;

-- 2. 語文成績在 [80,90] 區(qū)間(兩種寫法等價)
SELECT name, chinese FROM exam_result WHERE chinese >=80 AND chinese <=90;
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;

-- 3. 數(shù)學(xué)成績?yōu)?78、84、98 之一(IN 枚舉)
SELECT name, math FROM exam_result WHERE math IN(78,84,98);

-- 4. 模糊查詢:姓"張"的學(xué)生(% 通配)
SELECT name FROM exam_result WHERE name LIKE '張%';
-- 名字第二個字為"五"(_ 單個字符)
SELECT name FROM exam_result WHERE name LIKE '_五';

-- 5. 判斷空值:查詢QQ號為空的學(xué)生
SELECT name FROM students WHERE qq IS NULL;

-- 6. 多條件組合:語文>80 并且 不姓王
SELECT name, chinese FROM exam_result 
WHERE chinese > 80 AND NOT name LIKE '王%';

3.4 結(jié)果排序:ORDER BY

對查詢結(jié)果排序,默認升序(ASC)。
語法:ORDER BY 字段 [ASC|DESC]

  • ASC:升序(從小到大,默認可省略)
  • DESC:降序(從大到小)

3.4.1 單字段排序

-- 數(shù)學(xué)成績升序(默認ASC)
SELECT name, math FROM exam_result ORDER BY math;
-- 數(shù)學(xué)成績降序
SELECT name, math FROM exam_result ORDER BY math DESC;

3.4.2 多字段排序(優(yōu)先級從左到右)

先按第一個字段排序,值相同時再按第二個字段排序。

-- 先數(shù)學(xué)降序,數(shù)學(xué)相同則英語升序
SELECT name, math, english FROM exam_result
ORDER BY math DESC, english ASC;

3.4.3 排序規(guī)則補充(易錯點)

  1. NULL 在排序中視為最小值:升序時 NULL 排在最前,降序時排在最后;
  2. ORDER BY 支持表達式、字段別名
  3. ORDER BY 時,查詢結(jié)果順序無定義,不要依賴默認順序。

3.5 分頁查詢:LIMIT

分頁是項目必備功能,用于限制返回數(shù)據(jù)行數(shù),語法兩種寫法:

-- 寫法1:LIMIT 行數(shù) (從第0條開始,取N條)
SELECT 字段 FROM 表 LIMIT N;

-- 寫法2:LIMIT 偏移量, 行數(shù) (偏移量從0開始)
SELECT 字段 FROM 表 LIMIT offset, N;

-- 寫法3(推薦,語義清晰):LIMIT 行數(shù) OFFSET 偏移量
SELECT 字段 FROM 表 LIMIT N OFFSET offset;

分頁實戰(zhàn)(每頁3條數(shù)據(jù))

-- 第1頁:偏移0,取3條
SELECT * FROM exam_result ORDER BY id LIMIT 3 OFFSET 0;
-- 第2頁:偏移3,取3條
SELECT * FROM exam_result ORDER BY id LIMIT 3 OFFSET 3;
-- 第3頁:偏移6,取3條(不足3條則返回剩余數(shù)據(jù))
SELECT * FROM exam_result ORDER BY id LIMIT 3 OFFSET 6;

? 開發(fā)建議:查詢未知大表時,強制加 LIMIT 1,避免全表查詢導(dǎo)致數(shù)據(jù)庫卡死。

3.6 聚合函數(shù)

聚合函數(shù)用于統(tǒng)計計算,作用于一組數(shù)據(jù),返回一個結(jié)果。常用 5 大聚合函數(shù):

函數(shù)作用特性
COUNT(字段/*)統(tǒng)計行數(shù)COUNT(*) 統(tǒng)計所有行;COUNT(字段) 忽略 NULL
SUM(字段)求和僅對數(shù)值有效,無數(shù)據(jù)返回 NULL
AVG(字段)求平均值忽略 NULL
MAX(字段)求最大值支持數(shù)值、字符串
MIN(字段)求最小值支持數(shù)值、字符串

聚合函數(shù)案例

-- 1. 統(tǒng)計總?cè)藬?shù)(COUNT(*) 統(tǒng)計所有行)
SELECT COUNT(*) AS total_student FROM exam_result;

-- 2. 統(tǒng)計有QQ號的學(xué)生數(shù)(COUNT(字段) 忽略NULL)
SELECT COUNT(qq) AS have_qq FROM students;

-- 3. 數(shù)學(xué)成績總分、平均分
SELECT SUM(math) AS math_sum, AVG(math) AS math_avg FROM exam_result;

-- 4. 英語最高分、最低分
SELECT MAX(english) AS max_en, MIN(english) AS min_en FROM exam_result;

-- 5. 去重統(tǒng)計:不重復(fù)的數(shù)學(xué)成績數(shù)量
SELECT COUNT(DISTINCT math) FROM exam_result;

3.7 分組查詢:GROUP BY + HAVING

GROUP BY:按照指定字段分組,配合聚合函數(shù)做分組統(tǒng)計;
HAVING:對分組后的結(jié)果再次過濾(區(qū)別于 WHERE)。

核心區(qū)別(高頻面試題)

  1. WHERE分組前過濾原始數(shù)據(jù),不能使用聚合函數(shù);
  2. HAVING分組后過濾分組結(jié)果,可以使用聚合函數(shù)。

分組案例

-- 模擬場景:新增班級字段,按班級分組統(tǒng)計
ALTER TABLE exam_result ADD class VARCHAR(10) COMMENT '班級';
UPDATE exam_result SET class = '一班' WHERE id <=4;
UPDATE exam_result SET class = '二班' WHERE id >4;

-- 1. 按班級分組,統(tǒng)計每個班級人數(shù)、語文平均分
SELECT class, COUNT(*) AS num, AVG(chinese) AS avg_ch
FROM exam_result
GROUP BY class;

-- 2. 分組后過濾:只顯示平均分大于70的班級(HAVING)
SELECT class, AVG(chinese) AS avg_ch
FROM exam_result
GROUP BY class
HAVING avg_ch > 70;

四、數(shù)據(jù)修改:UPDATE

4.1 基礎(chǔ)語法

UPDATE 表名 
SET 字段1 = 值1, 字段2 = 值2, ...
[WHERE 條件] 
[ORDER BY 排序]
[LIMIT 行數(shù)];

?? 高危警告:省略 WHERE 會更新全表所有數(shù)據(jù),生產(chǎn)環(huán)境嚴禁裸寫 UPDATE 表名 SET ...!

4.2 實戰(zhàn)案例

-- 1. 單字段更新:將張三的數(shù)學(xué)成績改為80
UPDATE exam_result SET math = 80 WHERE name = '張三';

-- 2. 多字段更新:同時修改語文、英語成績
UPDATE exam_result 
SET chinese = 70, english = 60 
WHERE name = '李四';

-- 3. 基于原數(shù)據(jù)更新(字段自增/自減)
UPDATE exam_result SET math = math + 10 WHERE math < 80;

-- 4. 結(jié)合排序+分頁更新:成績倒數(shù)3名,數(shù)學(xué)+20分
UPDATE exam_result 
SET math = math + 20
ORDER BY chinese + math + english ASC
LIMIT 3;

五、數(shù)據(jù)刪除:DELETE & TRUNCATE

5.1 DELETE 語句(刪除行數(shù)據(jù))

5.1.1 基礎(chǔ)語法

-- 刪除符合條件的行
DELETE FROM 表名 [WHERE 條件] [LIMIT 行數(shù)];

案例

-- 1. 刪除指定學(xué)生數(shù)據(jù)(推薦,帶WHERE)
DELETE FROM exam_result WHERE name = '李四';

-- 2. 刪除全表數(shù)據(jù)(高危?。?
DELETE FROM students;

DELETE 特性

  1. 只刪除數(shù)據(jù),保留表結(jié)構(gòu);
  2. 支持事務(wù),可以回滾;
  3. 自增主鍵 AUTO_INCREMENT 不會重置,再次插入會延續(xù)之前的ID。

5.2 TRUNCATE 語句(截斷表)

語法

TRUNCATE [TABLE] 表名;

TRUNCATE 特性(和 DELETE 核心區(qū)別,面試重點)

  1. 只能清空整張表,無法按條件刪除單行;
  2. 不觸發(fā)事務(wù)、無法回滾,執(zhí)行速度遠快于 DELETE
  3. 清空后重置自增主鍵,新數(shù)據(jù)ID從1重新開始;
  4. 屬于 DDL 語句(數(shù)據(jù)定義),DELETE 屬于 DML 語句(數(shù)據(jù)操作)。

適用場景

僅用于整表數(shù)據(jù)清空(測試環(huán)境、數(shù)據(jù)初始化),生產(chǎn)環(huán)境謹慎使用。

5.3 DELETE vs TRUNCATE 對比表

特性DELETETRUNCATE
操作范圍可按條件刪除單行/多行只能清空全表
事務(wù)支持支持事務(wù)、可回滾不支持事務(wù)、不可回滾
自增ID不重置重置為初始值
執(zhí)行速度較慢極快
語句類型DML(數(shù)據(jù)操作)DDL(數(shù)據(jù)定義)

六、高頻考點:SQL 關(guān)鍵字執(zhí)行順序(面試必背)

完整執(zhí)行順序(從先到后):

FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

順序解讀(解釋易錯點)

  1. 先通過 FROM 找到表,WHERE 過濾原始數(shù)據(jù);
  2. GROUP BY 分組,HAVING 過濾分組結(jié)果;
  3. 再執(zhí)行 SELECT 生成字段別名 → 去重 DISTINCT;
  4. 最后 ORDER BY 排序、LIMIT 分頁。

對應(yīng)易錯點解釋:

  • WHERE 不能使用 SELECT 定義的別名:別名是 WHERE 執(zhí)行完后才生成;
  • HAVING、ORDER BY 可以使用別名:執(zhí)行順序在 SELECT 之后。

七、全局易錯點總結(jié)(避坑指南)

  1. NULL 相關(guān):= NULL 永遠查不到數(shù)據(jù),必須用 IS NULL / IS NOT NULL;NULL <=> NULL 才會判定為真。
  2. 全表操作:UPDATE、DELETE 不加 WHERE 會操作全表,生產(chǎn)環(huán)境禁止使用。
  3. 別名使用:WHERE 不能用字段別名,ORDER BY/HAVING 可以。
  4. DISTINCT:針對整行去重,不是單個字段。
  5. LIMIT 偏移量:偏移量從 0 開始,分頁公式:偏移量 = (頁碼 - 1) * 每頁條數(shù)。
  6. TRUNCATE:不可逆、不支持事務(wù),正式環(huán)境嚴禁隨意執(zhí)行。
  7. INSERT 多行:優(yōu)先使用多行 VALUES 批量插入,性能遠高于多次單行插入。

八、總結(jié)

本文覆蓋 MySQL CRUD 全部核心語法、實戰(zhàn)案例、易錯點、面試考點,是 MySQL 入門的核心內(nèi)容:

  1. 新增:INSERT 分單行/多行、指定列/全列,沖突處理用 ON DUPLICATE KEY / REPLACE;
  2. 查詢:SELECT 是核心,掌握條件、排序、分頁、聚合、分組五大功能;
  3. 修改:UPDATE 務(wù)必加 WHERE,避免全表更新;
  4. 刪除:區(qū)分 DELETE(靈活、可回滾)和 TRUNCATE(極速、清空全表);
  5. 執(zhí)行順序:理解關(guān)鍵字執(zhí)行順序,就能規(guī)避 90% 的語法報錯。

到此這篇關(guān)于MySQL DML 操作(CRUD)總結(jié)的文章就介紹到這了,更多相關(guān)MySQL DML 操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

淄博市| 通城县| 宝应县| 五大连池市| 武强县| 曲阜市| 莱芜市| 微博| 东兴市| 湖口县| 儋州市| 金溪县| 青神县| 苗栗市| 郓城县| 彭水| 洪湖市| 鄂尔多斯市| 驻马店市| 讷河市| 绥棱县| 西宁市| 兰坪| 中牟县| 昌邑市| 收藏| 称多县| 镇雄县| 佛坪县| 宜宾市| 阳城县| 长葛市| 苏尼特左旗| 大港区| 湖口县| 崇左市| 平武县| 碌曲县| 临湘市| 论坛| 突泉县|