ヘッダーをスキップ

Oracle TimesTen In-Memory Database APIおよびSQLリファレンス・ガイド リリース6.0 B25770-01 |
| 目次 | 索引

前へ | 次へ |

## SELECT

SELECT文は、1つ以上の表からデータを取得します。取得されたデータは、結果表または問合せ結果と呼ばれる表の形式で表示されます。

アクセス制御

TimesTenインスタンスでアクセス制御が有効な場合、この文にはSELECT権限またはデータ・ストア・オブジェクトの所有権が必要です。

SQL構文

- SELECT文の一般的な構文は、次のとおりです。

SELECT [FIRST NumRows] [ROWS M TO N] [ALL | DISTINCT] SelectList
FROM TableSpec [,...]
[WHERE SearchCondition]
[GROUP BY GroupColumnList]
[HAVING SearchCondition]
[ORDER BY {ColumnID| ColumnAlias | Expression {ASC | DESC}]
[,...]

[FOR UPDATE]

- UNION演算子は、2つの問合せの結果を結合します。それぞれの問合せ文のSelectListには互換性がある必要があります。UNIONを含むSELECT文の構文は、次のとおりです。

SELECT [ROWS M TO N] [ALL] SelectList
FROM TableSpec [,...]
[WHERE SearchCondition]
[GROUP BY GroupColumnList]
[HAVING SearchCondition] [,...]

[UNION [ALL]

SELECT [ROWS M TO N] [ALL] SelectList
FROM TableSpec [,...]
[WHERE SearchCondition]
[GROUP BY GroupColumnList]
[HAVING SearchCondition] [,...]
[ORDER BY {ColumnID| ColumnAlias | Expression {ASC | DESC}]

パラメータ

SELECT文には、次のパラメータがあります。

FIRST NumRows | 取得する行数を指定します。NumRowsには正のINTEGERを指定する必要があります。
ROWS M TO N | 取得する行の範囲を指定します。Mは選択する先頭行、Nは選択する最終行です。行のカウントは行1から開始します。問合せSELECT ROWS 1 to N...は、SELECT FIRST NumRowsと同じ行を返します（問合せが並べ替えられ、NおよびNumRowsの値が同じである場合）。
ALL | 問合せ結果の重複する行が削除されないようにします。ALLまたはDISTINCTのいずれも指定しない場合、ALLとみなされます。
DISTINCT | 問合せ結果の各行が一意となるようにします。この比較では、NULL値はすべて同じとみなされます。重複行は評価されません。
SelectList | 問合せ結果の列の導出方法を指定します。SelectListの構文の詳細は、「SelectList」を参照してください。
FROM TableSpec | SELECT文で参照される表を指定します。問合せごとの表の最大数は24です。 TableSpecは、行を選択する表を指定します。SELECT文のFROM句によって生成された導出表を指定することもできます。TableSpecの構文の詳細は、「TableSpec」を参照してください。
WHERE SearchCondition | WHERE句は取得する行のセットを決定します。通常、SearchConditionがFALSEまたはNULLと評価された行は、処理対象となりません。ただし、SearchConditionは、外部結合を指定するために使用できます。外部結合では、外部表の行うち、関連する内部表に対するSearchConditionの評価がTRUEでない行も返され、内部表を参照する投影式がNULLに設定されます。 列およびROWID式に単項演算子(+)を使用して、外部結合を示すことができます。(+)演算子は、内部表を参照する結合条件のすべての列およびROWID式の後に指定する必要があります。(+)演算子を使用するにはいくつか条件があります。通常、これらの条件によって、作成できる外部結合問合せの種類は制限されます。次のような条件があります。(+)演算子はWHERE句にのみ指定することができ、HAVING句には指定できません。また、副問合せを含む問合せでも使用できません。2つの表を外部結合することはできません。外部結合条件をORで結ぶことはできません。 検索条件の詳細は、「検索条件」を参照してください。
GROUP BY GroupColumnList | GROUP BY句は、SelectListに集計関数を指定したり、行のグループに関数を適用する場合に、グループ化する列を識別するために使用します。 GroupColumnListの構文は、次のとおりです。 {[[Owner.]TableName.]{ColumnName | ROWID}}[,...] GROUP BY句を使用する場合、SelectListには集計関数およびGROUP BY句で参照される列のみを含めることができます。SelectListに*、TableName.*、またはOwner.TableName.*構成要素が含まれている場合は、*に含まれているすべての列をGROUP BY句に含める必要があります。つまり、GROUP BY列リストに、単純な列をすべて含める必要があります。GROUP BY列には、通常の表の列またはROWID擬似列を指定できます。グループ化された列では、NULL値は同じ値とみなされます。他のすべての列が同じである場合、列中のすべてのNULLは単一のグループにまとめられます。 GROUP BY句を省略した場合、問合せの結果全体が1つのグループとして扱われます。
HAVING | SELECT問合せでHAVING句を使用して、集計結果のグループをフィルタ処理できます。SELECT問合せにHAVING句が存在すると、問合せは集計問合せとなります。WHERE句を除くすべての句の集計関数のソース以外で参照されるすべての列は、GROUP BY句に指定する必要があります。
(+) | 単純な結合（内部結合とも呼ばれる）では、SearchConditionで指定された結合条件を満たす結合表の行の組合せごとに1行が返されます。外部結合はこの演算子の拡張機能であり、結合された内部表での一致する行の有無に関係なく、外部表のすべての行が返されます。一致する行がなかった場合は、内部表を参照する投影式にNULL値が与えられます。
ORDER BY | 指定した列または式に基づいて、問合せの結果行をソートします。ソート・キーとして使用する列を、優先順位の高いものから順に指定します。最大255の列を指定できます。列ごとに、ソート順序を昇順または降順で指定できます。ASCまたはDESCのいずれも指定しない場合は、昇順が適用されます。文字列は、ASCIIデータのASCII照合順番に従って比較されます。 ORDER BY句では、列の別名がサポートされています。列の別名は、ORDER BY句でのみ参照可能です。単一の問合せ内では、同じ名前を持つ、列の別名を複数宣言できますが、その別名を参照するとエラーが発生します。 ORDER BY句では、NCHAR型はサポートされていません。
ColumnID | SelectListの列に対応する必要があります。ソートする列を指定するには、その名前または序数を指定します。SelectListの最初の列の番号は1です。SelectListの列を参照する場合、それが単純な列でない場合は、列番号を使用する方が適切です。これには、集計関数、算術式、定数などが該当します。 ORDER BY句のColumnIDの構文は、次のとおりです。 {ColumnNumber | [[Owner.]TableName.] ColumnName}
ColumnAlias | ORDER BY句で使用されます。列の別名はSelectListの列と対応している必要があります。同じ別名で複数の列を識別することができます。 {* | [Owner.]TableName.* | { Expression | [[Owner.]TableName.]ColumnName | [[Owner.]TableName.]ROWID } [[AS] ColumnAlias] } [,...]
FOR UPDATE | 分離モードに関係なく、現在のトランザクションが終了するまで、要素（通常は行）のロックを保持します。その要素に対する他のすべてのトランザクションの操作は、トランザクションがコミットまたはロールバックされるまで実行されません。 FOR UPDATEは、結合、ORDER BY、GROUP BYおよびDISTINCT句で使用されます。オプティマイザが選択した表/行のロック方法に応じて、表または行のいずれかの更新ロックが取得されます。 UPDATEモードでは、WHERE句の条件を満たすすべての表の行がロックされます。 行ロックを使用する場合、FROM句の表リストの表のうち、条件を満たすすべての行は、更新モードでロックされます。条件を満たす行は、WHERE句を満たす行です。表ロックを使用する場合、条件を満たす行の有無にかかわらず、表は更新モードでロックされます。 シリアライズ可能な分離レベルと行ロックが有効になっている場合、条件を満たさない行は共有モードに切り換えられます。シリアライズ可能でない分離レベルと行ロックが有効になっている場合、条件を満たさない行のロックは解除されます。 SELECT...FOR UPDATEのロックは、SELECTのロックによってはブロックされません。 SELECT...FOR UPDATEでは、副問合せはサポートされません。
SelectQuery1 UNION [ALL] SelectQuery2 | SelectQuery1およびSelectQuery2の結果が結合されることを指定します。SelectQuery1およびSelectQuery2は、いくつかの制限を含む一般的なSELECT文です。 ALLが指定されている場合は、両方のSELECT文の重複行が保持されます。ALLが指定されていない場合、重複行は削除されます。 両方のSELECT文で選択された対応するエントリのデータ型には、互換性が必要です。データ型を変換するには、CAST演算子を使用します。NULL値可能かどうかは一致している必要はありません。 結果内の列の長さは、列に対応する選択値のうち長い方になります。最終的な結果の列名は、最も左側で選択された列の名前になります。 UNIONの一方または両方のオペランドにUNIONを指定できます。ネストされたUNIONは、左から右に評価されます。 同じ問合せでUNIONおよびUNION ALLを同時に指定できます。 UNIONを含むSELECT文には、次の制限があります。 SELECT文では、FIRST NumRows演算子を指定できません。 SELECT文では、DISTINCTを指定できません。 UNIONを使用できるのは、SELECT文またはINSERT SELECT文の最も外側のみです。 最終結果をソートするためにORDER BYを指定することはできますが、UNIONの各オペランドで使用することはできません。ORDER BY句で指定できるのは、最も左側のSELECTの表の列名または列の別名のみです。 UNIONの各SELECTオペランドをグループ化するためにGROUP BYを使用することはできますが、UNIONの結果をグループ化することはできません。 マテリアライズド・ビュー、非マテリアライズド・ビュー、導出表、結合表では、UNIONを使用できません。

説明

- FOR UPDATEを使用する場合、対応する以降のUPDATE文では、カーソルを参照するWHERE CURRENT OF句を使用できません。WHERE CURRENT OF句はサポートされていないためです。
- 相関名を使用する場合は、基本名の構文ルールに従う相関名を使用する必要があります（「基本名」を参照）。1つのSELECT問合せ内のすべての相関名は一意である必要があります。相関名は、表をその表自身に結合する場合に役立ちます。表の列を指定するには、FROM句で表の相関名を複数定義し、SelectListおよびWHERE句で相関名を使用します。
- 副問合せは完全にはサポートされていないため、副問合せSELECT ... FOR UPDATEを外部問合せまたは内部問合せで使用することはできません。
- INSERT INTO ... SELECT ...FOR UPDATEはサポートされていません。
- UNION演算を含む問合せでは、FIRST NumRows句を使用できません。

##### 例13.79

次の例では、SELECT文で列の別名を使用します。

    SELECT max(salary) AS max_salary
    FROM employee WHERE employee.age < 30;

##### 例13.80

次の例では、2つの表OrdersおよびLineItemsを使用します。

次のようにしてOrders表を作成します。

    CREATE TABLE Orders(OrderNo INTEGER, OrderDate DATE, Customer
    CHAR(20));
    CREATE TABLE LineItems(OrderNo INTEGER, LineNo INTEGER,
        Qty INTEGER, UnitPrice DECIMAL(10,2));

    つまり、注文ごとにOrders表に1つのレコードがあり、注文の各明細を示すレコードがLineItemsにあります。

    年頭以降に入力されたすべてのOrdersの合計を検索するには、HAVING句を使用して、2000年1月1日以降に入力された注文のみを選択します。

    SELECT O.OrderNo, CUSTOMER, ORDERDATE, SUM(Qty * UnitPrice)
    FROM Orders O, LineItems L
    WHERE O.OrderNo=L.OrderNo
    GROUP BY O.OrderNo, CUSTOMER, ORDERDATE
    HAVING ORDERDATE >= DATE '2000-01-01';

##### 例13.81

次の問合せは、次の条件を満たすTableAのすべての行をロックします。

- TableA.Column1が、少なくとも1つのTableB.Column1の値と同じ。このとき、TableB.Column2は5より大きい。

また、この問合せは、次の条件を満たすTableBのすべての行もロックします。

- TableB.Column2が5より大きい。
- TableB.Column1が、少なくとも1つのTableA.Column1の値と同じ。

WHERE句を指定しない場合、両方の表のすべての行がロックされます。

    SELECT * FROM TableA, TableB
    WHERE TableA.Column1 = TableB.Column1 AND TableB.Column2 > 5
    FOR UPDATE

##### 例13.82

次の問合せは、内部表t2が2つの外部表（t1およびt3）に対応しているため、エラーとなります。

    SELECT * FROM t1, t2, t3
    WHERE t1.x = t2.x(+) and t3.y = t2.y(+);

    次に、有効な構文を示します。

    SELECT * FROM t1, t2
    WHERE t1.x = t2.x(+);

##### 例13.83

外部結合条件はORで連結できないため、次の問合せはエラーとなります。

    SELECT * FROM t1, t2, t3
    WHERE t1.x = t2.x(+) OR t3.y = 5;

    これに対し、次の問合せは有効です。

    SELECT * FROM t1, t2, t3
    WHERE t1.x = t2.x(+) AND (t3.y = 4 OR t3.y = 5);

##### 例13.84

IN演算子を使用して(+)記号の付いた列を比較することはできません。たとえば、次の問合せはエラーとなります。

    SELECT * FROM t1, t2, t3
    WHERE t1.x = t2.x(+) AND t2.y(+) IN (4,5);

    これに対し、次の問合せは有効です。

    SELECT * FROM t1, t2, t3
    WHERE t1.x = t2.x(+) AND t1.y IN (4,5);

##### 例13.85

次の問合せでは、結合条件ごとに(+)演算子が指定されておらず、(+)が指定されていない条件は内部結合条件として扱われるため、外部結合ではなく内部結合が実行されます。

    SELECT * FROM t1, t2
    WHERE t1.x = t2.x(+) AND t1.y = t2.y;

##### 例13.86

次の問合せのWHERE句には、外部結合の内部表の列と定数を比較する条件が含まれています。(+)演算子が指定されていないため、この条件は内部結合として扱われます。

    SELECT * FROM t1, t2
    WHERE t1.x = t2.x(+) AND t2.y = 3;

##### 例13.87

2つの表を同時に外部結合できないため、次の問合せはエラーとなります。

    SELECT * FROM t1, t2
    WHERE x1 = x2(+) AND y2 = y1(+);

##### 例13.88

student表内の現在の順序値を検索します。

    SELECT seq.CURRVAL FROM student;

##### 例13.89

次の問合せでは、(+)演算子が内部表t2の列x2に指定されていないため、条件x2 + y2(+) = 1は内部結合条件として扱われます。2つの表を同時に外部結合できないため、この文はエラーとなります。

    SELECT * FROM t1, t2
    WHERE x1 = x2(+) AND x2 + y2(+) = 1;

##### 例13.90

(+)演算子が結合条件に指定されていないため、次の問合せで外部結合は実行されません。

    SELECT * FROM t1, t2
    WHERE x2(+) = 1;

##### 例13.91

次の問合せは、キャッシュ・グループcacheTabと関連付けられたOracle表に対してのみ実行されます。

    SELECT * FROM tab1, tab2, cacheTab WHERE
    (tab1.pk = tab2.fk [AND tab2.pk = tab3.fk, ... ])
       [  AND (tab1.whereClause) ... ]
                AND (cacheTab.whereClause) [ AND
    (loadStmt.whereClause) ]
    FOR UPDATE ON ORACLE;

##### 例13.92

次の問合せのFROM句にはSELECT文が含まれているため、導出表が生成されます。

    SELECT * FROM t1, (SELECT MAX(x2) MAXX2 FROM t2) tab2 WHERE t1.x1 =
    tab2.MAXX2;

##### 例13.93

次の問合せは、2つのSELECT文の結果を結合します。

    SELECT * FROM t1 WHERE x1 IN (SELECT x2 FROM t2) UNION SELECT *
    FROM t1 WHERE x1 IN (SELECT x3 FROM t3);

##### 例13.94

カテゴリ内の最高価格と同じ価格のすべての注文を選択します。

    SELECT * FROM orders WHERE price = (SELECT MAX(price) FROM stock
    WHERE stock.cat=orders.cat);