SELECT(データ取得)
WHERE 句は、満たすべき条件を指定することにより選択される行数を制限します。
WHERE 句は、SELECT 命令と同様に OPEN CURSOR、UPDATE、および DELETE 命令でも使用されます。WHERE 句の標準形式は以下のとおりです。
SELECT... WHERE cond...
WHERE 句の cond 条件は、比較または一連の他の特殊式です。一連の条件を、WHERE 句の単一の条件に結合することができます。条件が動的にプログラミングされる場合もあります。
WHERE 句の条件 cond は論理式に似ていますが、構文とセマンティクスが Standard SQL に従うため、論理式と同一ではありません。WHERE 句の条件では、SELECT 句のように項目名を使用して列の名称を指定します。以下の説明では、s は常に、FROM 句で指定された 1 つのデータベーステーブルの列を表します。条件の結果は、真、偽、不明のいずれかとなります。行は、その条件が真の場合にのみ選択されます。関連する列の 1 つにヌル値が含まれている場合、条件は不明です。
全タイプの比較
任意のデータ型の列の値を他の値と比較するには、以下を使用します。
SELECT... WHERE s operator f...
f は、FROM 句からのデータベーステーブルの他の列、データオブジェクト、またはスカラサブクエリです。
列の集計には、以下の命令を使用することができます。
命令 | 内容説明 |
---|---|
MAX | 列の最大値 |
MIN | 列の最小値 |
AVG | 列の平均 |
SUM | 列の合計 |
COUTN | 値または行のカウント |
関係演算子には、以下の式を使用することができます。
演算子 |
意味 |
EQ |
等しい |
= |
等しい |
NE |
等しくない |
<> |
等しくない |
>< |
等しくない |
LT |
より小さい |
< |
より小さい |
LE |
以下 |
<= |
以下 |
GT |
より大きい |
> |
より大きい |
GE |
以上 |
>= |
以上 |
必要に応じて、オペランドの値は変換されます。変換は、プラットフォームまたはコードページに依存する場合があります。
間隔の値
列の値が特定の間隔内にあるかどうかを確認するには、以下を使用します。
SELECT... WHERE s [NOT]BETWEEN f1 AND f2...
列の値 s がデータオブジェクト f1 と f2 の間にある [ない] 場合、条件は真です。FROM 句の ON 条件で、BETWEEN を使用することはできません。
文字列の比較
列の値がパターンに適合するかどうかを確認するには、以下を使用します。
SELECT... WHERE s [NOT]LIKE f [ESCAPE h]...
列 s の値がデータオブジェクト f のパターンに適合する [適合しない] 場合、条件は真です。このテストは、テキスト項目に対してのみ使用することができます。列のデータ型は英数字でなければなりません。f はデータ型 c でなければなりません。
以下のワイルドカードを f で使用することができます。
● % は任意文字の順序 (スペースを含む) を表します。
● _ は 1 文字を表します。
たとえば、ABC_EFG% は文字列ABCxEFGxyz および ABCxEFG に適合しますが、ABCEFGxyz には適合しません。2 つのワイルドカード文字を比較で明示的に使用する場合は、ESCAPE オプションを使用します。ESCAPE h は、エスケープシンボル h を指定します。h が先頭にあると、ワイルドカードとエスケープシンボル自体はパターン f 内での通常の機能を失います。_ および % の使用方法は、Standard SQL での使用方法と同じです。ABAP の他の箇所での論理式は、別のワイルドカード文字 (+ と *) を使用します。
FROM 句の ON 条件で、LIKE を使用することはできません。
値一覧のチェック
列の値が値一覧に含まれているかどうかを確認するには、以下を使用します。
SELECT... WHERE s [NOT]IN (f1,......, fn)...
列の値 s が一覧 f1 … fn にある [ない] 場合、条件は真です。
サブクエリのチェック
列の値がスカラサブクエリに含まれているかどうかを確認するには、以下を使用します。
SELECT... WHERE s [NOT]IN subquery...
<s> の値がスカラサブクエリ subquery の結果セットに含まれている[いない] 場合、条件は真です。
サブクエリの選択に行が 1 行でも含まれているかどうかを確認するには、以下を使用します。
SELECT... WHERE [NOT] EXISTS subquery...
サブクエリ subquery の結果セットに 1 行でも含まれている [1 行も含まれていない] 場合、この条件は真です。サブクエリがスカラである必要はありません。
FROM 句の ON 条件でサブクエリをチェックすることはできません。
選択テーブルのチェック
列の値が選択テーブルの条件を満たすかどうかを確認するには、以下を使用します。
SELECT... WHERE s [NOT]IN seltab...
s の値が seltab に保存された条件を満たす [満たさない] 場合、この条件は真です。seltab は、実際の選択テーブルまたは RANGES テーブルのいずれかです。FROM 句の ON 条件で選択テーブルをチェックすることはできません。
null 値のチェック
列の値がヌルであるかどうかを確認するには、以下を使用します。
SELECT... WHERE s IS [NOT]NULL...
s の値がヌルである [ない] 場合、条件は真です。
条件の否定
条件の結果を否定するには、以下を使用します。
SELECT... WHERE NOT cond...
cond が偽の場合は条件が真で、cond が真の場合は条件が偽です。不明な条件の結果は、否定された場合も不明のままです。
条件のリンク
AND と OR の演算子を使用して、2 つの条件を 1 つに結合することができます。
SELECT... WHERE cond1 AND cond2...
<cond1> と <cond2> が真の場合、この条件は真です。
SELECT... WHERE cond1 OR cond2...
<cond1> と <cond2> の一方または両方が真の場合、この条件は真です。
NOT は AND よりも優先され、AND は OR よりも優先されます。ただし、括弧を使用して処理順序を制御することもできます。
動的条件
条件を動的に指定するには、以下を使用します。
SELECT... WHERE (itab)...
この itab は、行データ型 c および最大文字長 72 文字の内部テーブルです。選択テーブル以外の上記の条件はすべて、itab の行に書き込むことができます。ただし、リテラルのみを使用して、データオブジェクトの名称は使用しないでください。内部テーブル itab を空白のままにすることもできます。
条件の一部のみを動的に指定する場合は、以下を使用します。
SELECT... WHERE cond AND (itab)...
OR を使用して、静的条件と動的条件をリンクすることはできません。
SELECT 命令の WHERE 句のみで、動的条件を使用することができます。
テーブル条件
SELECT 命令の WHERE 句には、内部テーブルの行と列から条件を導き出す特殊なバリアントがあります。このバリアントは以下のとおりです。
SELECT... FOR ALL ENTRIES IN itab WHERE cond...
cond は、上記のように指定することができます。内部テーブル itab の項目を条件のオペランドとして指定する場合は、内部テーブルのすべての行を指定します。その後、内部テーブルの各行について比較が行われます。各行に対して、データベーステーブルから条件を満たす行が選択されます。SELECT 命令の結果セットは、内部テーブルの各行に対する個々の選択を結合したものです。重複行は自動的に結果セットから除外されます。itabが空の場合は、オプション FOR ALL ENTRIES が無視されて、すべてのエントリが読み込まれます。
内部テーブル itab には構造化された行データ型が必要であり、条件 cond に使用される各項目は、比較対象のデータベースの列と互換性がなければなりません。内部テーブル項目を使用する比較では、演算子 LIKE、BETWEEN および IN を使用しないでください。同じ SELECT 命令では、ORDER BY 句を使用することはできません。
オプション FOR ALL ENTRIES を使用して、ネストされた select ループを内部テーブルでの操作によって置き換えることができます。これにより、選択したデータの大型セットに対するパフォーマンスが大幅に向上します。
WHERE 句の条件:
... WHERE carrid = 'UA'.
列 CARRID にコンテンツ UA がある場合、この条件は真です。
... WHERE num GE 15.
列 NUM に 15 以上の数が含まれている場合、この条件は真です。
... WHERE cityfrom NE 'FRANKFURT'.
列 CITYFROM に文字列 FRANKFURT が含まれない場合、この条件は真です。
... WHERE num BETWEEN 15 AND 45.
列 NUM に 15 から 45 までの数字が含まれる場合、この条件は真です。
... WHERE num NOT BETWEEN 1 AND 99.
列 NUM に 1 から 99 までの数以外の数が含まれる場合、この条件は真です。
... WHERE name NOT BETWEEN 'A' AND 'H'.
列 NAME が 1 文字の長さでそのコンテンツが A から H でない場合、この条件は真です。
... WHERE city LIKE '%town%'.
列 CITY にパターン ‘town’ を含む文字列がある場合、この条件は真です。
... WHERE name NOT LIKE '_n%'.
列 NAME に、2 番目の文字が ‘n’ でない値が含まれている場合、この条件は真です。
... WHERE funcname LIKE 'EDIT#_%' ESCAPE '#'.
列 FUNCNAME のコンテンツが EDIT_ で始まる場合、この条件は真です。
... WHERE city IN ('BERLIN', 'NEW YORK', 'LONDON').
列 CITY に値 BERLIN、NEW YORK、LONDON の 1 つがある場合、この条件は真です。
... WHERE city NOT IN ('FRANKFURT', 'ROM').
列 CITY に値 FRANKFURT または ROME が含まれない場合、この条件は真です。
... .......WHERE ( NUMBER = '0001' OR NUMBER = '0002') AND
列 NUMBER に値 0001 または 0002 が含まれて、列 COUNTRY に F も USA も含まれない場合、この条件は真です。
一般サンプル
SELECT *
INTO TABLE itab
FROM spfli
WHERE col1 = wa1
AND col2 <> wa2
AND col3 IN seltab. // 選択テーブルの場合
動的条件
REPORT demo_select_dynamic_conditions. DATA: cond(72) TYPE c,
itab LIKE TABLE OF cond. PARAMETERS: city1(10) TYPE c, city2(10) TYPE c. DATA wa TYPE spfli-cityfrom. CONCATENATE 'CITYFROM = ''' city1 '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' city2 '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' 'BERLIN' '''' INTO cond.
APPEND cond TO itab. LOOP AT itab INTO cond.
WRITE cond.
ENDLOOP. SKIP. SELECT cityfrom
INTO wa
FROM spfli
WHERE (itab). WRITE / wa. ENDSELECT.
選択画面でパラメータ city1 および city2 に対してFRANKFURT および BERLIN を入力した場合、一覧は以下のように表示されます。
最初の 3 行は、内部テーブル itab の内容を示しています。完全に一致するテーブル行が選択されます。
テーブル条件
REPORT demo_select_for_all_entries_1. DATA: BEGIN OF line,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
END OF line,
itab LIKE TABLE OF line. line-cityfrom = 'FRANKFURT'.
line-cityto = 'BERLIN'.
APPEND line TO itab. line-cityfrom = 'NEW YORK'.
line-cityto = 'SAN FRANCISCO'.
APPEND line TO itab. SELECT carrid connid cityfrom cityto
INTO CORRESPONDING FIELDS OF line
FROM spfli
FOR ALL ENTRIES IN itab
WHERE cityfrom = itab-cityfrom AND cityto = itab-cityto. WRITE: / line-carrid, line-connid, line-cityfrom, line-cityto. ENDSELECT.
出力は以下のようになります。
この例では、以下の条件を満たすすべての行を選択します。
■ CITYFROM 列に FRANKFURT が含まれて、CITYTO 列に BERLIN が含まれている
■ CITYFROM 列に NEW YORK が含まれて、CITYTO 列に SAN FRANCISCO が含まれている
テーブル条件
REPORT demo_select_for_all_entries_2. DATA: tab_spfli TYPE TABLE OF spfli,
tab_sflight TYPE SORTED TABLE OF sflight
WITH UNIQUE KEY table_line,
wa LIKE LINE OF tab_sflight. SELECT carrid connid
INTO CORRESPONDING FIELDS OF TABLE tab_spfli
FROM spfli
WHERE cityfrom = 'NEW YORK'. SELECT carrid connid fldate
INTO CORRESPONDING FIELDS OF TABLE tab_sflight
FROM sflight
FOR ALL ENTRIES IN tab_spfli
WHERE carrid = tab_spfli-carrid AND
connid = tab_spfli-connid. LOOP AT tab_sflight INTO wa. AT NEW connid.
WRITE: / wa-carrid, wa-connid.
ENDAT. WRITE: / wa-fldate. ENDLOOP.
出力は以下のようになります。
この例では、テーブル SPFLI の列 CITYFROM に値 NEW YORK が含まれるすべての接続に対して、SFLIGHT からフライトデータを選択します。FROM 句の結合を使用して、単一の SELECT 命令で同じデータを選択することもできます。
内部テーブルを指定する(INTO TABLE)
SELECT *
INTO TABLE itab
FROM spfli.
既存内部テーブルに新規行を追加する(APPENDING)
SELECT *
INTO APPENDING [CORRESPONDING FIELD] TABLE itab
FROM spfli.
CORRESPONDING FIELDの使用はオススメしません。
項目などを自動で判別して格納してくれる一見便利そうな機能ですが、その分処理には時間がかかります。
項目の並び順が処理毎に変わらないない限り、取得項目と格納先項目の順番などを合わせて使用しない事をオススメします。
レコードを1件のみ取得する(SINGLE)
SELECT SINGLE *
INTO TABLE itab
FROM spfli.
他にも、「UP TO 1 ROWS」でも1件のみ取得することができます。
両者の違いについては、下記の比較表にまとめました
SINGLE | 比較内容 | UP TO 1 ROWS |
---|---|---|
最初にヒットした1件 | 取得方法 | 全レコードを確認して条件に合う最初の1件 |
高い | パフォーマンス | 低い |
少ない | バッファ使用量 | 多い |
全て含む場合に使用 | 検索条件に主キー(推奨) | 一部のみの場合に使用 |
保証されている(マスタなど) | データの存在(推奨) | 保証されていない |
(推奨)は、基本的な考え方の一例です。
テーブルの名称を静的に指定する(AS)
SELECT col1 col2
INTO table itab
FROM spfli1 AS s1
JOIN spfli2 AS s2 ON s1~col1 = s2~col2.
全ての列を取得する(*)
全件取得する必要がない限りは個別に項目を指定する事をオススメします。
SELECT *
INTO wa
FROM spfli.
列の最大値を取得する(MAX)
SELECT MAX(col)
INTO wa
FROM spfli.
列の最小値を取得する(MIN)
SELECT MIN(col)
INTO wa
FROM spfli.
列の平均を取得する(AVG)
SELECT AVG(col)
INTO wa
FROM spfli.
値または行のカウントを取得する(COUNT)
SELECT COUNT(*)
INTO wa
FROM spfli.
参照資料:
SELECT(データ取得)的更多相关文章
- 最全的ORACLE-SQL笔记
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...
- Matplotlib数据可视化(6):饼图与箱线图
In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
- LINQ to SQL Select查询
1. 查询所有字段 using (NorthwindEntities context = new NorthwindEntities()) { var order = from n in contex ...
- ADO.NET一小记-select top 参数问题
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 最近使用ADO.NET的时候,发现select top @count xxxx 不 ...
- iosselect:一个js picker项目,在H5中实现IOS的select下拉框效果
具体文档和demo可以访问github:https://github.com/zhoushengmufc/iosselect 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的pi ...
- SQL Server中SELECT会真的阻塞SELECT吗?
在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- 基于select的python聊天室程序
python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...
随机推荐
- kubeadm安装kubernetes 1.12版本
直接写过程,有些描述就省略了关于kubeadm安装k8s 1.11.2版本可以查看:https://www.cnblogs.com/shansongxian/p/9753603.html 首先查看下k ...
- 【Hibernate那点事儿】—— Hibernate应该了解的知识
前言: 最近由于有点时间,就像深入的学习一下Hibernate.之前只是简单的使用,并没领会它的妙处.这里就趁着分享的机会,好好整理一下. 这篇主要讲到了下面几个部分: Hibernate框架 Hib ...
- bzoj2111 [ZJOI2010]排列计数
Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...
- http://codeforces.com/gym/100623/attachments E题
http://codeforces.com/gym/100623/attachments E题第一个优化它虽然是镜像对称,但它毕竟是一一对称的,所以可以匹配串和模式串都从头到尾颠倒一下第二个优化,与次 ...
- c语言实现数组的转置
#include<stdio.h> int main (){ int i,j,m,n; ][],b[][]; printf("请输入行列式的行数:\n"); scanf ...
- An Algorithm for Surface Encoding and Reconstruction From 3D Point Cloud Data
An Algorithm for Surface Encoding and Reconstruction From 3D Point Cloud Data https://www.youtube.co ...
- o'Reill的SVG精髓(第二版)学习笔记——第二章
在网页中使用SVG 将SVG作为图像: SVG是一种图像格式,因此可以使用与其他图像类型相同的方式包含在HTML页面中,具体可以采用两种方法:将图像包含在HTML标记的<img>元素内(当 ...
- ## `nrm`的安装使用
作用:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址:什么是镜像:原来包刚一开始是只存在于国外的NPM服务器,但是由于网络原因,经常访问不到,这时候,我们可以在国内,创 ...
- Spring知识点总结(三)之注解方式实现IOC和DI
1. 注解概念 所谓注解就是给程序看的提示信息,很多时候都用来作为轻量级配置的方式. 关于注解的知识点,参看java基础课程中java基础加强部分的内容. 2 ...
- Android 初步-Android文件目录介绍
src:存放的是应用程序使用到的java文件. gen:系统自动生成的目录,不需要程序员进行修改,包含了R.java文件.该文件包含了 程序使用到的资源文件对应的唯一资源ID,注意:如果R文件生成错误 ...