共計 4270 個字符,預計需要花費 11 分鐘才能閱讀完成。
這篇文章主要介紹“MySQL 中特別實用的 SQL 語句分享”,在日常操作中,相信很多人在 MySQL 中特別實用的 SQL 語句分享問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL 中特別實用的 SQL 語句分享”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
實用的 SQL
1. 插入或替換
如果我們想插入一條新記錄(INSERT),但如果記錄已經存在,就先刪除原記錄,再插入新記錄。
情景示例:這張表存的每個客戶最近一次交易訂單信息,要求保證單個用戶數據不重復錄入,且執行效率最高,與數據庫交互最少,支撐數據庫的高可用。
此時,可以使用 REPLACE INTO 語句,這樣就不必先查詢,再決定是否先刪除再插入。
REPLACE INTO 語句是基于唯一索引或主鍵來判斷唯一(是否存在)的。
REPLACE INTO 語句是基于唯一索引或主鍵來判斷唯一(是否存在)的。
REPLACE INTO 語句是基于唯一索引或主鍵來判斷唯一(是否存在)的。
注意事項:如下 SQL 所示,需要在 username 字段上建立唯一索引(Unique),transId 設置自增即可。
-- 20 點充值 REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES (null, chenhaha , 30, 2020-06-11 20:00:20 , 會員充值 -- 21 點買皮膚 REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES (null, chenhaha , 100, 2020-06-11 21:00:00 , 購買盲僧至高之拳皮膚
若 username= chenhaha 的記錄不存在,REPLACE 語句將插入新記錄(首次充值),否則,當前 username= chenhaha 的記錄將被刪除,然后再插入新記錄。
id 不要給具體值,不然會影響 SQL 執行,業務有特殊需求除外。
2. 插入或更新
如果我們希望插入一條新記錄(INSERT),但如果記錄已經存在,就更新該記錄,此時,可以使用 INSERT INTO … ON DUPLICATE KEY UPDATE … 語句:
情景示例:這張表存了用戶歷史充值金額,如果第一次充值就新增一條數據,如果該用戶充值過就累加歷史充值金額,需要保證單個用戶數據不重復錄入。
這時可以使用 INSERT INTO … ON DUPLICATE KEY UPDATE … 語句。
注意事項:同上,INSERT INTO … ON DUPLICATE KEY UPDATE … 語句是基于唯一索引或主鍵來判斷唯一(是否存在)的。如下 SQL 所示,需要在 username 字段上建立唯一索引(Unique),transId 設置自增即可。
-- 用戶陳哈哈充值了 30 元買會員 INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES (null, chenhaha , 30, 2020-06-11 20:00:20 , 充會員) ON DUPLICATE KEY UPDATE total_amounttotal_amount=total_amount + 30, last_transTime= 2020-06-11 20:00:20 , last_remark = 充會員 -- 用戶陳哈哈充值了 100 元買瞎子至高之拳皮膚 INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES (null, chenhaha , 100, 2020-06-11 20:00:20 , 購買盲僧至高之拳皮膚) ON DUPLICATE KEY UPDATE total_amounttotal_amount=total_amount + 100, last_transTime= 2020-06-11 21:00:00 , last_remark = 購買盲僧至高之拳皮膚
若 username= chenhaha 的記錄不存在,INSERT 語句將插入新記錄,否則,當前 username= chenhaha 的記錄將被更新,更新的字段由 UPDATE 指定。
3. 插入或忽略
如果我們希望插入一條新記錄(INSERT),但如果記錄已經存在,就啥事也不干直接忽略,此時,可以使用 INSERT IGNORE INTO … 語句:情景很多,不再舉例贅述。
注意事項:同上,INSERT IGNORE INTO … 語句是基于唯一索引或主鍵來判斷唯一(是否存在)的,需要在 username 字段上建立唯一索引(Unique),transId 設置自增即可。
-- 用戶首次添加 INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) VALUES (null, chenhaha , 男 , 12, 0, 2020-06-11 20:00:20 -- 二次添加,直接忽略 INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) VALUES (null, chenhaha , 男 , 12, 0, 2020-06-11 21:00:20
若 username= chenhaha 的記錄不存在,INSERT 語句將插入新記錄,否則,不執行任何操作。
4.SQL 中的 if-else 判斷語句
眾所周知,if-else 判斷在任何地方都很有用,在 SQL 語句中,CASE WHEN … THEN … ELSE … END 語句可以用在增刪改查各類語句中。
給個情景:婦女節大回饋,2020 年注冊的新用戶,所有成年女性賬號送 10 元紅包,其他用戶送 5 元紅包,自動充值。
示例語句如下:
-- 送紅包語句 UPDATE users_info u SET u.balance = CASE WHEN u.sex = 女 and u.age 18 THEN u.balance + 10 ELSE u.balance + 5 end WHERE u.create_time = 2020-01-01
* 情景 2:有個學生高考分數表,需要將等級列出來,650 分以上是重點大學,600-650 是一本,500-600 分是二本,400-500 是三本,400 以下大專;
原測試數據如下:
查詢語句:
SELECT *,case when total_score = 650 THEN 重點大學 when total_score = 600 and total_score 650 THEN 一本 when total_score = 500 and total_score 600 THEN 二本 when total_score = 400 and total_score 500 THEN 三本 else 大專 end as status_student from student_score;
5. 指定數據快照或備份
如果想要對一個表進行快照,即復制一份當前表的數據到一個新表,可以結合 CREATE TABLE 和 SELECT:
-- 對 class_id=1(一班)的記錄進行快照,并存儲為新表 students_of_class1: CREATE TABLE students_of_class1 SELECT * FROM student WHERE class_id=1;
新創建的表結構和 SELECT 使用的表結構完全一致。
6. 寫入查詢結果集
如果查詢結果集需要寫入到表中,可以結合 INSERT 和 SELECT,將 SELECT 語句的結果集直接插入到指定表中。
例如,創建一個統計成績的表 statistics,記錄各班的平均成績:
CREATE TABLE statistics ( id BIGINT NOT NULL AUTO_INCREMENT, class_id BIGINT NOT NULL, average DOUBLE NOT NULL, PRIMARY KEY (id) );
然后,我們就可以用一條語句寫入各班的平均成績:
INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id;
確保 INSERT 語句的列和 SELECT 語句的列能一一對應,就可以在 statistics 表中直接保存查詢的結果:
SELECT * FROM statistics;
+----+----------+--------------+ | id | class_id | average | +----+----------+--------------+ | 1 | 1 | 475.5 | | 2 | 2 | 473.33333333 | | 3 | 3 | 488.66666666 | +----+----------+--------------+ 3 rows in set (0.00 sec)
7. 強制使用指定索引
在查詢的時候,數據庫系統會自動分析查詢語句,并選擇一個最合適的索引。但是很多時候,數據庫系統的查詢優化器并不一定總是能使用最優索引。如果我們知道如何選擇索引,可以使用 FORCE INDEX 強制查詢使用指定的索引。例如:
SELECT * FROM students FORCE INDEX (idx_class_id) WHERE class_id = 1 ORDER BY id DESC;
指定索引的前提是索引 idx_class_id 必須存在。
到此,關于“MySQL 中特別實用的 SQL 語句分享”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!