久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL中特別實用的SQL語句分享

138次閱讀
沒有評論

共計 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 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-28發表,共計4270字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 共和县| 巫溪县| 若尔盖县| 蛟河市| 鸡泽县| 凤庆县| 湘西| 舒兰市| 盐源县| 亳州市| 会同县| 巴林右旗| 临猗县| 常德市| 济阳县| 安乡县| 阿拉善盟| 萨迦县| 紫云| 来安县| 浦县| 丹巴县| 汶上县| 那曲县| 公主岭市| 依兰县| 江西省| 陆良县| 武安市| 满城县| 奉节县| 宿州市| 沂南县| 克山县| 公安县| 浦县| 宁津县| 昌黎县| 西乌珠穆沁旗| 耒阳市| 青铜峡市|