SQL Select语句完整的执行顺序
Sql代码
SQL> select sal,comm from emp
2 where sal<2000;
SAL COMM
---------- ----------
800
1600 300
1250 500
1250 1400
1500 0
1100
950
1300
8 rows selected.
SQL> select sal as salary,comm as commission from emp
2 where salary<2000;
where salary<2000
*
ERROR at line 2:
ORA-00904: "SALARY": invalid identifier
SQL> select * from
2 (
3 select sal as salary,comm as commission from emp
4 ) x
5 where salary<2000;
SALARY COMMISSION
---------- ----------
800
1600 300
1250 500
1250 1400
1500 0
1100
950
1300
8 rows selected.
将取别名的查询作为内联视图,便可以在外部查询中引用其中的别名列。为什么要这么做呢?WHERE子句是在SELECT之前进行处理的,这样,在处理求解 “问题”查询的WHERE子句之前,SALARY和COMMISSION并不存在,要到WHERE子句处理完成之后,别名才生效。然而,FROM子句是在 WHERE之前处理的。将原查询放在FROM子句中,那么,在最外层的WHERE子句之前,以及最外层的WHERE子句“看到”别名之前,就已经生成了查 询结果。
(2008-06-2500:35:26)
转载
标签: |
|
SQL Select语句完整的执行顺序:
1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选分组;
Select语句完整的执行顺序:SQL Select语句完整的执行顺序: 1、 from子句组装来自不同数据源的数据;
以下结论是通过在Sql Server2000上的实验得出的结论,也可通过查看估计的执行计划(Ctrl+L)来查看执行顺序。 1.先执行等号(=)左边是变量的表达式(A类),再执行等号(=)左边是列名的表达式(B类)。例:update tablename set columnName=@variable,@variable=@variable+1 先执行@variable=@variable+1,再执行columnName=@variable 2.如果有多个A类(或B类)表达式,按从左到右顺序执行A类(或B类)表达式。例:update tablename set columnName=@variable,@variable=@variable+1,@variable=2*@variable 先执行@variable=@variable+1,再执行@variable=2*@variable,最后执行columnName=@variable 3.列名所代表的值永远是原值。 例:update tablename set columnName=colunName+1,columnNameBa group by 在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数select max(sal),job emp group by job;(注意max(sal),job的job并非一定要出现,但有意义)查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno; 当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件 查询每个部门的每种职位的雇员数 Oracle SQL 性能优化技巧 1.选用适合的ORACLE优化器 A、RULE (基于规则) b、COST (基于成本) c、CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。你当然也在SQL句级或是会话(session)级对其进行覆盖。 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。 在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) ,你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。 2.访问Table的方式 3.共享SQL语句 可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。 数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。 当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。 数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。 共享的语句必须满足三个条件: A、 字符级的比较:当前被执行的语句和共享池中的语句必须完全相同。 B、 两个语句所指的对象必须完全相同: C、两个SQL语句中必须使用相同的名字的绑定变量(bind variables)。 4.选择最有效率的表名顺序(只在基于规则的优化器中有效) 如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。 5.WHERE子句中的连接顺序 6.SELECT子句中避免使用 ' * ' 7.减少访问数据库的次数 8.使用DECODE函数来减少处理时间 9.整合简单,无关联的数据库访问 10.删除重复记录 11.用TRUNCATE替代DELETE 而当运用TRUNCATE时,回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复。因此很少的资源被调用,执行时间也会很短。 12.尽量多使用COMMIT COMMIT所释放的资源: A、 回滚段上用于恢复数据的信息。 B、被程序语句获得的锁。 C、 redo log buffer 中的空间。 D、ORACLE为管理上述3种资源中的内部花费。 13.计算记录条数 14.用Where子句替换HAVING子句 15.减少对表的查询 16.通过内部函数提高SQL效率。 17.使用表的别名(Alias) 18.用EXISTS替代IN 19.用NOT EXISTS替代NOT IN 20.用表连接替换EXISTS 21.用EXISTS替换DISTINCT |