SELECT¶
Name
SELECT -- はテーブルまたはビューから行を取得します
Synopsis
SELECT [ optimizer_hint ] [ ALL | DISTINCT | UNIQUE ]
* | expression [ AS output_name ] [, ...]
FROM from_item [, ...]
[ WHERE condition ]
[ [ START WITH start_expression ]
CONNECT BY { PRIOR parent_expr = child_expr |
child_expr = PRIOR parent_expr }
[ ORDER SIBLINGS BY expression [ ASC | DESC ] [, ...] ] ]
[ GROUP BY { expression | ROLLUP ( expr_list ) |
CUBE ( expr_list ) | GROUPING SETS ( expr_list ) } [, ...]
[ LEVEL ] ]
[ HAVING condition [, ...] ]
[ { UNION [ ALL ] | INTERSECT | MINUS } select ]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ FOR UPDATE [WAIT n|NOWAIT|SKIP LOCKED]]
ここで、 from_item は次のいずれかです。
table_name[@dblink ] [ alias ]
( select ) alias
from_item [ NATURAL ] join_type from_item
[ ON join_condition | USING ( join_column [, ...] ) ]
Description
SELECT は、1つ以上のテーブルから行を取得します。 SELECT の一般的な処理は次のとおりです。
FROMリストのすべての要素が計算されます。(FROMリストの各要素は実テーブルまたは仮想テーブルです。)FROMリストで複数の要素が指定されている場合、それらは相互に結合されます。(以下のFROM節を参照してください。)
WHERE句を指定すると、条件を満たさないすべての行が出力から削除されます。(以下のWHERE節を参照してください。)
GROUP BY句を指定すると、出力は1つ以上の値で一致する行のグループに分割されます。HAVING句が存在する場合、指定された条件を満たさないグループが削除されます。(以下のGROUP BY節およびHAVING節を参照してください。)演算子
UNION、「10」、「11」を使用すると、複数のSELECTステートメントの出力を組み合わせて、単一の結果セットを形成できます。UNION演算子は、結果セットの一方または両方にあるすべての行を返します。「10」演算子は、厳密に両方の結果セットにあるすべての行を返します。「11」演算子は、最初の結果セットにあるが2番目の結果セットにはない行を返します。3つの場合すべてで、重複する行は削除されます。UNION演算子の場合、ALLを指定すると、重複は削除されません。(以下のUNION節、「10」節、および「11」節を参照してください。)実際の出力行は、選択した各行の
SELECT出力式を使用して計算されます。(以下のSELECTリストを参照してください。)
CONNECT BY句は、階層関係を持つデータを選択するために使用されます。このようなデータには、行間に親子関係があります。(CONNECT BY節を参照してください。)
ORDER BY句が指定されている場合、返される行は指定された順序でソートされます。ORDER BYが指定されていない場合、システムが生成するのに最も速い順序で行が返されます。(以下のORDER BY clauseを参照してください。)
DISTINCT | UNIQUEは、結果から重複行を削除します。ALL(デフォルト)は、重複を含むすべての候補行を返します。(以下のDISTINCT | UNIQUE節を参照してください。)
FOR UPDATE句により、SELECTステートメントが選択された行を同時更新に対してロックします。(以下のFOR UPDATE節を参照してください。)
テーブルの値を読み取るには、テーブルに対する SELECT 権限が必要です。 FOR UPDATE を使用するには UPDATE 特権も必要です。
Parameters
optimizer_hint
実行計画を選択するためのオプティマイザーへのコメントが埋め込まれたヒント。オプティマイザーのヒントについては、『Oracle開発者向けデータベース互換性リファレンスガイド』の関数と演算子を参照してください。
FROM句¶
FROM 句は、 SELECT ステートメントの1つ以上のソーステーブルを指定します。構文は次のとおりです。
FROM source [, ...]
source は次の要素のいずれかです。
table_name[@dblink ]
既存のテーブルまたはビューの名前(オプションでスキーマ修飾)。
dblinkは、リモートデータベースを識別するデータベースリンク名です。データベースリンクの詳細については、CREATE DATABASE LINKコマンドを参照してください。
alias
エイリアスを含む
FROMアイテムの代替名。エイリアスは、簡潔にするため、または自己結合のあいまいさをなくすために使用されます(同じテーブルが複数回スキャンされる場合)。エイリアスが提供されると、テーブルまたは関数の実際の名前が完全に隠されます。たとえば、FROM foo AS fの場合、SELECTの残りの部分では、このFROM項目をfooではなくfとして参照する必要があります。
select
サブ
SELECTはFROM句に表示できます。これは、この単一のSELECTコマンドの間、出力が一時テーブルとして作成されたかのように機能します。サブSELECTは括弧で囲む必要があり、別名を指定する必要があることに注意してください。
join_type
次のいずれか:
[ INNER ] JOIN
LEFT [ OUTER ] JOIN
RIGHT [ OUTER ] JOIN
FULL [ OUTER ] JOIN
CROSS JOIN
INNERおよびOUTER結合タイプの場合、結合条件、つまりNATURAL、ON join_condition、またはUSING (join_column [, ...] )のいずれか1つだけを指定する必要があります。意味については以下を参照してください。CROSS JOINの場合、これらの条項は表示されません。
JOIN句は、2つのFROM項目を組み合わせます。必要に応じて括弧を使用して、ネストの順序を決定します。括弧がない場合、JOINsは左から右にネストします。いずれの場合も、JOINはFROM項目を区切るコンマよりも強くバインドします。
CROSS JOINとINNER JOINは単純なデカルト積を生成します。これは、FROMの最上位にある2つのアイテムをリストした場合と同じ結果ですが、結合条件(存在する場合)によって制限されます。CROSS JOINはINNER JOIN ON (TRUE)と同等です。つまり、修飾によって行は削除されません。これらの結合タイプは、プレーンなFROMとWHEREではできないことは何もしないので、単なる表記上の便宜です。
LEFT OUTER JOINは、修飾されたデカルト積のすべての行(つまり、結合条件に合格したすべての結合行)と、結合条件に合格した右側の行がなかった左側のテーブルの各行のコピーを1つ返します。この左側の行は、右側の列にヌル値を挿入することにより、結合されたテーブルの全幅に拡張されます。どの行が一致するかを決定する際に、JOIN句の条件のみが考慮されることに注意してください。その後、外部条件が適用されます。逆に、
RIGHT OUTER JOINは、結合されたすべての行に加えて、一致しない右側の行ごとに1行を返します(左側にヌルが拡張されます)。左右の入力を切り替えることでLEFT OUTER JOINに変換できるため、これは単なる表記上の利便性です。
FULL OUTER JOINは、結合されたすべての行に加えて、一致しない左側の行ごとに1行(右側にnullが拡張)、および一致しない右側の行ごとに1行(左側にnullが拡張)を返します。
ON join_condition
join_conditionは、結合内のどの行が一致すると見なされるかを指定するBOOLEAN型の値(WHERE句に類似)をもたらす式です。
USING (join_column [, ...] )
USING (a, b, ... )という形式の句はON left_table.a = right_table.a AND left_table.b = right_table.b ....の省略形です。また、USINGは、同等の列の各ペアの一方のみが結合出力に含まれ、両方は含まれないことを意味します。
NATURAL
NATURALは、同じ名前を持つ2つのテーブルのすべての列に言及するUSINGリストの省略形です。
複数のソースが指定されている場合、結果はすべてのソースのデカルト積(クロス結合)です。通常、返される行をデカルト積の小さなサブセットに制限するために、修飾条件が追加されます。
Example
次の例は、 dept テーブルからすべてのエントリを選択します。
SELECT * FROM dept;
deptno | dname | loc
-------+-------------+-----------
10 | ACCOUNTING | NEW YORK
20 | RESEARCH | DALLAS
30 | SALES | CHICAGO
40 | OPERATIONS | BOSTON
(4 rows)
WHERE句¶
オプションの WHERE 句の形式は次のとおりです。
WHERE condition
ここで、 condition は、タイプ BOOLEAN の結果に評価される任意の式です。この条件を満たさない行は出力から削除されます。実際の行の値が変数参照に置き換えられたときに TRUE を返す場合、行は条件を満たします。
Example
次の例では、 emp テーブルと dept テーブルの内容を結合します。 WHERE emp テーブルの deptno 列の値は deptno の deptno 列の値と等しくなります表:
SELECT d.deptno, d.dname, e.empno, e.ename, e.mgr, e.hiredate
FROM emp e, dept d
WHERE d.deptno = e.deptno;
deptno | dname | empno | ename | mgr | hiredate
--------+------------+-------+--------+------+--------------------
10 | ACCOUNTING | 7934 | MILLER | 7782 | 23-JAN-82 00:00:00
10 | ACCOUNTING | 7782 | CLARK | 7839 | 09-JUN-81 00:00:00
10 | ACCOUNTING | 7839 | KING | | 17-NOV-81 00:00:00
20 | RESEARCH | 7788 | SCOTT | 7566 | 19-APR-87 00:00:00
20 | RESEARCH | 7566 | JONES | 7839 | 02-APR-81 00:00:00
20 | RESEARCH | 7369 | SMITH | 7902 | 17-DEC-80 00:00:00
20 | RESEARCH | 7876 | ADAMS | 7788 | 23-MAY-87 00:00:00
20 | RESEARCH | 7902 | FORD | 7566 | 03-DEC-81 00:00:00
30 | SALES | 7521 | WARD | 7698 | 22-FEB-81 00:00:00
30 | SALES | 7844 | TURNER | 7698 | 08-SEP-81 00:00:00
30 | SALES | 7499 | ALLEN | 7698 | 20-FEB-81 00:00:00
30 | SALES | 7698 | BLAKE | 7839 | 01-MAY-81 00:00:00
30 | SALES | 7654 | MARTIN | 7698 | 28-SEP-81 00:00:00
30 | SALES | 7900 | JAMES | 7698 | 03-DEC-81 00:00:00
(14 rows)
GROUPBY句¶
オプションの GROUP BY 句の形式は次のとおりです。
GROUP BY { expression | ROLLUP ( expr_list ) |
CUBE ( expr_list ) | GROUPING SETS ( expr_list ) } [, ...]
GROUP BY は、グループ化された式と同じ値を共有するすべての選択された行を単一の行に凝縮します。 expression は、入力列名、出力列の名前または序数( SELECT リスト項目)、または入力列の値から形成される任意の式です。あいまいな場合、 GROUP BY の名前は出力列名ではなく入力列名として解釈されます。
ROLLUP 、 CUBE 、および GROUPING SETS は、多次元分析をサポートするための GROUP BY 節の拡張です。
集計関数が使用されている場合、各グループを構成するすべての行で集計関数が計算され、各グループに個別の値が生成されます( GROUP BY がない場合、集計は選択されたすべての行で計算された単一の値を生成します)。 GROUP BY が存在する場合、 SELECT リスト式が集計関数内を除き、グループ化されていない列を参照することは無効です。グループ化されていない列に対して返される値は複数あるためです。
Example
次の例では、 emp テーブルの sal 列の合計を計算し、結果を部門番号でグループ化します。
SELECT deptno, SUM(sal) AS total
FROM emp
GROUP BY deptno;
deptno | total
--------+----------
10 | 8750.00
20 | 10875.00
30 | 9400.00
(3 rows)
HAVING句¶
オプションの HAVING 句の形式は次のとおりです。
HAVING condition
ここで、 condition は WHERE 句で指定したものと同じです。
HAVING は、指定された条件を満たさないグループ行を削除します。 HAVING は WHERE; WHERE とは異なり、 GROUP BY を適用する前に個々の行をフィルタリングしますが、 HAVING は GROUP BY によって作成されたグループ行をフィルタリングします。conditionで参照される各列は、集約関数内に参照が表示されない限り、明確にグループ化列を参照する必要があります。
Example
すべての従業員の sal 列を合計するには、部門番号で結果をグループ化し、10000未満のグループ合計を表示します。
SELECT deptno, SUM(sal) AS total
FROM emp
GROUP BY deptno
HAVING SUM(sal) < 10000;
deptno | total
--------+---------
10 | 8750.00
30 | 9400.00
(2 rows)
選択リスト¶
SELECT リスト(キーワード SELECT と FROM の間)は、 SELECT ステートメントの出力行を形成する式を指定します。式は、 FROM 句で計算された列を参照できます(通常は参照します)。 AS output_name 句を使用すると、出力列に別の名前を指定できます。この名前は主に、表示する列にラベルを付けるために使用されます。また、 ORDER BY および GROUP BY 句で列の値を参照するために使用できますが、 WHERE または HAVING 句では使用できません。そこで、代わりに式を書き出す必要があります。
式の代わりに、選択した行のすべての列の省略形として*を出力リストに書き込むことができます。
Example
次の例の SELECT リストは、結果セットに empno 列、 ename 列、 mgr 列、および hiredate 列を含めることを指定しています。
SELECT empno, ename, mgr, hiredate FROM emp;
empno | ename | mgr | hiredate
-------+--------+------+--------------------
7934 | MILLER | 7782 | 23-JAN-82 00:00:00
7782 | CLARK | 7839 | 09-JUN-81 00:00:00
7839 | KING | | 17-NOV-81 00:00:00
7788 | SCOTT | 7566 | 19-APR-87 00:00:00
7566 | JONES | 7839 | 02-APR-81 00:00:00
7369 | SMITH | 7902 | 17-DEC-80 00:00:00
7876 | ADAMS | 7788 | 23-MAY-87 00:00:00
7902 | FORD | 7566 | 03-DEC-81 00:00:00
7521 | WARD | 7698 | 22-FEB-81 00:00:00
7844 | TURNER | 7698 | 08-SEP-81 00:00:00
7499 | ALLEN | 7698 | 20-FEB-81 00:00:00
7698 | BLAKE | 7839 | 01-MAY-81 00:00:00
7654 | MARTIN | 7698 | 28-SEP-81 00:00:00
7900 | JAMES | 7698 | 03-DEC-81 00:00:00
(14 rows)
UNION句¶
UNION 句の形式は次のとおりです。
select_statement UNION [ ALL ] select_statement
select_statement は、 ORDER BY または FOR UPDATE 節のない SELECT ステートメントです。( ORDER BY は、括弧で囲まれている場合、部分式に付加できます。括弧がない場合、これらの句は、右側の入力式ではなく、 UNION の結果に適用されます。)
UNION 演算子は、関連する SELECT ステートメントによって返される行の集合を計算します。行は、結果セットの少なくとも1つに表示される場合、2つの結果セットの和集合にあります。 UNION の直接オペランドを表す2つの SELECT ステートメントは、同じ数の列を生成する必要があり、対応する列は互換性のあるデータ型である必要があります。
ALL オプションを指定しない限り、 UNION の結果には重複行が含まれません。 ALL は重複の排除を防ぎます。
同じ SELECT ステートメント内の複数の UNION 演算子は、括弧で特に指定されていない限り、左から右に評価されます。
現在、 FOR UPDATE は UNION の結果にも UNION の入力にも指定できません。
INTERSECT句¶
INTERSECT 句の形式は次のとおりです。
select_statement INTERSECT select_statement
select_statement は、 ORDER BY または FOR UPDATE 句のない SELECT ステートメントです。
INTERSECT 演算子は、関連する SELECT ステートメントによって返される行の集合交差を計算します。行は、両方の結果セットに表示される場合、2つの結果セットの共通部分にあります。
INTERSECT の結果には、重複する行は含まれません。
同じ SELECT ステートメント内の複数の INTERSECT 演算子は、括弧で別段の指示がない限り、左から右に評価されます。 INTERSECT は UNION よりも強く結合します。つまり、 A UNION B INTERSECT C は A UNION (B INTERSECT C) と読み替えられます。
マイナス句¶
MINUS 句の一般的な形式は次のとおりです。
select_statement MINUS select_statement
select_statement は、 ORDER BY または FOR UPDATE 句のない SELECT ステートメントです。
MINUS 演算子は、左の SELECT ステートメントの結果に含まれる行のセットを計算しますが、右の SELECT ステートメントの結果には含まれません。
MINUS の結果には、重複する行は含まれません。
同じ SELECT ステートメント内の複数の MINUS 演算子は、括弧で別段の指示がない限り、左から右に評価されます。 MINUS は UNION と同じレベルでバインドします。
CONNECTBY句¶
CONNECT BY 句は、階層クエリを実行するときに行の親子関係を決定します。一般的な形式は次のとおりです。
CONNECT BY { PRIOR parent_expr = child_expr |
child_expr = PRIOR parent_expr }
parent_expr は、候補の親行で評価されます。 FROM 句によって返された行に対して parent_expr = child_expr の結果 TRUE になる場合、この行は親の子と見なされます。
次のオプションの句は、 CONNECT BY 句と組み合わせて指定できます。
START WITH start_expression
start_expressionがTRUEと評価されるFROM句によって返される行は、階層のルートノードになります。
ORDER SIBLINGS BY expression [ ASC | DESC ] [, ...]
階層の兄弟行は、結果セットの
expressionで順序付けられます。
注釈
AdvancedServerは、 CONNECT BY 句での AND (または他の演算子)の使用をサポートしていません。
ORDERBY句¶
オプションの ORDER BY 句の形式は次のとおりです。
ORDER BY expression [ ASC | DESC ] [, ...]
expression は、出力列の名前または序数( SELECT リスト項目)であるか、入力列の値から形成される任意の式です。
ORDER BY 句を使用すると、指定した式に従って結果行がソートされます。左端の式に従って2つの行が等しい場合、次の式に従って比較されます。指定されたすべての式に従って等しい場合、実装依存の順序で返されます。
序数は、結果列の序数(左から右)の位置を指します。この機能により、一意の名前を持たない列に基づいて順序を定義できます。 AS 句を使用して結果列に名前を割り当てることが常に可能であるため、これは絶対に必要ではありません。
SELECT 結果リストに表示されない列を含む ORDER BY 句で任意の式を使用することもできます。したがって、次のステートメントは有効です。
SELECT ename FROM emp ORDER BY empno;
この機能の制限は、 UNION 、 INTERSECT 、または MINUS 句の結果に適用される ORDER BY 句は、式ではなく出力列名または番号のみを指定できることです。
ORDER BY 式が結果列名と入力列名の両方に一致する単純な名前である場合、 ORDER BY はそれを結果列名として解釈します。これは、 GROUP BY が同じ状況で行う選択の反対です。この不整合は、SQL標準との互換性を保つために作成されています。
オプションで、 ORDER BY 句の式の後にキーワード ASC (昇順)または DESC (降順)を追加できます。指定しない場合、デフォルトで ASC が想定されます。
null値は他のどの値よりも高くソートされます。つまり、昇順のソート順ではnull値が最後にソートされ、降順のソート順ではnull値が先頭にソートされます。
文字列データは、データベースクラスターの初期化時に確立されたロケール固有の照合順序に従って並べ替えられます。
注釈
SELECT DISTINCT が指定されている場合、または SELECT ステートメントに SELECT DISTINCT ...ORDER BY 句が含まれている場合、 ORDER BY のすべての式が SELECT DISTINCT クエリの選択リストに存在する必要があります。
Examples
次の2つの例は、2番目の列( dname )の内容に従って個々の結果をソートする同一の方法です。
SELECT * FROM dept ORDER BY dname;
deptno | dname | loc
--------+------------+----------
10 | ACCOUNTING | NEW YORK
40 | OPERATIONS | BOSTON
20 | RESEARCH | DALLAS
30 | SALES | CHICAGO
(4 rows)
SELECT * FROM dept ORDER BY 2;
deptno | dname | loc
--------+------------+----------
10 | ACCOUNTING | NEW YORK
40 | OPERATIONS | BOSTON
20 | RESEARCH | DALLAS
30 | SALES | CHICAGO
(4 rows)
次の例では、 SELECT DISTINCT ...ORDER BY 句を使用して、テーブル emp から job と deptno をフェッチします。
CREATE TABLE EMP(EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
DEPTNO NUMBER(2));
INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK', 20);
INSERT 0 1
INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 30);
INSERT 0 1
INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 30);
INSERT 0 1
INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER', 20);
INSERT 0 1
SELECT DISTINCT e.job, e.deptno FROM emp e ORDER BY e.job, e.deptno;
job | deptno
----------+--------
CLERK | 20
MANAGER | 20
SALESMAN | 30
(3 rows)
DISTINCT|一意句¶
SELECT ステートメントが DISTINCT または UNIQUE を指定する場合、すべての重複行が結果セットから削除されます(重複の各グループから1行が保持されます)。 DISTINCT または UNIQUE 節は、 SELECT ステートメントと一緒に使用すると同義です。 ALL キーワードは反対を指定します。すべての行が保持されます。それがデフォルトです。
DISTINCT または UNIQUE キーワードを含む SELECT ステートメントの不適切な使用に起因するエラーメッセージには、以下に示すように DISTINCT | UNIQUE キーワードの両方が含まれます。
psql: ERROR: FOR UPDATE is not allowed with DISTINCT/UNIQUE clause
FORUPDATE句¶
FOR UPDATE 句の形式は次のとおりです。
FOR UPDATE [WAIT n|NOWAIT|SKIP LOCKED]
FOR UPDATE を指定すると、 SELECT ステートメントによって取得された行が更新のためにロックされます。これにより、現在のトランザクションが終了するまで、行が他のトランザクションによって変更または削除されるのを防ぎます。選択した行を UPDATE 、 DELETE 、または SELECT FOR UPDATE にしようとするトランザクションは、現在のトランザクションが終了するまでブロックされます。別のトランザクションの UPDATE 、 DELETE 、または SELECT FOR UPDATE がすでに選択した行をロックしている場合、 SELECT FOR UPDATE は最初のトランザクションが完了するのを待ってから、更新された行をロックして返します(または行(行が削除された場合)。
FOR UPDATE は、返された行を個々のテーブル行で明確に識別できないコンテキストでは使用できません(たとえば、集計で)。
FOR UPDATE オプションを使用してロック設定を指定します。
WAIT nキーワードを含めて、SELECTステートメントが別のセッションによってロックされた行を待機する秒数(または小数秒)を指定します。小数秒を指定するには、小数形式を使用します。たとえば、WAIT 1.5は1秒半待機するようサーバーに指示します。小数点の右側に4桁まで指定します。現在のセッションで行をロックできない場合にすぐにエラーを報告するには、
NOWAITキーワードを含めます。
SKIP LOCKEDを含めて、可能であればサーバーに行をロックするように指示し、別のセッションによって既にロックされている行をスキップします。