千家信息网

MySQL中特别实用的SQL语句分享

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"MySQL中特别实用的SQL语句分享",在日常操作中,相信很多人在MySQL中特别实用的SQL语句分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"M
千家信息网最后更新 2026年11月01日MySQL中特别实用的SQL语句分享

这篇文章主要介绍"MySQL中特别实用的SQL语句分享",在日常操作中,相信很多人在MySQL中特别实用的SQL语句分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"MySQL中特别实用的SQL语句分享"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

实用的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语句分享"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

语句 索引 数据 用户 查询 新记录 实用 情景 皮肤 会员 字段 数据库 结果 学习 更新 事项 快照 成绩 注意事项 示例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡豆 互联网金融科技 博彦科技互联网金融 互联网科技工作委员会副主任毛军 广州百单互联网科技有限公司 关于新基建和互联网科技 互联网与新科技 百单互联网科技有限公司 互联网 视角下的科技创新 互联网科技公司有哪些 济南和联互联网科技有限公司 广州慧亚互联网科技怎么样 顶级互联网科技成果有哪些 民营互联网公司国防科技 西安小鹰速贷互联网科技有限公司 科技互联网海报 元气玛特互联网科技公司是外包吗 互联网科技股为什么大涨 上海同邻互联网科技有限公司规模 网互联网络科技 华服互联网科技靠谱吗 互联网科技工作委员会主任 互联网科技活动banner 互联网女皇 腾讯科技 海南科技产业互联网平台 互联网科技革命什么开始 华中科技大学互联网的牛人 21世纪互联网科技成就 北京互联网科技类企业分布 绵阳真晨互联网科技有限公司
0