前言:在撰寫SQL時,我們經常靈活地使用一些SQL陳述句撰寫陳述句,從而可以大大簡化程式邏輯,減少程式與資料庫之間的互動次數,這有利于資料庫的高可用性,
實用SQL陳述句:
1.插入或更換
如果我們要插入新記錄(INSERT),但是如果該記錄已經存在,請先洗掉原始記錄,然后再插入新記錄,
場景示例:需要使用此表中存盤的每個客戶的最新交易訂單資訊,以確保不重復輸入單個用戶的資料,執行效率最高,與資料庫的互動最少,并且資料庫是高度可用的,
此時,可以用“ REPLACE INTO”陳述句,這樣就不必先查詢,然后再決定是否先洗掉和插入,
“REPLACE INTO”陳述句基于唯一索引或主鍵來確定其是否唯一,
注意:如以下SQL所示,在用戶名欄位中創建唯一索引,并且可以自動增加transId設定,
-- 20 Point rechargeREPLACE INTO last_transaction (transId,username,amount,trans_time,remark)VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', 'Member recharge');-- 21 Buy skinREPLACE INTO last_transaction (transId,username,amount,trans_time,remark)VALUES (null, 'chenhaha', 100, '2020-06-11 21:00:00', 'Buy the skin of the supreme fist of blind monk');
如果用戶名= chenaha的記錄不存在,則REPLACE陳述句將插入一條新記錄(第一次充值),否則,將洗掉當前用戶名= chenaha的記錄,然后將一條新記錄已插入,
不要給id賦予特定的值,否則,除非特殊的業務要求,否則SQL執行將受到影響,
2.插入或更新
如果我們要插入新記錄(INSERT),但是如果該記錄已經存在,請更新該記錄,這時,可以用“ INSERT into ......重復密鑰更新...”陳述句:
方案示例:此表存盤用戶的歷史充值金額,如果用戶是第一次充電,將添加新的資料,如果用戶是第一次充值,將累積歷史充值量,必須確保不會重復輸入單個用戶的資料,
-- User Chen haha recharged 30 yuan to buy membersINSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark)VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', 'Full membership')ON DUPLICATE KEY UPDATE total_amount=total_amount + 30, last_transTime='2020-06-11 20:00:20', last_remark ='Full membership';-- User Chen ha ha recharged 100 yuan to buy the highest fist skin of the blindINSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark)VALUES (null, 'chenhaha', 100, '2020-06-11 20:00:20', 'Buy the skin of the supreme fist of blind monk')ON DUPLICATE KEY UPDATE total_amount=total_amount + 100, last_transTime='2020-06-11 21:00:00', last_remark ='Buy the skin of the supreme fist of blind monk';
如果用戶名= chenaha'記錄不存在,則INSERT陳述句將插入新記錄,否則,當前用戶名= chenaha的記錄將被更新,并且更新的欄位將由UPDATE指定,
3.插入或忽略
如果要插入新記錄(INSERT),但是如果該記錄已存在,則不能直接忽略任何內容,我們可以用INSERT IGNORE INTO ...陳述句,
“INSERT IGNORE INTO ...”陳述句基于唯一索引或主鍵來確定其是否唯一,只要在用戶名欄位上創建唯一索引,并且可以自動增加transId設定,
-- First added by userINSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time)VALUES (null, 'chenhaha', 'male', 12, 0, '2020-06-11 20:00:20');-- Add twice, ignore directlyINSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time)VALUES (null, 'chenhaha', 'male', 12, 0, '2020-06-11 21:00:20');
如果用戶名='chenaha'的記錄不存在,則INSERT陳述句將插入新記錄,否則將不執行任何操作,
4. SQL中的if判斷陳述句
眾所周知,判斷是否到處都是非常有用的,在SQL陳述句中,“在……時……然后……其他……結束”的情況下,可用于添加,洗掉,修改和查詢各種陳述句,
如果你在學習C/C++的程序中遇到了問題,可以來加入小編的企鵝圈問小編哦~小編很熱情的(●’?’●)
*方案:有一個針對學生的高考成績表,需要列出成績,重點大學的得分超過650分,其中一門600-650分,兩門500-600分,三門400-500分,以及400以下的大專;
原始測驗資料如下:

查詢陳述句:

5.指定資料快斬訓備份
如果要對表進行快照,即將當前表的資料復制到新表,則可以將CREATE TABLE和SELECT結合使用:
-- Yes class_id=1(The records of the first shift) are snapshot and stored as new tables students_of_class1:CREATE TABLE students_of_class1 SELECT * FROM student WHERE class_id=1;
新創建的表結構與SELECT使用的表結構完全相同,
6.撰寫查詢結果集
如果查詢結果集需要寫入表中,則可以將INSERT和SELECT組合以將SELECT陳述句的結果集直接插入到指定表中,
例如,創建一個統計表以記錄每個班級的平均分數:
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;
7.強制指定索引
查詢時,資料庫系統將自動分析查詢陳述句并選擇最合適的索引,但是在許多情況下,資料庫系統的查詢優化器并不總是使用最佳索引,如果我們知道如何選擇索引,則可以使用FORCE INDEX強制查詢使用指定的索引,例如:
SELECT * FROM students FORCE INDEX (idx_class_id) WHERE class_id = 1 ORDER BY id DESC;
指定索引的前提是索引idx_class_id必須存在,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/244193.html
標籤:MySQL
上一篇:抖音資料采集教程,Android群控黑盒呼叫,Sekiro使用手冊
下一篇:MySQL中最實用的SQL陳述句
