标签归档:动态查询

ABAP程序的数据查询语句SELECT的那些事儿

通常使用Open SQL的数据查询语句SELECT将数据库条目选择到内存。
一.SELECT语句:
1)SELECT用于确定读取数据表中的哪些字段;
2)FROM子句用于确定从哪些内表或者视图中读取数据;
3)INTO用于确定将数据读取到程序内的哪些数据对象;
4)WHERE用于限定选择条件;
SELECT select_clause FROM from_clause INTO into_clause WHERE where_clause.
在传统的ABAP语言中,如果使用TABLES语句声明表工作区,则可省略INTO子句(此方法已经被ABAP Object禁用)
除以上4种外还有:
GROUP BY:用于将一组数据条目压缩为一个单行作为选择最终结果;
HAVING:用于限定ORDER BY子句子数据目组的选择条件;
ORDER BY:用于限定行排序;
SELECT整体语法结构:
SELECT <result> FROM <source> INTO <target> [WHERE <condition>] [GROUP BY <fields>] [HAVING <cond>] [ORDER BY <fields>].

二.选择单行数据:
如果只需要选取一个结果数据行,系统在数据库种找到第一个符合条件的数据条目时,就停止查询。单行选择需要在SELECT中使用SINGLE关键字,且INTO自居的结构必须为扁平结构:
SELECT SINGLE <RESULT> INTO <target> FROM <source> …
如果系统找到一个完全符合指定条件的行,SY-SUBRC返回0,否则返回4。
1.选择全部字段
一般不需要指明所有字段,而是在SELECT后用”*”符号,其中INTO语句种的目标对象最好与FROM种的类型相同。
2.选择指定字段
若指定多个数据对象,则需要将这些对象放在括号中,并用逗号隔开,而且其顺序需要与SELECT子句中指明的表字段顺序一致。
如果指定一个扁平结构作为目标对象,且该结构体中的字段多需要选择的字段,则可以使用INTO子句的CORRESPONDING FIELDS选项,该选项只会将SELECT子句中指明字段的内容传送到目标工作区的同名组建中。

三.选择多行数据
将符合条件的数据全部选取出,其语句结构也需要有相应变化,包括循环选择和选择至内表,两种情况。多行选择也可以使用“*”选择整行数据或指定要选择的字段列表。
1.循环选择
通过SELECT / ENDSELECT循环从数据库中读取多行。
SELECT [DISTINCT] <result>…<statement block> ENDSELECT.
注:使用DISTINCT自动去掉重复的行;SY-DBCNT(系统字段)为每次循环计数;对三塔tement block中语句块进行处理。
2.选择至内表
克刚变得一次性把数据选择到一个内表中去。
SELECT …INTO|APPENDING[CORRESPONDING FIELDS OF]TABLE itab.
注:该情况下SELECT并不启动循环,因而不需要使用ENDSELECT语句;如果itab非空,则SELECT语句将用读取的数据覆盖其中的内容,使用APPENDING代替INTO将布覆盖内表,若结构不完全相同,也可使用CORRESPONDING FIELDS选项将同名区域相对应。
3.指定选择包大小
包的大小指的是一次选择到内表的行数,可使用INTO子句的PACKAGE SIZE选项。
SELECT * … INTO TABLE itab PACKAGE SIZE n …
<statement block>
ENDSELECT.
注:由于指定了包的大小,该语句以循环的形式出现;如果n小于等于0,将出现运行是错误。

四.指定查询条件:
1.比较运算符:(=、<、>、<>、<=、>=及相应关键字)
WHERE … f <operator>g … //f为不带前缀数据表名称的字段名FROM中指定,g任意数据对象。
2.范围限定运算符:
WHERE … f[NOT]BETWEEN g1 AND g2 … //条目中f必须在g1与g2之间的值。
3.字符比较运算符:
WHERE f[NOT]LIKE g [ESCAPE h] … //数据条目中,字段f值必须符合g的模式。g中通配符“_”用于代替单个字符,“%”用于代替任意字符串(包含空串)。
注:可使用ESCAPE选项指定一个忽略符号(h),如果通配符前有忽略符号,那么通配符和忽略符号本身都失去了其功能,而是还原为本义。
4.检查列表值:
WHERE … f[NOT] IN (g1,…,gn)… //来价差数据库字段f中的值是否等于括号内列表中的一个值。
e.g. SELECT … WHERE city IN(‘beijing’,’rome’,’london’).
5.检查空值:
WHERE … f IS[NOT] NUll … //来判断数据库字段f中的值是否为空值。
注:在ABAP中,特定的数据对象都具有初始值,这些初始值可能是一串0或空格等,但不等同于数据库中的NULL值,因而使用ABAP语句添加数据条目时,所有的数据字段都不可能是空值。但在ABAP数据词典里仍有可能存在控制字段,因为Native SQL可以进行空值设置。
6.检查选择:
选择表是一种复杂而强大的逻辑表达式组合形式,其本身是一个内表,检查选择表意味着数据库字段f需满足所有逻辑表达式的组合。
WHERE … f [NOT] IN seltab …
其中seltab是选择标准表,是具有特定格式的内表,可以通过SELECT-OPTIONS语句添加到程序和报表选择屏幕,并由报表用户填充它。
查询条件也可在全部或者部分运行时动态指定,方法为在程序中将所有选择条件放置于一个内表中。
SELECT … WHERE <condition> AND (itab) …
内表itab金包含一个类型c组件且最大长度为72的字段。

五.夺标结合查询
应用程序需要从相关联的多个数据库表读取数据进行评估,此时需要用某些结合条件(字段)把各个数据库表连接起来。
1.SELECT语句嵌套:
2.FOR ALL ENTRIES选项:
Open SQL在WHERE子句中提供了FOR ALL ENTRIES附加项,选出符合已存在内表中所有满足条件的数据值:
SELECT … FOR ALL ENTRIES IN itab WHERE <condition> …
3.使用视图:
可通过视图(view)将多个数据库表的选择结合在同一个SELECT居于中进行。
4.结合查询(Join)
Inner Jion基本思想是如果主数据表和结合表中存在共同的字段内容,根据其相同值提取
SELECT … FROM table [INNER] JOIN
jointable1[AS alias]ON<cond><options>,
jointable2[AS alias]ON<cond><options>…
table是主选择表;jointable是结合表;ON用于指定结合条件;
注:不同逻辑条件之间只能通过AND连接,且每个条件中必须包含一个主选择表中的字段,可用“~”指定其所属的数据库表作为前缀。
LeftOuterJoin与InnerJoin的主要区别是前者中对于主选择表的数据,即使在结合数据表中条件字段只不存在,也将该数据行选出,结合表中不存在的字段保持空白。
SELECT … FROM table LEFT[OUTER]JOIN dbtab [AS alias] ON <cond><options>…
ON附加项中,只能使用“=”操作符。
5.子查询
使用EXISTS,IN或者逻辑运算符连接至WHERE子句中,但不能与结合选择附加项ON同时出现,子查询可进行嵌套。

六.组合查询结果
1.总计功能:
特定字段:MAX最大值、MIN最小值、SUM求和、AVG平均值、COUNT行数。
SELECT agg ([DISTINCT] s1)[AS a1] agg ([DISTINCT] s1)[AS a1] …
agg:总计的表达式;s1:字段;a1:目标变量;DISTINCT排出相同的选择结果。
2.分组总计:
使用GROUP BY子句进行分组总计,注:分组总计只能应用在查询字段已经指定了的情况,因此只有指定单独的基本字段列表或者使用INTO CORRESPONDING FIELD附加项的SELECT语句才能进行分组选择。
SELECT s1[AS a1] s2[AS a2] … agg(sm)[AS am] agg(sn)[AS an]…
INTO (f1,f2,…fm,fn)|COORESPONDING FIELD OF itab…
GROUP BY s1,s2 …
3.指定分组条件:
使用HAVING子句给分组选择的结果限定条件。注:只有使用GROUP BY时才可使用。
SELECT s1[AS a1] s2[AS a2] … agg(sm)[AS am] agg(sn)[AS an]…
INTO (f1,f2,…fm,fn)|COORESPONDING FIELD OF itab…
GROUP BY s1,s2 …
HAVING <cond>.
<cond>用法与WHERE子句中规则一致。
4.指定行的顺序:
ORDER BY 子句指定行的顺序,排序标准是数据表住关键字或指定的字段。
SELECT * FROM … ORDER BY PRIMARY KEY. //系统以升序次序给出
SELECT * FROM … ORDER BY f1[ASCENDING|DESCENDING] f2[ASCENDING|DESCENDING] … //默认为升序,先按f1排,后按f2排

七.其它格式说明
1.使用标工作区: TABLES dbtab
标工作区是接口工作区中的一种,使用TABLES语句声明,在ABAP objects中不能再使用该语句格式,在指定了标工作区之后,SELECT语句中可省略INTO子句。
2.动态指定数据库表
SELECT …FROM (dbtabname)…
通过在运行时为变量值指定数据库表名。
注:dbtabname必须包含一个数据库表名字,且必须为大写形式,不能使用表工作区忽略INTO子句。
e.g. dbtabname=’SPFLI’
3.指定数据区域
不同应用被分为若干个商业区域,这些区域称为集团(Client)。每个集团都会被系统自动分配一个默认字段MANDT,
注:一些系统通用表是集团无关的,可跨区域存储无MANDT字段。
若要操作特定集团,则需要使用CLENT SPECIFIED取消系统自动处理功能。
SELECT|UPDATE … dbtab CLENT SPECIFIED …
注:CLENT SPECIFIED紧跟在表名之后,并在WHERE对mandt的集团字段进行使用。
4.设置缓冲机制
在数据字典Technical settings中进行不同类型缓冲设定。
SELECT语句中的FROM子句的BYPASSING BUFFER附加项,可取消数据字典对该表的缓冲。
DISTINCT附加项与结合选择、总计选择、IS NULL条件、子查询,以及GROUP BY和ORDER BY同时使用时,也将自动忽略缓冲设定。
SELECT … FROM dbtab BYPASSING BUFFER …
5.限定选择行数
SELECT … FROM dbtab UP TO n ROWS …
若n为正数,则系统最获选n行到程序中,若n为0,则选所有满足的行。
注:与ORDER BY同时使用时先排序,再从排序结果中选n行。
6.操作性能分析
GET RUN TIME FIELD f.
f为I类型,返回开始后的毫秒数。可得到当前系统已运行的时间,来分析SQL语句的操作性能。
注:若需要对程序进行更为复杂、全面性能分析,可以使用系统工具Runtime Aralysis(SE30)。
八.使用光标
在SELECT语句中,数据从数据库中以32KB的数据包传递至应用服务器中,并通过INTO子句传至ABAP中,Open SQL中提供了一套语句对数据的具体传输过程进行监测,这个监测通过操作数据库光标进行,使用光标几乎可以从任何SELECT语句的结果集中获得下一行,先用OPEN CURSOR语句将光标与相关的SELECT语句连接起来。
OPEN CURSOR [WITH HOLD] c FOR SELECT … [WHERE (conditions)].
其中:c为CURSOR类型,不能在SELECT SINGLE中使用光标。
打开光标后,就可使用FETCH语句从OPEN CURSOR的结果集中读下一行
FETCH NEXT CURSOR c INTO <target>.
其中所选行都将读到INTO子句指定的目标区域。若FETCH没有读取任何行SY-SUBRC为4,否则返回4。
必须使用CLOSE CURSOR c 来关闭光标
数据库提交时,系统将自动关闭光标,若在OPEN CURSOR中使用WITH HOLD选项,则Native SQL数据库提交将不会关闭光标。