通常使用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数据库提交将不会关闭光标。

ABAP里SELECT的用法汇总(转)的更多相关文章

  1. C#中DllImport用法汇总

    最近使用DllImport,从网上google后发现,大部分内容都是相同,又从MSDN中搜集下,现将内容汇总,与大家分享. 大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比 ...

  2. golang的select典型用法

    golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作. 示例: ch1 := make (chan in ...

  3. SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好?

    SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好? 今天遇到某人在我以前写的一篇文章里问到 如果统计信息没来得及更新的话,那岂不是统计出来的数据时错误的 ...

  4. linux c语言 select函数用法

    linux c语言 select函数用法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unis ...

  5. Linux中find命令的用法汇总

    Linux中find命令的用法汇总 https://www.jb51.net/article/108198.htm

  6. Python Enum 枚举 用法汇总

    Python Enum 枚举 用法汇总 import os import sys if sys.version_info.major + sys.version_info.minor * 0.1 &l ...

  7. 数据库中增加操作insert into的用法和查询select的用法

    insert into的用法 1.一条insert into 可以插入多条记录 2.insert into 能判断主键是否冲突,和做出冲突处理 如果主键冲突的话会报错,还能写成如果冲突就更新的形式格式 ...

  8. select()函数用法二

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...

  9. JQuery下拉控件select的操作汇总

    JQuery获取和设置Select选项方法汇总如下: 获取select 先看看下面代码:   $("#select_id").change(function(){//code... ...

随机推荐

  1. MySQL必知必会(Select, Where子句)

    SELECT prod_name, prod_price FROM products WHERE prod_price = 2.5; SELECT prod_name, prod_price FROM ...

  2. UIImageView与基本动画gif

    UIImageView 作用:[用来进行图片展示] UIImageView UIImageView初始化 initWithImage:如果设置frame,图片的size就是 imageView的siz ...

  3. iOS App Extension入门

    转自简书:http://www.jianshu.com/p/8cf08db29356   iOS 10推出了很多新功能,其中有几个高调的变化:通知栏更加实用,电话可以防骚扰,iMessage变得更加有 ...

  4. yarn 与 npm 比较

    一.首先需要了解的命令 npm install === yarn —— install 安装是默认行为. npm install taco --save === yarn add taco —— ta ...

  5. dubbo 发布 RPC 服务

    Dubbo 发布 RPC 服务 建立服务提供者项目 pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...

  6. CodeForces985F -- Isomorphic Strings

    F. Isomorphic Strings time limit per test 3 seconds memory limit per test 256 megabytes input standa ...

  7. Docker系列-(3) Docker-compose使用与负载均衡

    上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 ...

  8. ARTS-S idea常用快捷键

    1.生成main方法 先输入p,再输入Ctrl+j,选psvm,回车. 2.生成System.out.println() 先输入s,再输入Ctrl+j,选sout,回车. 输入A.B.C.D形式的快捷 ...

  9. ARTS-S CentOS 7 ssh相关

    修改默认端口 vi /etc/ssh/sshd_config 把Port的注释删除了改成自己想要的值 重启service sshd restart 或者sudo /etc/init.d/ssh res ...

  10. Java Properties 加载

    static{ Properties prop = new Properties(); prop.load(Thread.currentThread().getContextClassLoader() ...