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

MySQL?實戰(zhàn)入門從"增刪改查"到"高效查詢"的操作

 更新時間:2026年02月28日 16:09:54   作者:魚人  
本文介紹了MySQL的核心CRUD操作,包括增刪改查的詳細(xì)語法和最佳實踐,還涵蓋了多表連接、分組過濾、子查詢、事務(wù)控制和索引管理等高級功能,感興趣的朋友跟隨小編一起看看吧

在數(shù)據(jù)驅(qū)動的時代,MySQL 作為全球最流行的開源關(guān)系型數(shù)據(jù)庫,是每一位后端開發(fā)者、數(shù)據(jù)分析師乃至全棧工程師的必修課。無論你的架構(gòu)多么宏大,微服務(wù)多么復(fù)雜,最終數(shù)據(jù)的落地往往都回歸到最基礎(chǔ)的 CRUD(Create, Read, Update, Delete)操作。

很多初學(xué)者只會寫 SELECT *,卻在面對百萬級數(shù)據(jù)時束手無策;或者在更新數(shù)據(jù)時因忘記加 WHERE 條件而釀成“刪庫跑路”的慘劇。本文將帶你系統(tǒng)梳理 MySQL 的核心操作,不僅教你“怎么寫”,更教你“怎么寫得安全、高效”。

一、基石:數(shù)據(jù)的“增刪改查” (CRUD)

1.1 增 (Create):不僅僅是插入

插入數(shù)據(jù)看似簡單,但處理批量插入和默認(rèn)值才是實戰(zhàn)關(guān)鍵。

單條插入

INSERT INTO users (username, email, age, created_at) 
VALUES ('alice', 'alice@example.com', 25, NOW());

批量插入(性能關(guān)鍵) : 不要在循環(huán)中執(zhí)行單條 INSERT!一次性插入多條數(shù)據(jù)能減少網(wǎng)絡(luò)交互和事務(wù)開銷,性能提升數(shù)倍。

INSERT INTO users (username, email, age, created_at) 
VALUES 
  ('bob', 'bob@example.com', 30, NOW()),
  ('charlie', 'charlie@example.com', 28, NOW()),
  ('david', 'david@example.com', 22, NOW());

忽略或更新: 如果主鍵沖突怎么辦?

INSERT INTO visits (ip, count) VALUES ('192.168.1.1', 1)
ON DUPLICATE KEY UPDATE count = count + 1;
  • INSERT IGNORE: 沖突則直接忽略,不報錯。
  • ON DUPLICATE KEY UPDATE: 沖突則執(zhí)行更新操作(常用于統(tǒng)計計數(shù))。

1.2 刪 (Delete):高危操作,慎之又慎

鐵律:執(zhí)行 DELETE 前,必須先執(zhí)行對應(yīng)的 SELECT 確認(rèn)范圍!

條件刪除

-- 先確認(rèn):SELECT * FROM users WHERE age < 18 AND status = 'inactive';
DELETE FROM users 
WHERE age < 18 AND status = 'inactive';

邏輯刪除 vs 物理刪除: 在生產(chǎn)環(huán)境中,嚴(yán)禁輕易使用物理刪除DELETE)。通常會在表中增加 is_deleteddeleted_at 字段。

做法:UPDATE users SET is_deleted = 1, deleted_at = NOW() WHERE id = 100;

好處:數(shù)據(jù)可恢復(fù),便于審計,避免外鍵約束報錯。

清空表: 如果要清空整張表,用 TRUNCATE TABLE users;DELETE FROM users; 更快,且重置自增 ID,但它無法回滾(取決于事務(wù)隔離級別),且不會觸發(fā)刪除觸發(fā)器。

1.3 改 (Update):精準(zhǔn)打擊

更新操作同樣需要 WHERE 條件的保護。

單字段與多字段更新

UPDATE users 
SET age = 26, last_login = NOW() 
WHERE username = 'alice';

基于計算的更新

-- 所有用戶積分加 10
UPDATE users SET score = score + 10;

多表關(guān)聯(lián)更新(MySQL 特色):

UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.vip_level = 'gold'
WHERE o.total_amount > 10000;

1.4 查 (Select):靈魂所在

查詢是數(shù)據(jù)庫最高頻的操作,也是優(yōu)化空間最大的部分。

基礎(chǔ)查詢

SELECT id, username, email FROM users WHERE age > 18 ORDER BY created_at DESC LIMIT 10;

模糊查詢

-- 查找名字包含 "li" 的用戶
SELECT * FROM users WHERE username LIKE '%li%'; 
-- 注意:前綴通配符 '%li' 會導(dǎo)致索引失效,性能較差

去重與統(tǒng)計

SELECT DISTINCT city FROM users; -- 去重
SELECT COUNT(*), AVG(age) FROM users; -- 聚合統(tǒng)計

二、進階:常用語句與核心功能

掌握了 CRUD 只是第一步,真正讓 MySQL 發(fā)揮威力的是以下高級特性。

2.1 多表連接 (JOIN)

關(guān)系型數(shù)據(jù)庫的核心在于“關(guān)系”。

INNER JOIN:只返回兩個表中匹配的行(交集)。

SELECT u.username, o.order_no 
FROM users u 
INNER JOIN orders o ON u.id = o.user_id;

LEFT JOIN:返回左表所有行,右表沒有匹配的填 NULL(常用于查“未下單的用戶”)。

SELECT u.username, o.order_no 
FROM users u 
LEFT JOIN orders o ON u.id = o.user_id 
WHERE o.order_no IS NULL; -- 找出從未下過單的用戶

2.2 分組與過濾 (GROUP BY & HAVING)

GROUP BY:將數(shù)據(jù)按某列分組。

HAVING:對分組后的結(jié)果進行過濾(WHERE 無法用于聚合函數(shù))。

-- 統(tǒng)計每個城市的用戶數(shù),只顯示超過 100 人的城市
SELECT city, COUNT(*) as user_count 
FROM users 
GROUP BY city 
HAVING user_count > 100 
ORDER BY user_count DESC;

2.3 子查詢 (Subquery)

在查詢中嵌套查詢。雖然靈活,但性能通常不如 JOIN,需謹(jǐn)慎使用。

-- 查找訂單金額大于平均訂單金額的訂單
SELECT * FROM orders 
WHERE amount > (SELECT AVG(amount) FROM orders);

2.4 事務(wù)控制 (Transaction)

涉及金錢、庫存等關(guān)鍵業(yè)務(wù),必須保證原子性(ACID)。

START TRANSACTION;
-- 1. 扣減庫存
UPDATE products SET stock = stock - 1 WHERE id = 101;
-- 2. 創(chuàng)建訂單
INSERT INTO orders (product_id, user_id) VALUES (101, 55);
-- 檢查是否有錯誤,如果有則回滾,否則提交
-- ROLLBACK; 
COMMIT;

2.5 索引管理 (Index)

索引是查詢速度的加速器,但會拖慢寫入速度。

創(chuàng)建索引

CREATE INDEX idx_username ON users(username);
CREATE UNIQUE INDEX idx_email ON users(email); -- 唯一索引,防止重復(fù)

查看執(zhí)行計劃(優(yōu)化必做): 在 SQL 前加 EXPLAIN,查看是否用到了索引 (type: refrange 為佳,ALL 為全表掃描,需優(yōu)化)。

EXPLAIN SELECT * FROM users WHERE username = 'alice';

三、避坑指南與最佳實踐

  • 拒絕 SELECT *
    • 原因:網(wǎng)絡(luò)傳輸浪費、無法利用覆蓋索引、表結(jié)構(gòu)變更可能導(dǎo)致代碼出錯。
    • 做法:明確列出需要的字段 SELECT id, name, ...
  • 小心 NULL 值:
    • NULL 不等于 0 或空字符串。在計算和判斷時要格外小心(如 COUNT(column) 不統(tǒng)計 NULL 值,而 COUNT(*) 統(tǒng)計)。
    • 建議在建表時盡量設(shè)置 NOT NULL 并給默認(rèn)值。
  • 分頁優(yōu)化的陷阱:
-- 推薦:利用主鍵索引
SELECT * FROM users WHERE id > 100000 LIMIT 10;
  • 深分頁(LIMIT 100000, 10)非常慢,因為 MySQL 要掃描前 100000 條然后丟棄。
  • 優(yōu)化:使用“游標(biāo)法”或“延遲關(guān)聯(lián)”。
  • 字符集選擇:
    • 現(xiàn)在統(tǒng)一推薦使用 utf8mb4,因為它支持 Emoji 表情等特殊字符,而舊的 utf8 在 MySQL 中實際上是 utf8mb3,不支持 Emoji。
  • SQL 注入防御:
    • 永遠(yuǎn)不要拼接用戶輸入到 SQL 字符串中。
    • 必須使用預(yù)編譯語句(Prepared Statements),如在 Java 中使用 PreparedStatement,在 Node.js 中使用參數(shù)化查詢,在 Python 中使用 %s 占位符。

四、結(jié)語

MySQL 的學(xué)習(xí)曲線是“易學(xué)難精”。寫出能跑的 SELECT 語句只需五分鐘,但寫出在千萬級數(shù)據(jù)下依然毫秒級響應(yīng)、在并發(fā)高負(fù)載下依然數(shù)據(jù)一致的 SQL,則需要深厚的功底。

  • 對于初學(xué)者:熟練掌握 CRUD 和 JOIN,理解事務(wù)的基本概念。
  • 對于進階者:深入理解索引原理(B+ 樹)、執(zhí)行計劃分析、鎖機制以及慢查詢優(yōu)化。

記住,數(shù)據(jù)庫是應(yīng)用的最后一道防線。優(yōu)秀的代碼不僅邏輯嚴(yán)密,更要對數(shù)據(jù)心存敬畏。每一次 UPDATEDELETE 前的深思熟慮,都是專業(yè)素養(yǎng)的體現(xiàn)。

到此這篇關(guān)于MySQL 實戰(zhàn)入門:從“增刪改查”到“高效查詢”的核心指南的文章就介紹到這了,更多相關(guān)mysql增刪改查到高效查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

云林县| 信宜市| 永修县| 武宁县| 吴忠市| 河津市| 汉寿县| 西宁市| 沙河市| 惠州市| 武宁县| 正蓝旗| 东丰县| 辽源市| 盐津县| 历史| 彰化县| 高平市| 五寨县| 安宁市| 射阳县| 山阴县| 揭阳市| 信丰县| 清涧县| 湘阴县| 伊川县| 湟中县| 阜宁县| 南澳县| 伊吾县| 岳池县| 南安市| 芷江| 阳山县| 山东省| 南皮县| 镇雄县| 荆州市| 益阳市| 自治县|