MySQL中最實用的SQL語句

前言:在編寫SQL時,咱們常常靈活地使用一些SQL語句編寫語句,從而能夠大大簡化程序邏輯。減小程序與數據庫之間的交互次數,這有利於數據庫的高可用性。數據庫

實用SQL語句:學習

1.插入或更換

若是咱們要插入新記錄(INSERT),可是若是該記錄已經存在,請先刪除原始記錄,而後再插入新記錄。測試

場景示例:須要使用此表中存儲的每一個客戶的最新交易訂單信息,以確保不重複輸入單個用戶的數據,執行效率最高,與數據庫的交互最少,而且數據庫是高度可用的。優化

此時,能夠用「 REPLACE INTO」語句,這樣就沒必要先查詢,而後再決定是否先刪除和插入。spa

「REPLACE INTO」語句基於惟一索引或主鍵來肯定其是否惟一。code

注意:如如下SQL所示,在用戶名字段中建立惟一索引,而且能夠自動增長transId設置。blog

-- 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執行將受到影響。ip

2.插入或更新

若是咱們要插入新記錄(INSERT),可是若是該記錄已經存在,請更新該記錄。這時,能夠用「 INSERT into ......重複密鑰更新...」語句:rem

方案示例:此表存儲用戶的歷史充值金額。若是用戶是第一次充電,將添加新的數據。若是用戶是第一次充值,將累積歷史充值量。必須確保不會重複輸入單個用戶的數據。

-- 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必須存在。

相關文章
相關標籤/搜索