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

相关文章
相关标签/搜索