ABAP學習筆記--數據查詢語句SELECT(轉)


ABAP學習筆記--數據查詢語句SELECT 

原文地址:http://blog.sina.com.cn/s/blog_87ddd1ff01010yzy.html

c通常使用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數據庫提交將不會關閉光標。

原作者文章地址:http://blog.sina.com.cn/s/blog_87ddd1ff01010yzy.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM