💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。
💅文章概要: 各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中SELECT语句的介绍,希望大家喜欢!
🤟每日一言: 永远年轻,永远热泪盈眶!
目录
- 前言
- SELECT语句介绍
- SELECT语句变式
- SELECT SINGLE
- 案例演示
- SELECT SEVERAL LINE
- 案例演示
- SELECT并输出打印
- SELECT……ENDSELECT
- SELECT(LOOP……ENDLOOP)
- SELECT……AS
- 动态SELECT语句
- DISTINCT
- FOR UPDATE
- 写在最后的话
前言
各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中SELECT语句的介绍,希望大家喜欢!
SELECT语句介绍
在ABAP中,SELECT语句
用于从数据库表中检索数据,它与传统的SQL语句有相似之处,也有独特于ABAP的特性
,下面是OPEN SQL中标准的代码语法样例:
SELECT <fields>
FROM <table>
[WHERE <condition>]
[ORDER BY <fields> [ASC|DESC]]
[GROUP BY <fields> [HAVING <condition>]]
[INTO <internal table>]
[FOR ALL ENTRIES IN <internal table>]
[UP TO <n> ROWS]
[HINT <hint>].
参数介绍:
<fields>
:需要检索的字段列表。<table>
:需要从中检索数据的数据库表。<condition>
:可选项,用于过滤检索结果的条件。<internal table>
:可选项,表示检索结果将被存储在内部表中。FOR ALL ENTRIES IN <internal table>
:可选项,表示使用内部表中的值作为条件来检索数据。<n>
:可选项,表示返回的最大行数。<hint>
:可选项,用于优化数据库查询。
SELECT语句变式
在ABAP中,SELECT语句不仅可以检索多行数据,还可以检索单行数据
。为了满足这两种不同的检索需求,ABAP提供了两种SELECT语句的变体:SELECT SINGLE
和SELECT SEVERAL LINE
。
SELECT SINGLE
SELECT SINGLE
语句用于从数据库中检索单个行,并将其存储在内部表中。如果检索到多行数据,则只返回第一行数据
。
以下是SELECT SINGLE语句的语法:
SELECT SINGLE <fields>
FROM <table>
[WHERE <condition>]
[ORDER BY <fields> [ASC|DESC]]
[INTO <internal table>]
[FOR UPDATE].
PS:
所有参数同SELECT语句介绍一致
案例演示
在这个案例中,首先声明一个sflight表的结构体类型ls_flight
,然后使用SELECT SINGLE
语句检索连接ID为0820
的航班的航空公司、连接ID、日期和价格,并将数据存储在结构体ls_flight中
。最后,使用WRITE语句将检索到的航班数据输出到屏幕上。
DATA: ls_flight TYPE sflight.
* Select a flight with connection ID = 0820 and store the data in a structure
SELECT SINGLE carrid, connid, fldate, price
FROM sflight
WHERE connid = '0820'
INTO ls_flight.
* Display the flight data
WRITE: / 'Flight', ls_flight-connid, 'on', ls_flight-fldate,
'with airline', ls_flight-carrid, 'costs', ls_flight-price, 'USD'.
SELECT SEVERAL LINE
SELECT SEVERAL LINE
语句用于从数据库中检索多个行,并将其存储在内部表
中。如果没有检索到数据,则返回空内部表
。
以下是SELECT SEVERAL LINE语句的语法:
SELECT <fields>
FROM <table>
[WHERE <condition>]
[ORDER BY <fields> [ASC|DESC]]
[GROUP BY <fields> [HAVING <condition>]]
[INTO <internal table>]
[FOR ALL ENTRIES IN <internal table>]
[UP TO <n> ROWS]
[HINT <hint>].
PS:
所有参数同SELECT语句介绍一致
案例演示
在这个案例中,首先声明一个内部表it_flight
,其类型为自定义类型ty_flight,该类型包含航空公司、连接ID、日期和价格字段。然后,使用SELECT SEVERAL LINE
语句检索航空公司代码为LH的所有航班的航空公司、连接ID、日期和价格,并将数据存储在内部表it_flight中。最后,使用LOOP AT语句遍历内部表中的每个航班数据
,并使用WRITE语句
将其输出到屏幕上。
TYPES: BEGIN OF ty_flight,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
price TYPE sflight-price,
END OF ty_flight.
DATA: it_flight TYPE STANDARD TABLE OF ty_flight.
* Select all flights with airline code 'LH' and store the data in an internal table
SELECT carrid, connid, fldate, price
FROM sflight
WHERE carrid = 'LH'
INTO TABLE it_flight.
* Display the flight data
WRITE: / 'Flights operated by airline LH:'.
LOOP AT it_flight INTO DATA(ls_flight).
WRITE: / ls_flight-connid, 'on', ls_flight-fldate, 'costs', ls_flight-price, 'USD'.
ENDLOOP.
SELECT并输出打印
下面介绍ABAP中两种SELECT并且输出打印的方式,其中第一种是先将数据SELECT到结构体变量中,然后输出打印
;第二种是先将数据SELECT到内部表中,然后使用LOOP语句遍历内表最终输出打印到屏幕上
。
SELECT……ENDSELECT
DATA:GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA:GS_SFLIGHT TYPE SFLIGHT.
SELECT * INTO GS_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.
WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDSELECT.
SELECT(LOOP……ENDLOOP)
DATA: GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA: GS_SFLIGHT TYPE SFLIGHT.
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.
LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.
WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDLOOP.
SELECT……AS
在ABAP中,使用SELECT AS
可以为查询结果的列定义别名
。这对于使用SELECT语句构建动态SQL语句
和生成报表
非常有用。
SELECT <columns> AS <alias>...
参数介绍
<columns>
:数据库表中字段。<alias>
:字段别名。
下面给出一个详细的案例进行详解:
DATA: GT_SFLIGHT TYPE TABLE OF SFLIGHT,
GS_SFLIGHT TYPE SFLIGHT.
SELECT CARRID AS 'Airline Code',
CONNID AS 'Connection ID'
INTO TABLE GT_SFLIGHT
FROM SFLIGHT
WHERE CARRID = 'LH'.
LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.
WRITE:/ GS_SFLIGHT-'Airline Code', GS_SFLIGHT-'Connection ID'.
ENDLOOP.
在这个例子中,我们使用SELECT AS
为CARRID和CONNID两个列定义了别名
。这个别名可以在程序中被引用,这样我们就可以避免使用SFLIGHT表中的实际列名
。
在程序的输出中,我们使用GS_SFLIGHT-'Airline Code'
和GS_SFLIGHT-'Connection ID'
来引用别名,这样输出的结果中将显示别名。
动态SELECT语句
在ABAP中,可以使用动态SELECT语句
来构建在运行时构建SQL语句的能力
。这对于需要根据用户输入或条件动态构建SQL语句的应用程序非常有用。
下面给出一个详细的案例进行详解:
DATA: gt_result TYPE TABLE OF sflight,
gs_result TYPE sflight,
lv_carrid TYPE sflight-carrid.
*获取用户输入的Airline Code
PARAMETERS p_carrid TYPE sflight-carrid.
*构建动态SQL语句
CONCATENATE 'SELECT * FROM sflight WHERE carrid =' p_carrid INTO lv_sql.
CREATE DATA gt_result TYPE TABLE OF (sflight).
ASSIGN gt_result->* TO FIELD-SYMBOL(<fs_result>).
EXEC SQL PERFORMING <fs_result>
INTO TABLE :gt_result
USING :lv_sql.
*输出结果
LOOP AT gt_result INTO gs_result.
WRITE:/ gs_result-carrid, gs_result-connid, gs_result-fldate, gs_result-price.
ENDLOOP.
在这个示例中,我们首先使用PARAMETERS语句
定义了一个用户可以输入的参数p_carrid
。然后,我们将该参数与一个SELECT语句的一部分拼接起来,构建了一个动态的SQL语句lv_sql
。
接下来,我们使用CREATE DATA
语句动态创建了一个内部表gt_result
,然后使用ASSIGN
语句将该内部表的指针赋值给一个FIELD-SYMBOL
变量<fs_result>
。
最后,我们使用EXEC SQL语句
执行了动态SQL
语句,并将结果存储在内部表gt_result
中。在循环中,我们遍历内部表并输出结果。
PS:需要注意的是,动态SELECT语句需要使用EXEC SQL语句来执行,而不是ABAP的SELECT语句。此外,我们还可以使用CONCATENATE语句和其他字符串操作函数来构建动态SQL语句。通过使用动态SELECT语句,我们可以根据不同的条件构建不同的SQL语句,并以此实现高度灵活的应用程序。
DISTINCT
[DISTINCT]
为OPEN SQL中SELECT语句的可选项,若选择则自动删除所查询数据的重复项!
在某些场景中,我们需要对查到的数据进行去重
的操作,这时候便需要加上DISTINCT
可选项!
下面给出一个详细的案例进行讲解:
DATA:GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA:GS_SFLIGHT TYPE SFLIGHT.
DATA:GS_LINE(72) TYPE C.
GS_LINE = 'CARRID CONNID'.
SELECT DISTINCT (GS_LINE) INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.
LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.
WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDLOOP.
在SFLIGHT数据库表中,CARRID等于‘AC’
的数据有两条,使用了DISTINCT
语句后查询出来的数据便只有一条
了。
FOR UPDATE
在ABAP中,SELECT SINGLE
语句可以使用FOR UPDATE
选项来锁定检索到的行
,以便在事务期间对它们进行更新或删除操作。当使用FOR UPDATE选项时,会在数据库中为检索到的行设置锁,防止其他用户同时修改相同的数据
。
下面给出一个详细的案例进行详解:
START-OF-SELECTION.
DATA: lv_name TYPE zemployee-name,
lv_salary TYPE zemployee-salary.
* Select employee with ID = 123 and lock the row for update
SELECT SINGLE name, salary
FROM zemployee
WHERE id = '123'
INTO (lv_name, lv_salary)
FOR UPDATE.
* Update the employee's salary
lv_salary = lv_salary + 1000.
* Commit the changes
COMMIT WORK.
在这个示例中,首先使用SELECT SINGLE语句检索ID为123的员工姓名和工资,并将该行锁定以进行更新
。然后,将员工的工资增加1000,并在事务结束时提交更改。由于该行被锁定,其他用户无法同时更新相同的数据
。
写在最后的话
本文花费大量时间介绍了OPEN SQL中SELECT语句的详细语法
,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!
✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力! \textcolor{9c81c1}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向! \textcolor{ed7976}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! \textcolor{98c091}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!