在 sql中 多行sql语句怎么执行,是从上往下 还是从下往上??????求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 sql中 多行sql语句怎么执行,是从上往下 还是从下往上??????求解相关的知识,希望对你有一定的参考价值。

SQL不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中, 代码按编码顺序被处理。但在SQL语句中,第一个被处理的子句式FROM,而不是第 一出现的SELECT。SQL查询处理的步骤序号:(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
2 (1) FROM <left_table>
3 (3) <join_type> JOIN <right_table>
4 (2) ON <join_condition>
5 (4) WHERE <where_condition>
6 (5) GROUP BY <group_by_list>
7 (6) WITH CUBE | ROLLUP
8 (7) HAVING <having_condition>
9 (10) ORDER BY <order_by_list>
以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这 些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的 表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。
逻辑查询处理阶段简介:
1、 FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表 VT1。
2、 ON:对VT1应用ON筛选器,只有那些使为真才**入到TV2。
3、 OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN) ,保留表中未找到匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包 含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤 3,直到处理完所有的表位置。
4、 WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。
5、 GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5 。
6、 CUTE|ROLLUP:把超组插入VT5,生成VT6。
7、 HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。
8、 SELECT:处理SELECT列表,产生VT8。
9、 DISTINCT:将重复的行从VT8中删除,产品VT9。
10、ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标 (VC10)。
11、TOP:从VC10的开始处选择指定数量或比例的行,生成表TV11,并返回给 调用者。
此文转载:中国IT实验室
参考技术A 自上而下,从内而外。这要看你的语句结构形式。 参考技术B 楼上正解

oracle执行多条语句

需要同时执行多条语句: create table 和insert into table select from…。但是pl/sql developer 9.0 下单个语句执行都没问题,两句放一块就不行,尝试了直接分号隔开、begin end。
即使最简单的两个create 也不行。
如 create table a(id number(1)); create table b(id number(1)); ORA-00911: 无效字符

begin
create table a(id number(1));
create table b(id number(1));
end;
则一直换行换行,没反应。

参考技术A 你是在sql window里执行的多条语句,应该换成command windows
新建一个command window ,把所有语句粘贴进去,就可以执行多条语句了追问

我是在命令窗口执行的。

追答

加个 / 就执行了

追问

请问在哪里加,我刚接触oracle

追答

现在你在8行后加个 / 就执行了
这两个建表语句可以不用begin和end,把它们分成两行,贴到命令窗口和"编辑器"里,F8执行
或者在当前这个对话框里粘贴分成两行的语句
create table a (id number(1));
create table b (id number(1));

追问

谢谢,原来编辑器是这么个意思,不过begin end 还有问题,想学习一下,相当于两个问题了,我会提高悬赏的,希望你能帮我解答

追答

你把它保存成.sql文件,这就是所谓的脚本,DDL语句是不需要begin...end的

本回答被提问者采纳
参考技术B create table a(id number(1));
create table b(id number(1));
就这样就可以,不要写在同一行,即使有分号也不行,也没有必要用begin……end追问

谢谢,但是一楼回答的最快,也解决了我的问题

参考技术C

使用直接的DDL语句,存储过程是不能编译通过的。可以使用折中方法:

begin
execute immediate 'create table a(id number(1))';
execute immediate 'create table b(id number(1))';
end;
/

 

参考技术D create table a(id number(1));
/
create table b(id number(1));
/

以上是关于在 sql中 多行sql语句怎么执行,是从上往下 还是从下往上??????求解的主要内容,如果未能解决你的问题,请参考以下文章

看懂Explain,找准SQL优化点,以参数为准

看懂Explain,找准SQL优化点,以参数为准

TestNG

怎么在Oracle中写执行sql的sql语句?

mysql执行的sql脚本中,注释怎么写?

Mysql执行计划功能详解