SELECT语句 - 语法顺序:

SELECT
DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>

数据库引擎放弃索引进行全表扫描:

1. 尽量避免在字段开头模糊查询

优化前:
SELECT * FROM t WHERE username LIKE '%陈%'
优化后:
SELECT * FROM t WHERE username LIKE '陈%'
SELECT * FROM t WHERE instr(username,'陈')>0;

2. 尽量避免使用in 和not in

优化前:
SELECT * FROM t WHERE id IN (2,3);
select * from A where A.id in (select id from B);
优化后:
select * from A where exists (select * from B where B.id = A.id);
进一步优化(查询结果无法包含B中的字段):
select * from A left semi join B on B.id = A.id;

3. 尽量避免使用 or

优化前:
SELECT * FROM t WHERE id = 1 OR id = 3
优化后:
SELECT * FROM t WHERE id = 1UNION
SELECT * FROM t WHERE id = 3

4. 尽量避免进行null值的判断

优化前:
SELECT * FROM t WHERE score IS NULL
优化后:
SELECT * FROM t WHERE score = 0

5. 尽量避免在where条件中等号的左侧进行表达式、函数操作

优化前:
SELECT * FROM T WHERE score/10 = 9
优化后:
SELECT * FROM T WHERE score = 10*9

6. 当数据量大时,避免使用where 1=1的条件

优化前:
SELECT username, age, sex FROM T WHERE 1=1
优化后:
用代码拼装sql时进行判断,没 where 条件就去掉 where

7. 查询条件不能用 <> 或者 !=
使用索引列作为条件进行查询时,需要避免使用<>或者!=等判断条件。
如确实业务需要,使用到不等于符号,需要在重新评估索引建立,避免在此字段上建立索引,改由查询条件中其他索引字段代替。

SELECT语句其他优化:

1. 避免出现select *
2. 多表关联查询时,小表在前,大表在后
3. 使用表的别名
4. 调整Where字句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,将过滤数据多的条件往后放
MySQL采用自上而下的顺序解析WHERE子句,将过滤数据多的条件往前放

增删改 DML 语句优化:

优化前:
insert into T values(1,2);
insert into T values(1,3);
insert into T values(1,4);
优化后:
Insert into T values(1,2),(1,3),(1,4);

查询条件优化:

1. 对于复杂的查询,可以使用中间临时表 暂存数据

2. 优化join语句

优化前:
SELECT col1 FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
优化后:
SELECT col1 FROM customerinfo LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo.CustomerID WHERE salesinfo.CustomerID IS NULL

3. 优化union查询
除非确实要消除重复的行,否则建议使用union all

4. 使用truncate代替delete

建表优化:

1. 在表中建立索引,优先考虑where、order by使用到的字段
2. 尽量使用数字型字段(如性别,男:1 女:2)
3. 用varchar/nvarchar 代替 char/nchar
4. 查询数据量大的表会造成查询缓慢。主要的原因是扫描行数过多

优化前:
SELECT * FROM infoTab ORDER BY ID ASC
优化后:
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t WHERE t.rowid > 100000 AND t.rowid <= 100050

实用SQL案例

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

-- 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', '购买盲僧至高之拳皮肤');

2.插入或更新
如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录

-- 用户陈哈哈充值了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 ='购买盲僧至高之拳皮肤';

3.插入或忽略
如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就啥事也不干直接忽略

-- 用户首次添加
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');

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

-- 送红包语句
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'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;

数据开发-SQL语句优化及实用SQL案例相关推荐

  1. 【转】sql语句优化工具LECCO SQL Expert

    软件说明: 更优更快 人工智能自动SQL优化----------http://www.sina.com.cn 2001/12/12 17:48 中国电脑教育报文/SQL爱好者 所谓SQL,就是指Str ...

  2. Sql语句优化之explan分析案例

    ① extra =  Using temporary; Using filesort; sql : EXPLAIN SELECT vtiger_account.accountname, IF(prot ...

  3. SQL语句优化技术分析

    SQL语句优化技术分析 操作符优化 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用 ...

  4. 提高系统性能——对SQL语句优化的思考

    软件在研发的过程中自始至终都在留意着系统的可扩展性.但与此同一时候也在关注着系统的性能,SQL语句作为系统性能的一环不容忽视.从今天開始结合开发的经验,谈一下我对SQL语句优化的理解和认知: 1.在联 ...

  5. 【腾讯面试题】SQL语句优化方法有哪些?

    SQL语句优化 性能不理想的系统中,除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂 ...

  6. sql 一个字段在另外一个表没出现_都9012年啦,不懂得这些SQL语句优化,你是要吃大亏的...

    引言 数据库的性能优化技术一直是个老生常谈的问题,不管是MySQL.SQL Server还是Oracle. 对于我们IT开发人员和运维人员,掌握常用的SQL 优化语句是非常必要的,它可以使你的工作变得 ...

  7. MySQL优化之三:SQL语句优化

    一 SQL语句优化的一般步骤: 1 通过show status命令了解各种SQL语句的执行频率 mysql> show status;                #show status:显 ...

  8. sql like 多个条件_都9012年啦,不懂得这些SQL语句优化,你是要吃大亏的

    引言 数据库的性能优化技术一直是个老生常谈的问题,不管是MySQL.SQL Server还是Oracle. 对于我们IT开发人员和运维人员,掌握常用的SQL 优化语句是非常必要的,它可以使你的工作变得 ...

  9. 秋色园QBlog技术原理解析:性能优化篇:打印页面SQL,全局的SQL语句优化(十三)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

最新文章

  1. 关于 RMAN 备份 数据块 一致性的讨论
  2. java 外部类似_[求指点] 如何用java 实现类似linux中管道调用外部程序的功能
  3. numpy 修改数据类型
  4. Golang 解决unsupported protocol scheme问题
  5. java类编写sql_用JavaBean编写SQL Server数据库连接类
  6. python 个人所得税问题_Python实现的个人所得税计算器
  7. SpringBoot集成Redis缓存
  8. 数学之美_正态分布(详解)
  9. Linux命令之grep
  10. 2011年Esri用户大会技术亮点总结之一:概览
  11. 国美云运维自动化实践
  12. 程序员自我介绍如何出彩?面试「万能模板」快拿走!
  13. 解读联想重组:终于裁员了
  14. DW个人网站设计 练习作业
  15. 暗黑破坏神(DIABLOII 1.11B)BOT下载
  16. 华宇软件华为鸿蒙,舒华体育携手华为打造:全球首款搭载鸿蒙操作系统跑步机面世...
  17. 单片机c语言什么是ea,单片机ie是什么?怎么用?
  18. C语言计算机图形学平移代码,计算机图形学之二维平移旋转缩放代码
  19. CSS top、margin-top和padding-top的区别
  20. GPON ITU-T G.xxx 标准协议下载

热门文章

  1. FineReport单元格扩展与父子格设置
  2. sql语句之when then 使用
  3. 【LeetCode】—— 最近公共祖先
  4. 如何高效学习3D视觉?涉及点云处理/相机标定/三维重建/SLAM/结构光/深度估计...
  5. python金融数据分析与挖掘实战 黄恒秋_Python金融数据分析与挖掘实战
  6. fpga——浮点数加减法
  7. 如何处理EDIUS打不开jpg格式的图片的问题
  8. Pr 入门教程如何录制画外音?
  9. Struts2项目实战 微云盘(二):项目结构
  10. Reshape的命令应用