set trans 必须是事务处理的第一个语句_MySQL中特别实用的几种SQL语句送给大家

在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑。减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮。

实用的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_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_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以下大专;

原测试数据如下:a7afdb1e9a47229be85f9d7a531f1087.png
查询语句:

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;

05e82802143ef0ec8594fdecf5496b25.png

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 Server2014安装图文详解

Mysql安装图文详解!手把手教会您从下载到安装成功

Oracle安装图文详解!手把手教会您从下载到安装成功

f5119ad3fa762f5e944ab5ec7655635a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言预处理命令总结

预处理指令是以#号开头的代码行&#xff0c;# 号必须是该行除了任何空白字符外的第一个字符。# 后是指令关键字&#xff0c;在关键字和 # 号之间允许存在任意个数的空白字符&#xff0c;整行语句构成了一条预处理指令&#xff0c;该指令将在编译器进行编译之前对源代码做某些转…

突破极限–如何使用AeroGear Unified Push for Java EE和Node.js

在2014年底的AeroGear队宣布红帽的JBoss统一推送服务器的可用性xPaaS 。 让我们仔细看看&#xff01; 总览 统一推送服务器允许开发人员将本地推送消息发送到Apple的推送通知服务&#xff08;APNS&#xff09;和Google的云消息传递&#xff08;GCM&#xff09;。 它具有内置的…

mysql 分词搜索_实战 | canal 实现Mysql到Elasticsearch实时增量同步

题记关系型数据库Mysql/Oracle增量同步Elasticsearch是持续关注的问题&#xff0c;也是社区、QQ群等讨论最多的问题之一。 问题包含但不限于&#xff1a; 1、Mysql如何同步到Elasticsearch? 2、Logstash、kafka_connector、canal选型有什么不同&#xff0c;如何取舍&#xff1…

C memset 踩坑

一、前言memset 作为对内存初始化的函数&#xff0c;还是有不少坑和误区的&#xff0c;今天就来对这个函数作一个总结。二、函数作用最简单的调用就是将一个数组清零&#xff0c;代码如下&#xff1a;const int maxn 1024; int a[maxn]; memset(a, 0, sizeof(a)); // a[0]a[1…

eap和psk_针对WildFly和EAP运行Java Mission Control和Flight Recorder

eap和pskJava Mission Control &#xff08;JMC&#xff09;使您可以监视和管理Java应用程序&#xff0c;而无需引入通常与这些类型的工具相关的性能开销。 它使用为正常的JVM动态优化而收集的数据&#xff0c;从而形成了一种非常轻量级的方法来观察和分析应用程序代码中的问题…

C语言合法标识符

Problem Description输入一个字符串&#xff0c;判断其是否是C的合法标识符。Input输入数据包含多个测试实例&#xff0c;数据的第一行是一个整数n,表示测试实例的个数&#xff0c;然后是n行输入数据&#xff0c;每行是一个长度不超过50的字符串。Output对于每组输入数据&#…

线程魔术技巧:使用Java线程可以做的5件事

Java线程最鲜为人知的事实和用例是什么&#xff1f; 有些人喜欢爬山&#xff0c;有些人喜欢跳伞。 我&#xff0c;我喜欢Java。 我喜欢它的一件事是&#xff0c;您永不停止学习。 您每天使用的工具通常可以为您带来全新的面貌&#xff0c;以及您还没有机会看到的方法和有趣的用…

java webview框架_java - Android WebView 无法正常显示网页图表

Android客户端中混搭HTML页面&#xff0c;会出现虽然HTML内容载入完成&#xff0c;标题也正常显示&#xff0c;但是整个网页需要等到近5秒(甚至更多)时间才会显示出来。研究了很久&#xff0c;搜遍了国外很多网站&#xff0c;也看过PhoneGap的代码&#xff0c;一直无解。 …

每日干货丨C语言数组知识点总结

一&#xff0e;一维数组1. 初始化方法第一种&#xff1a;完全初始化。依次赋值如&#xff1a;a[5] {2&#xff0c;3&#xff0c;4, 5, 6}&#xff1b;a[] {1&#xff0c;2, 3, 4, 5, 6};第二种&#xff1a;不完全初始化。初始化式中的值从a[0]开始&#xff0c;依次向后赋值&a…

C语言指南-数组之谜

前言在C语言中&#xff0c;数组和指针似乎总是“暧昧不清”&#xff0c;有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。数组回顾在分析之前&#xff0c;我们不妨回顾一下数组的知识。数组是可以存储一个固定大小的相同类型元素的顺序集合。为了便于我们…

python生成uuid_咸鱼高赞回答:有什么相见恨晚的Python技巧,附赠python最新教程...

日常工作几乎离不python。一路走来&#xff0c;他积累了不少有用的技巧和tips&#xff0c;现在就将这些技巧分享给大家。这些技巧将根据其首字母按A-Z的顺序进行展示。Python相关学习资料获取方式&#xff1a;转发文章关注私信【Python】ALL OR ANYPython之所以成为这么一门受欢…

java用十字链表实现无向图_实验四:图的实现与应用

20162317袁逸灏 实验四&#xff1a;图的实现与应用实验内容用邻接矩阵十字链表实现无向图中的添加结点删除结点添加边删除边size()isEmpty()广度优先迭代器深度优先迭代器方法实验要求实验1&#xff1a;用邻接矩阵实现无向图(边和顶点都要保存)&#xff0c;实现在包含添加和删除…

C语言指针变量的运算

前言指针变量也是可以进行运算的&#xff0c;如指针变量对其自身加上某个整数或减去某个整数&#xff0c;这在内存上体现为&#xff1a;相对这个指针向后偏移多少个单位或向前偏移了多少个单位&#xff0c;这里的单位与指针变量的类型有关。在32bit环境下&#xff0c;int类型占…

关于n对角矩阵数据结构_机器学习与线性代数 - 特殊矩阵

在线性代数中&#xff0c;有一些特殊的矩阵具有易于分析和操作的特性。它们的特征向量可能具有特定的特征值或特殊关系。还有一些方法可以将一个矩阵分解成这些“更简单”的矩阵。操作复杂性的降低提高了可伸缩性。然而&#xff0c;即使这些矩阵都是特殊的&#xff0c;它们也不…

C语言内存/指针相关

内存数据类型–更好的内存管理数据类型&#xff1a;固定大小内存的别名typedef结构体的别名 typedef struct Student MyStudent给指针起别名 typedef char * PCHAR给变量起别名 typedef longlong mylong_t注意&#xff1a;void类型不能typedefvoid只能对函数返回和参数的限定vo…

求杨辉三角的前n行数据_LeetCode算法第118题:杨辉三角

题目描述&#xff1a;给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。示例:输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]思路&#xff1a;杨辉三角形有如下两个特性每一行的第…

jasmine单元测试_使用Jasmine,Spock和Nashorn测试JVM服务器端JavaScript

jasmine单元测试JavaScript使用不仅限于浏览器中的客户端代码或NodeJS支持的服务器端代码。 许多基于JVM的项目都将其用作内部脚本语言。 测试这种功能既不简单也不标准。 在本文中&#xff0c;我打算演示一种使用成熟的工具&#xff08;例如Jasmine &#xff0c; Spock和Nasho…

常用于单片机的接口适配器模式C语言实现

一般实现在我们做项目的时候&#xff0c;一般的实现&#xff0c;可能我们会这样写代码// FileName: test.c// 来源&#xff1a;公众号【技术让梦想更伟大】#include#include “ExternModule.h” int main(void){/*初始化*/ vAllInit(); while(1) { /*项目逻辑*/ vLo…

ar面部识别_国内手机厂商AR布局报告

欢迎关注AIRX的B站官方账号&#xff1a;AIRX社区&#xff0c;我们会定期和一些ARVR、AI企业和高校合作直播&#xff0c;分享前沿ARVR、AI、Unity、Unreal技术和教程。招运营、UI设计志愿者进行时&#xff0c;我们期待您的加入&#xff5e;文章来源 &#xff1a;增强现实核心技术…

rest服务swagger_在Java EE 7上骑骆驼–带有Swagger文档的REST服务

rest服务swagger骆驼开箱即用。 Swagger集成就是其中之一。 不幸的是&#xff0c;大多数已经存在的功能都严重依赖于Spring。 但这并不能阻止我们在普通的Java EE 7应用程序中使用它们&#xff0c;因为有时它只是更轻量级的处理方式。 但是我不想再对此进行讨论。 相反&#xf…