oracle sql 语句执行顺序
如:select(选择示列),from,where,groupby,having,orderby;where里面条件and是先执行and前面还是后面条件还有or谢谢解答a...
如: select(选择示列) ,from ,where, group by ,having, order by;
where 里面条件 and 是先执行 and 前面 还是后面条件
还有 or
谢谢解答
and 执行顺序 跟数据库有关系没 如:oracle sql server mysql 他们的顺序是一样吗 展开
where 里面条件 and 是先执行 and 前面 还是后面条件
还有 or
谢谢解答
and 执行顺序 跟数据库有关系没 如:oracle sql server mysql 他们的顺序是一样吗 展开
展开全部
where 里面条件 and 是先执行 and 前面 还是后面条件
这个其实和你写的顺序不大,这个先后顺序,是数据库来根据表/索引的信息来决定的。
例如一个 学生表, 有学号,姓名,性别
其中 学号是主键, 姓名上面有个索引。
找 名字叫 强妹 的女生:
SELECT * FROM 学生 WHERE 姓名='强妹' AND 性别 = '女'
与
SELECT * FROM 学生 WHERE 性别 = '女' AND 姓名='强妹'
数据库在处理 SQL 以前,都会去分析, 发现 查询的条件中, 姓名上面有索引,而性别上面没有。 那么优先根据 姓名的条件, 去检索,然后再去把通过索引得到的数据,去筛选 性别=女的
比如表里面共有10000行。姓名叫 '强妹' 的只有一个。
那么通过索引,一步就定位到那一行。
然后再判断这一行数据的 性别字段, 是不是 = '女'
假如 姓名/性别 都没有索引呢?
那就是执行 全表扫描。
不分先后。
什么意思呢?
就是假如 表里面10000行数据。
那就是从第一行开始, 查看 姓名与性别 条件。 满足的返回。 不满足的丢弃。 直到100行都处理完。
并不是一口气把所有的数据,都放到内存里面,然后 姓名判断一次, 去掉部分, 性别判断一次,再去掉部分。
这个其实和你写的顺序不大,这个先后顺序,是数据库来根据表/索引的信息来决定的。
例如一个 学生表, 有学号,姓名,性别
其中 学号是主键, 姓名上面有个索引。
找 名字叫 强妹 的女生:
SELECT * FROM 学生 WHERE 姓名='强妹' AND 性别 = '女'
与
SELECT * FROM 学生 WHERE 性别 = '女' AND 姓名='强妹'
数据库在处理 SQL 以前,都会去分析, 发现 查询的条件中, 姓名上面有索引,而性别上面没有。 那么优先根据 姓名的条件, 去检索,然后再去把通过索引得到的数据,去筛选 性别=女的
比如表里面共有10000行。姓名叫 '强妹' 的只有一个。
那么通过索引,一步就定位到那一行。
然后再判断这一行数据的 性别字段, 是不是 = '女'
假如 姓名/性别 都没有索引呢?
那就是执行 全表扫描。
不分先后。
什么意思呢?
就是假如 表里面10000行数据。
那就是从第一行开始, 查看 姓名与性别 条件。 满足的返回。 不满足的丢弃。 直到100行都处理完。
并不是一口气把所有的数据,都放到内存里面,然后 姓名判断一次, 去掉部分, 性别判断一次,再去掉部分。
追问
在没得索引 应该有关系吧
追答
如果没有索引的话, 我感觉上,条件写前写后,差别应该不会太大
下面是一个测试的例子,仅供参考
SQL> CREATE TABLE my_test AS SELECT * FROM all_objects;
表已创建。
对比分析的结果: [字数限制,删除了部分信息]
SELECT
COUNT(1)
FROM
my_test
WHERE
owner = 'TEST' AND object_name = 'MY_TEST'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.01 0 690 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 61 (TEST)
Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE (cr=688 pr=0 pw=0 time=3790 us)
1 TABLE ACCESS FULL MY_TEST (cr=688 pr=0 pw=0 time=3749 us)
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT MODE: ALL_ROWS
1 SORT (AGGREGATE)
1 TABLE ACCESS (FULL) OF 'MY_TEST' (TABLE)
SELECT
COUNT(1)
FROM
my_test
WHERE
object_name = 'MY_TEST' AND owner = 'TEST'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.00 0 689 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 61 (TEST)
Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE (cr=688 pr=0 pw=0 time=6035 us)
1 TABLE ACCESS FULL MY_TEST (cr=688 pr=0 pw=0 time=5997 us)
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT MODE: ALL_ROWS
1 SORT (AGGREGATE)
1 TABLE ACCESS (FULL) OF 'MY_TEST' (TABLE)
展开全部
oracle 是先执行 and 后面的,是因为解析sql语句的编译器是从右往左编译
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当然会有关系的,首先and越多条件越细,这样数据库检索的速度会更快 where 里面如果没有括号限制,则先执行优先级高的,and 、or
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
执行顺序和数据库有关,不同的数据库有不同的解析顺序。
ORACLE是从后往前解析的,也就是先解析and后面的。
但是在调优上,ORACLE版本是基于CBO规则的(比如10G)就可以不考虑and的先后顺序调优,如果是基于RBO规则(比如8i),调整ANd的先后顺序可以达到优化的效果。
ORACLE是从后往前解析的,也就是先解析and后面的。
但是在调优上,ORACLE版本是基于CBO规则的(比如10G)就可以不考虑and的先后顺序调优,如果是基于RBO规则(比如8i),调整ANd的先后顺序可以达到优化的效果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
SQL语句从语句结束的位置,从右向左执行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询