「ABAP」OPEN SQL中FROM语句超详细解析(附案例源码解读)
Posted THUNDER王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「ABAP」OPEN SQL中FROM语句超详细解析(附案例源码解读)相关的知识,希望对你有一定的参考价值。
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。
💅文章概要: 各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中FROM语句的介绍,希望大家喜欢!
🤟每日一言: 永远年轻,永远热泪盈眶!
目录
前言
各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中FROM语句的介绍,希望大家喜欢!
FROM语句介绍
ABAP中的FROM语句
是用于从数据库表中检索数据的语句。它通常与SELECT语句一起使用
,用于指定要从哪个数据库表中检索数据。
以下是FROM语句的一般语法样式:
SELECT <fields>
FROM TABLE <database_table>
[WHERE <conditions>]
[GROUP BY <group_fields>]
[HAVING <having_conditions>]
[ORDER BY <order_fields>]
[CLIENT SPECIFIED|BYPASSING BUFFER|UP TO n ROWS].
参数介绍:
<fields>
:需要返回的字段,可以是表字段、计算字段或表达式等。<database_table>
:表类型:静态表或动态表。(注:动态表名称或表表达式,可以是字符串或一个动态表变量。)[WHERE <conditions>]
:WHERE子句用于过滤出符合条件的行,可以包含多个条件,条件之间使用AND或OR连接。[GROUP BY <group_fields>]
:GROUP BY子句用于对查询结果按照指定的字段进行分组,通常用于配合聚合函数进行使用。[HAVING <having_conditions>]
:HAVING子句用于在分组后对分组结果进行过滤,可以使用聚合函数和条件进行筛选。[ORDER BY <order_fields>]
:ORDER BY子句用于对结果集按照指定的字段进行排序,可以指定多个排序字段,并可以指定升序或降序排列。[CLIENT SPECIFIED|BYPASSING BUFFER|UP TO n ROWS]
:可选项,用于指定查询的一些选项,例如是否使用客户端缓存、是否跳过缓存、是否限制查询结果集的行数等。
案例演示
下面给出一段以SFLIGHT数据库表
为基准的示例代码,基本涵盖以上所有参数,仅供参考:
* 定义静态内表
DATA: stat_table TYPE STANDARD TABLE OF sflight.
* 填充静态内表数据
SELECT carrid connid fldate seatsmax seatsocc
FROM sflight
INTO TABLE stat_table.
* 查询静态内表中的数据,并使用GROUP BY和HAVING进行分组和过滤
DATA: result_set TYPE STANDARD TABLE OF sflight,
result_line LIKE LINE OF result_set.
SELECT connid carrid COUNT( * ) AS cnt
FROM stat_table
WHERE fldate BETWEEN '20100101' AND '20101231'
GROUP BY connid carrid
HAVING COUNT( * ) > 10
INTO TABLE result_set.
* 对结果集进行排序,并只返回前10行数据
DATA: top_results TYPE STANDARD TABLE OF sflight,
top_result LIKE LINE OF top_results.
SELECT carrid connid cnt
FROM result_set
ORDER BY cnt DESCENDING
UP TO 10 ROWS
INTO TABLE top_results.
* 输出查询结果
WRITE: / 'Top 10 results:'.
LOOP AT top_results INTO top_result.
WRITE: / top_result-carrid, top_result-connid, top_result-cnt.
ENDLOOP.
在上面的示例中,首先定义了一个静态内表变量stat_table
,并使用SELECT INTO TABLE
语句将sflight
表中的数据填充到该静态内表中。
然后,使用SELECT语句
从静态内表stat_table中查询数据,并使用GROUP BY
和HAVING
进行分组
和过滤
,查询结果存储在result_set
中。
最后,对result_set进行排序
,并只返回前10行
数据存储到top_results中,最终输出查询结果。
表类型选择
FROM语句中获取数据来源的数据库表既可以是静态数据库表
也可以是动态数据库表
。
需要注意的是,ABAP的动态表在运行时可以通过添加
、删除
和修改表项
的方式动态地调整表的大小
。这使得动态表非常灵活
,但也意味着它们在内存使用方面比静态表更为昂贵。另一方面,静态表在编译时创建,其大小固定,因此它们在内存使用方面更加节省
。
此外,在选择语句中使用动态表时,需要使用INTO TABLE关键字
将结果存储到表中。而对于静态表,不需要使用该关键字。
在定义动态表时,不需要指定表的大小
,因为表可以在运行时动态调整大小。而静态表在定义时必须指定表的大小
,因为表的大小在编译时就已经确定了。
动态表 | 静态表 |
---|---|
在运行时动态创建 | 在编译时创建 |
内存使用更高,因为需要动态调整表大小 | 内存使用较少,因为表大小固定 |
可以动态添加、删除和修改表项 | 无法在运行时添加或删除表项 |
在选择语句中使用时需要使用INTO TABLE | 在选择语句中使用时不需要使用INTO TABLE |
定义时不需要指定表的大小 | 定义时需要指定表的大小 |
PS:动态表名称或表表达式,可以是字符串或一个动态表变量。
静态表
下面给出一段以SFLIGHT数据库表
为基准的示例代码,从静态表
中读取数据:
TYPES: BEGIN OF ty_sflight,
carrid TYPE s_carr_id,
connid TYPE s_conn_id,
fldate TYPE s_date,
price TYPE s_price,
END OF ty_sflight.
DATA: lt_sflight TYPE STANDARD TABLE OF ty_sflight.
SELECT carrid connid fldate price
FROM sflight
INTO TABLE lt_sflight.
LOOP AT lt_sflight INTO DATA(ls_sflight).
WRITE: / ls_sflight-carrid, ls_sflight-connid, ls_sflight-fldate, ls_sflight-price.
ENDLOOP.
在上面的代码中,我们首先定义了一个结构体类型ty_sflight
,用于描述从SFLIGHT表中选择的数据类型。然后,我们声明了一个静态内表变量lt_sflight
,使用STANDARD TABLE OF
关键字指定其类型为ty_sflight。
接着,我们使用SELECT INTO TABLE
语句从SFLIGHT表中选择数据,并将其存储到lt_sflight
中。查询结果中的字段carrid、connid、fldate和price分别与ty_sflight结构体类型中的字段对应,因此可以直接存储到lt_sflight中。
最后,我们使用LOOP AT
语句遍历内表lt_sflight
中的所有数据,并使用WRITE语句打印输出每一行数据的字段值。在本例中,我们使用/
符号将每一行的输出放在不同的行中。
PS:在上述代码中部分使用了新语法,新语法将在本章节最后进行讲解!
动态表
DATA:GS_SFLIGHT TYPE SFLIGHT.
PARAMETERS P_SF TYPE CHAR20.
SELECT * FROM (P_SF) INTO GS_SFLIGHT UP TO 1 ROWS.
WRITE:GS_SFLIGHT-CARRID, GS_SFLIGHT-CONNID.
ENDSELECT.
- 定义一个静态数据对象
GS_SFLIGHT
,类型为 SFLIGHT。 - 定义一个参数
P_SF
,类型为CHAR20
,用于接收动态表
的名称。 - 使用 SELECT 语句从动态表 (P_SF) 中选择所有字段,将结果集合 INTO GS_SFLIGHT 变量。
- 使用 UP TO 1 ROWS 选项
限制结果集最多只有一行
。 - 使用 WRITE 语句输出 GS_SFLIGHT 变量的 CARRID 和 CONNID 字段值。
- ENDSELECT 结束 SELECT 查询语句块。
JOIN语句
在ABAP中,JOIN语句用于将多个表中的数据连接在一起
,生成一个包含多个表中数据的结果集
。JOIN语句通常与SELECT语句结合使用,并且与FROM语句连接
,以从多个表中检索数据。上面的例子都是从单个数据库表中获取数据,如果要从多个数据库表中获取数据则需要使用JOIN语句。
JOIN语句有多种类型,包括INNER JOIN
、LEFT OUTER JOIN
、RIGHT OUTER JOIN
和FULL OUTER JOIN
。以下是这些JOIN类型的简要说明:
-
INNER JOIN
:只返回在两个表中都有匹配的行。 -
LEFT OUTER JOIN
:返回左侧表中的所有行,以及右侧表中与左侧表匹配的行。 -
RIGHT OUTER JOIN
:返回右侧表中的所有行,以及左侧表中与右侧表匹配的行。 -
FULL OUTER JOIN
:返回两个表中的所有行,只要它们不是完全匹配。
PS: 在ABAP中,只支持左外连接
(LEFT OUTER JOIN)
和全外连接(FULL OUTER JOIN)
INNER JOIN
下方是一个INNER JOIN
的流程示意图:
LEFT OUTER JOIN
下方是一个LEFT OUTER JOIN
的流程示意图:
FULL OUTER JOIN
下方是一个FULL OUTER JOIN
的流程示意图:
写在最后的话
本文花费大量时间介绍了OPEN SQL中FROM语句的详细语法
,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!
✨ 原创不易,还希望各位大佬支持一下 \\textcolorblue原创不易,还希望各位大佬支持一下 原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力! \\textcolor9c81c1点赞,你的认可是我创作的动力! 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向! \\textcolored7976收藏,你的青睐是我努力的方向! 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! \\textcolor98c091评论,你的意见是我进步的财富! 评论,你的意见是我进步的财富!
以上是关于「ABAP」OPEN SQL中FROM语句超详细解析(附案例源码解读)的主要内容,如果未能解决你的问题,请参考以下文章
「SAP ABAP」你真的了解OPEN SQL的DML语句吗 (附超详细案例讲解)
使用事务码 SAT 比较传统的 SELECT SQL 语句和 OPEN / FETCH CURSOR 分块读取 ABAP 数据库表两种方式的性能差异