SAP ABAP OpenSQL(SQL命令、SELECT标准函数和分组过滤、联合查询、查询条件、FOR ALL ENTRIES IN、动态SQL、SQL子查询、游标、UP TO n ROWS限定查询条数)

1.SQL命令

命令

单条/多条

示例

附加说明

SELECT/

SELECT SINGLE

单条查询

SELECT id, name,age FROM dbtab INTO TABLE @DATA(itab).

 

多条查询

SELECT SINGLE name INTO @DATA(lv_name) FROM dbtab.

 

INSERT

单条插入

INSERT INTO name VALUES lv_name.

 

多条插入

INSERT id,name,age FROM TABLE itab [ACCEPTING DUPLICATE KEYS ].

ACCEPTING DUPLICATE KEYS:如果出现关键字相同的条目,SY-SUBRC = 4,并且会跳过该条目,但其余数据会插入。

UPDATE

单条更新

UPDATE dbtab FROM wa.

wa:结构与数据表一致,字段名可以不同。

多条更新

UPDATE dbtab FROM TABLE itab. / UPDATE dbtab SET id = lv_id, name = lv_name, age = lv_age WHERE (where).

 

DELETE

单条删除

DELETE dbtab FROM wa.

 

多条删除

DELETE FROM dbtab WHERE (where).

 

MODIFY

 

单条修改

MODIFY dbtab FROM wa.

已存在的记录进行修改,新数据则进行插入

多条修改

MODIFY dbtab FROM TABLE itab.

Open SQL 执行成功:SY-SUBRC = 0;执行失败:SY-SUBRC <> 0。

2.SELECT标准函数和分组过滤

标准函数

说明

COUNT()

查询记录总数

SUM()

汇总

AVG()

平均值

MAX()

最大值

MIN()

最小值

分组过滤:将标准函数和GROUP BY一起使用

SELECT AGV(age) AS avg_age INTO @DATA(lv_avg_age) FROM dbtab GROUY BY class

    HAVING MAX(age) > 15.

3.联合查询

联合方式

说明

INNER JOIN

量表数据完全匹配

LEFT JOIN

右表不需要完全匹配

RIGHT JOIN

左表不需要完全匹配

4.查询条件

操作符

说明

示例

EQ

=

… WHERE name EQ ‘lili’. /

… WHERE name = ‘lili’.

NE

<> / ><

… WHERE id NE 5. /

… WHERE id <> 5. /

… WHERE id >< 5.

LT

… WHERE id LT 5. /

… WHERE id < 5.

LE

<=

… WHERE id LE 5. /

… WHERE id <=5.

GT

… WHERE id GT 5. /

… WHERE id > 5.

GE

>=

… WHERE id GE 5. /

… WHERE id >= 5.

BETWEEN a AND b

在a和b之间

… WHERE id BETWEEN 3 AND 8.

LIKE

“_”用于替代单个字符,“%”用于替代任意字符串,包括空字符串(用于模糊查询)

… WHERE name LIKE ‘li_%’.

IN

满足IN后面列表中的任何一个

… WHERE name IN (‘lili’,’xx’,’nm’).

5.FOR ALL ENTRIES IN 语句

Open SQL允许通过FOR ALL ENTRIES IN将内表数据作为查询条件,在数据量庞大的情况下,使用FOR ALL ENTRIES IN会比INNER JOIN查询速度快。

INNER JOIN

FOR ALL ENTRIES IN

SELECT d1~id,d1~name,d2~score FROM dbtab1 AS d1

   INNER JOIN dbtab2 AS a2

   ON a2~id = d1~id

   INTO TABLE ty_stu.

SELECT id INTO TABLE ty_stuid FROM dbtab 2.

IF ty_stuid IS NOT INITIAL.

  SELECT name FROM dbtab1 INTO TABLE ty_stu

  FOR ALL ENTRIES IN ty_stuid

WHERE id = ty_stuid~id.

ENDIF.

使用注意事项:

(1)   结果集会自动删除重复行

(2)   FOR ALL ENTRIES IN后跟的itab为空,则选出所有记录,SELECT无意义

(3)   Itab条件不能使用BETWEEN、LIKE、IN

(4)   不能使用ORDER BY、HAVING

(5)   可以使用COUNT(),但不能使用SUM()、AVG()、MAX()、MIN()

6.动态SQL

DATA: lv_where1 TYPE string,

      lv_where2 TYPE string,

lv_where TYPE string.

lv_where1 = ‘d1~id IN @p_id’.

IF F1 EQ 1.

  lv_where2 = ‘AND name = @p_name’

ENDIF.

CONCATENATE lv_where1 lv_where2 INTO lv_where SEPARATED BY ‘ ‘.

SELECT id, name, age FROM dbtab WHERE ( lv_where ).

7.子查询

(1) ( =、<>、<、<=、>、>= ) / ( ALL、SOME、ANY )

SELECT * FROM dbtab1 INTO TABLE ty_stu WHERE id >= ALL ( SELECT SINGLE id FROM dbtab2 WHERE … ).

(2)     IN/NOT IN、EXISTS/NOT EXISTS

SELECT * FROM dbtab1 INTO TABLE ty_stu WHERE name IN ALL ( SELECT name FROM dbtab2 WHERE … ).

8.游标

DATA: c TYPE cursor.   ”声明游标

DATA: wa TYPE dbtab.

OPEN CURSOR: c FOR SELECT id name FROM dbtab WHERE class = 5.  ”打开游标

DO.

  FETCH NEXT CURSOR c INTO CORRESPONDING FIELDS OF wa.  ”读取数据

  IF sy-subrc <> 0.

CLOSE CURSOR c.  ”关闭游标

EXIT.

  ELSE.

WRITE: wa-id, wa-name.

  ENDIF.

ENDDO.

9.UP TO N ROWS限定查询条数

SELECT * FROM dbtab INTO CORRESPONDING FIELDS OF TABLE ty_stu UP TO 10 ROWS.

10.WITH将查询出来的数据作二次查询

WITH +itab AS ( SELECT FROM dbtab1 AS d1

    INNER JOIN dbtab2 AS d2

    ON d2~id = d1~id

FIELDS

d1~id,

d1~name,

d1~age,

d2~score )

SELECT FROM +itab as i

  LEFT JOIN dbtab3 AS d3

  ON d3~id = i~id

  FIELDS

i~id,

i~name,

i~age,

i~score,

d3~class

INTO TABLE @DATA(lv_stu).

posted @ 2022-02-27 20:16  LikZ-WM  阅读(1825)  评论(0编辑  收藏  举报