ABAP学习笔记--数据查询语句SELECT
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子句中指明字段的内容传送到目标工作区的同名组建中。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
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
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排
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论