oracle中sql语句的执行顺序,sql优化

一.sql语句执行顺序

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算( 平均值:avg
最小值:min
最大值:max
总和:sum
计数:count)
5、使用having子句筛选分组;
6、计算所有的表达式,select 的字段;
7、使用order by对结果集进行排序。

二.sql优化(只列举部分内容)

1.where子句使用 != 或 <> 操作符

索引将被放弃使用,会进行全表查询

例如:SELECT id FROM A WHERE id != 2

改为:SELECT id FROM A WHERE id <2 OR id >2
2.where子句中使用 IS NULL 或 IS NOT NULL

索引将被放弃使用,会进行全表查询

例如:SELECT id FROM A WHERE state IS NULL
改为:
可以state上设置默认值0,确保表中state没有null值
SELECT id FROM A WHERE state =0
3.where子句使用or

使用了or索引将被放弃使用

例如:SELECT id FROM A WHERE num =2 or num =3
改为:
使用union all 或 union
SELECT id FROM A WHERE num =2 
Union
SELECT id FROM A WHERE num =3
4.where子句使用IN 或 NOT IN
  • 4.1使用between替换in
例如:SELECT id FROM A WHERE num in(1,2,3,4)
改为:SELECT id FROM A WHERE num between 1 and 4
  • 4.2使用exists替换in
例如:SELECT id FROM A WHERE num in(select num from student )
改为:SELECT id FROM A WHERE num exists(select 1 from student stu where stu.num =A.num )
  • 4.3left join替换in
例如:SELECT id FROM A WHERE num in(select num from student )
改为:SELECT id FROM A left join student stu on stu.num =A.num 
5.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引
6.Like语句

不要在关键词前加%,优化成如下‘%张%’

SELECT id FROM A WHERE name like ‘张%’
7.减少使用select * from table,写出具体的字段名字
8.可以在复杂的查询中创建临时表来存放数据,创建方法: with 临时表的名字 as (sql语句)

你可能感兴趣的:(数据库)