第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > mysql 如何优化sql语句 如何优化SQL?MySQL中超实用的SQL语句送给大家

mysql 如何优化sql语句 如何优化SQL?MySQL中超实用的SQL语句送给大家

时间:2023-05-13 13:56:14

相关推荐

mysql 如何优化sql语句 如何优化SQL?MySQL中超实用的SQL语句送给大家

如何优化SQL?MySQL中超实用的SQL语句送给大家

如何优化SQL?MySQL中超实用的SQL语句送给大家

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

目录实用的SQL1.插入或替换

2.插入或更新

3.插入或忽略

4.SQL中的if-else判断语句

5.指定数据快照或备份

总结

实用的SQL

[var1]

如果我们想插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。

情景示例:这张表存的每个客户最近一次交易订单信息,要求保证单个用户数据不重复录入,且执行效率最高,与数据库交互最少,支撑数据库的高可用。

此时,可以使用"REPLACE INTO"语句,这样就不必先查询,再决定是否先删除再插入。

"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的!

注意事项:如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。

-- 20点充值

REPLACE INTO last_transaction (transId,username,amount,trans_time,remark)

VALUES (null, 'chenhaha', 30, '-06-11 20:00:20', '会员充值');

-- 21点买皮肤

REPLACE INTO last_transaction (transId,username,amount,trans_time,remark)

VALUES (null, 'chenhaha', 100, '-06-11 21:00:00', '购买盲僧至高之拳皮肤');

若username='chenhaha’的记录不存在,REPLACE语句将插入新记录(首次充值),否则,当前username='chenhaha’的记录将被删除,然后再插入新记录。

id不要给具体值,不然会影响SQL执行,业务有特殊需求除外。

[var1]

如果我们希望插入一条新记录(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, '-06-11 20:00:20', '充会员')

ON DUPLICATE KEY UPDATE total_amount=total_amount + 30, last_transTime='-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, '-06-11 20:00:20', '购买盲僧至高之拳皮肤')

ON DUPLICATE KEY UPDATE total_amount=total_amount + 100, last_transTime='-06-11 21:00:00', last_remark ='购买盲僧至高之拳皮肤';

若username='chenhaha’的记录不存在,INSERT语句将插入新记录,否则,当前username='chenhaha’的记录将被更新,更新的字段由UPDATE指定。

[var1]

如果我们希望插入一条新记录(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, '-06-11 20:00:20');

-- 二次添加,直接忽略

INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time)

VALUES (null, 'chenhaha', '男', 12, 0, '-06-11 21:00:20');

若username='chenhaha’的记录不存在,INSERT语句将插入新记录,否则,不执行任何操作。

[var1]

众所周知,if-else判断在任何地方都很有用,在SQL语句中,"CASE WHEN … THEN … ELSE … END"语句可以用在增删改查各类语句中。

给个情景:妇女节大回馈,注册的新用户,所有成年女性账号送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 >= '-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;

查询结果:

[var1]

如果想要对一个表进行快照,即复制一份当前表的数据到一个新表,可以结合CREATE TABLE和SELECT:

-- 对class_id=1(一班)的记录进行快照,并存储为新表students_of_class1:

CREATE TABLE students_of_class1 SELECT * FROM student WHERE class_id=1;

新创建的表结构和SELECT使用的表结构完全一致。

总结

好的sql语句不仅可以提高代码执行效率,还可以为自己节省更多的工作成本,何乐而不为呢!分享知识,努力进步,关注我,每天给大家带来新的知识!

如何优化SQL?MySQL中超实用的SQL语句送给大家相关教程

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。