zoukankan      html  css  js  c++  java
  • 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数据库提交将不会关闭光标。

  • 相关阅读:
    OZ Report 오즈 리포트 개발
    日期 英文 英语 韩文 韩语
    行合并
    R内存扩展 win7内存扩展
    计算日期函数
    C#颜色 Color.FromArgb ColorTranslator 16进制
    Phone
    浏览器 UserAgent
    context.Request.Files post 上传问题件
    The connection to adb is down, and a severe error has occured.
  • 原文地址:https://www.cnblogs.com/BruceKing/p/12021158.html
Copyright © 2011-2022 走看看