ABAP程序的数据查询语句SELECT
ABAP程序的数据查询语句SELECT(2009-08-31 11:45:18)
标签:
分类:
c通常使⽤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中的值是否等于括号内列表中的⼀个值。
< 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
GROUP BY s1,s2 ...
3.指定分组条件:
使⽤HAVING⼦句给分组选择的结果限定条件。注:只有使⽤GROUP BY时才可使⽤。
SELECT s1[AS a1] s2[AS a2] ... agg(sm)[AS am] agg(sn)[AS an]...select distinct from
INTO (f1,f2,...fm,fn)|COORESPONDING FIELD
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⼦句。
< 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数据库提交将不会
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论