SELECT

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

必要な権限

オブジェクトの所有者に必要な権限はありません。

別のユーザーのオブジェクトの場合、SELECTが必要です。

別のユーザーのオブジェクトの場合、SELECT ... FOR UPDATEにはUPDATE権限も必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

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

[WithClause] SELECT [hint][FIRST NumRows | ROWS m TO n] [ALL | DISTINCT] SelectList
  FROM TableSpec [,...]
  [WHERE SearchCondition]
  [GROUP BY GroupByClause [,...] [HAVING SearchCondition]]
  [ORDER BY OrderByClause [,...]]
  [FOR UPDATE [OF [[Owner.]TableName.]ColumnName [,...]] 
    [NOWAIT | WAIT Seconds]]

集合演算子UNIONUNION ALLMINUSまたはINTERSECTを含むSELECT文の構文は、次のとおりです。

SELECT [hint] [ROWS m TO n] [ALL] SelectList
  FROM TableSpec [,...]
    [WHERE SearchCondition]
    [GROUP BY GroupByClause [,...] [HAVING SearchCondition] [,...]]
  {UNION [ALL] | MINUS | INTERSECT}
  SELECT [ROWS m TO n] [ALL] SelectList
    FROM TableSpec [,...]
     [WHERE SearchCondition]
     [GROUP BY GroupByClause [,...] [HAVING SearchCondition [,...] ] ]
     [ORDER BY OrderByClause [,...] ]

OrderByClauseの構文は次のとおりです。

{ColumnID|ColumnAlias|Expression} [ASC|DESC] [NULLS { FIRST|LAST }]

パラメータ

パラメータ 説明

[WithClause]

WITH句は、副問合せのファクタリングとも呼ばれ、副問合せブロックに名前を割り当てることができ、その後はその名前をトップレベルのSELECT文で複数回参照できます。WithClauseの構文の詳細は、「WithClause」を参照してください。

hint

SELECT文に文レベルのオプティマイザ・ヒントを指定します。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

FIRST NumRows

取得する行の数を指定します。NumRowsには、正のINTEGER値か動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。

ROWS m TO n

取得する行の範囲を指定し、mは選択する最初の行、nは選択する最後の行です。行のカウントは、行1から始まります。問合せが順序付けられ、nNumRowsの値が同じであれば、問合せSELECT ROWS 1 TO nは、SELECT FIRST NumRowsと同じ行を返します。

mおよびn値には、正のINTEGER値か動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。

ALL

問合せ結果の重複する行が削除されないようにします。ALLDISTINCTも指定しない場合は、ALLがデフォルトです。

DISTINCT

問合せ結果の各行が一意となるようにします。この比較では、NULL値はすべて同じとみなされます。重複行は評価されません。

LOB列にはSELECT ...は使用できません。

SelectList

問合せ結果の列の導出方法を指定します。選択リストの構文の詳細は、「SelectList」を参照してください。

FROM TableSpec

SELECT文で参照される表を指定します。問合せごとの表の最大数は24です。

TableSpecは、行を選択する表を指定します。SELECT文のFROM句によって生成された導出表を指定することもできます。TableSpec構文の詳細は、「TableSpec」を参照してください。

WHERE SearchCondition

WHERE句は、取得される行のセットを決定します。通常、SearchConditionFALSEまたはNULLの行は処理から除外されますが、SearchConditionを使用して外部結合を指定でき、外部結合では、関連する内部表の行に関してSearchConditionTRUEと評価されない外部表の行も返され、内部表を参照する投影式はNULLに設定されます。

列およびROWID式に単項演算子(+)を使用して、外部結合を示すことができます。(+)演算子は、内部表を参照する結合条件のすべての列およびROWID式の後に指定する必要があります。(+)演算子を使用するにはいくつか条件があります。通常、これらの条件によって、作成できる外部結合問合せの種類は制限されます。(+)演算子はWHERE句に指定することができ、HAVING句には指定できません。2つの表を外部結合することはできません。外部結合条件をORで結ぶことはできません。

検索条件の詳細は、「検索条件」を参照してください。

GROUP BY GroupByClause [,...]

GROUP BY句には、1つ以上の式を指定して、SelectListに集計関数を指定したり、行のグループに関数を適用する場合のグループ化に使用します。GROUP BY句の構文の詳細は、「GROUP BY句」を参照してください。

HAVING SearchCondition

SELECT文でHAVING句を使用して、集計結果のグループをフィルタ処理できます。SELECT文にHAVING句が存在すると、問合せは集計問合せとなります。WHERE句を除く句の集計関数のソース以外で参照されるすべての列は、GROUP BY句に指定する必要があります。

副問合せは、HAVING句で指定できます。

(+)

単純な結合(内部結合とも呼ばれる)では、SearchConditionで指定された結合条件を満たす結合表の行の組合せごとに1行が返されます。外部結合はこの演算子の拡張機能であり、結合された内部表での一致する行の有無に関係なく、外部表のすべての行が返されます。一致する行がなかった場合は、内部表を参照する投影式にNULL値が与えられます。

ORDER BY OrderByClause [,...]

指定した列または式に基づいて、問合せの結果行をソートします。ソート・キーとして使用する列を、優先順位の高いものから順に指定します。

ORDER BY句は列の別名をサポートしており、列の別名はORDER BY 句でのみ参照できます。単一の問合せ内では、同じ名前を持つ、列の別名を複数宣言できますが、その別名を参照するとエラーが発生します。

ColumnID

選択リストの列に対応する必要があります。ソートする列を指定するには、その名前または序数を指定します。選択リストの最初の列の番号は1です。選択リストの列を参照する場合、それが単純な列でない場合は、列番号を使用する方が適切です。これには、集計関数、算術式、定数などが該当します。

ORDER BY句のColumnIDには、次の構文があります。

{ColumnNumber |[[Owner.]TableName.] ColumnName}

ColumnAlias

ORDER BY句で使用される列の別名は、SelectListの列に対応している必要があります。同じ別名で複数の列を指定できます。

{* | [Owner.]TableName.* |

{Expression | [[Owner.]TableName.]ColumnName |

[[Owner.]TableName.]ROWID

}

[[AS] ColumnAlias]} [,...]

ASC|DESC

ORDER BY句で指定する列ごとに、ソート順序を昇順または降順で指定できます。ASC(昇順)またはDESC(降順)のいずれも指定しない場合は、昇順が適用されます。すべての文字データ型は、NLS_SORTセッション・パラメータの現在の値に従ってソートされます。

NULLS { FIRST|LAST }

ORDER BY句を指定する場合にのみ有効であり、オプションです。ASCまたはDESCを指定する場合、NULLS FIRSTまたはNULLS LASTASCまたはDESCの後に指定する必要があります。

順序付けする問合せでNULL値の行が最初に返されるようにするには、NULLS FIRSTを指定します。順序付けする問合せでNULL値の行が最後に返されるようにするには、NULLS LASTを指定します。行が昇順で返される場合は、NULLS LASTがデフォルトです。行が降順で返される場合は、NULLS FIRSTがデフォルトです。

ORDER BY句を指定する際に、ASCまたはDESC句を指定せず、NULLS FIRSTまたはNULLS LAST句を指定しない場合、デフォルトの順序は、昇順のNULLS LASTです。

FOR UPDATE

[OF [[Owner.]

TableName.]

ColumnName [,...]]

[NOWAIT | WAIT Seconds]

FOR UPDATE

  • FOR UPDATEは、分離モードに関係なく、現在のトランザクションが終了するまで、行のロックを保持します。その行に対する他のすべてのトランザクションの操作は、トランザクションがコミットまたはロールバックされるまで実行されません。

  • FOR UPDATEは、結合、ORDER BYGROUP BYおよびDISTINCT句で使用されます。オプティマイザが選択した表/行のロック方法に応じて、表または行のいずれかの更新ロックが取得されます。

  • FOR UPDATE OF句が指定されていないかぎり、UPDATEモードでは、WHERE句の条件を満たすすべての表の行がロックされます。この句ではロックする表を指定します。

  • 行ロックを使用する場合、FROM句の表リストのすべての表で、条件を満たすすべての行が更新モードでロックされます。条件を満たす行とは、WHERE句を満たす行です。表ロックを使用する場合、条件を満たす行の有無にかかわらず、表は更新モードでロックされます。

  • シリアライズ可能な分離レベルと行ロックが有効になっている場合、条件を満たさない行は共有モードにダウングレードされます。コミット読取り分離レベルと行ロックが有効になっている場合、条件を満たさない行のロックは解除されます。

  • SELECT...FOR UPDATEのロックは、SELECTのロックによってはブロックされません。

FOR UPDATE [OF [[Owner.]TableName.]ColumnName [,...] ]

  • このモードでは、オプションで、更新のためにロックされる表の列名を含めます。

[NOWAIT | WAIT Seconds ]

  • これは、選択した行がロックされている場合の処理方法を指定します。表レベルのロックまたはデータベース・レベルのロックには適用されません。

  • NOWAITは、ロックの待機時間がないことを指定します。ロックを取得できない場合、エラーが返されます。

  • WAIT Secondsはロック・タイムアウト設定を指定します。

    指定された時間内にロックを取得できない場合、エラーが返されます。

    ロックのタイムアウト設定は、秒または小数秒単位で表されます。Secondsのデータ型はNUMBERです。0.0から1000000.0の値が有効です。

  • NOWAITおよびWAITのいずれも指定しない場合、トランザクションのロック・タイムアウト間隔が使用されます。

SelectQuery1

{UNION [ALL] | MINUS | INTERSECT}

SelectQuery2

SelectQuery1およびSelectQuery2の結果が結合されることを指定し、この場合、SelectQuery1およびSelectQuery2は、いくつかの制限を含む一般的なSELECT文です。

UNION演算子は、SelectListに互換性のある2つの問合せの結果を結合します。UNION ALLを指定した場合、両方のSELECT文から返された重複する行が保持されます。その他の場合、重複は削除されます。

MINUS演算子は、最初の問合せで返されたが2番目の問合せで返されなかった行を1つの結果に結合します。

INTERSECT演算子は、両方の問合せで返された行のみを1つの結果に結合します。

両方のSELECT文で選択された対応するエントリのデータ型には、互換性が必要です。データ型を変換するには、CAST演算子を使用します。NULL値可能かどうかは一致している必要はありません。

結果内の列の長さは、列に対応する選択値のうち長い方になります。最終的な結果の列名は、最も左側で選択された列の名前になります。

集合演算子UNIONUNION ALLMINUSINTERSECTを使用して、複数の問合せを組み合せることができます。

集合演算子の一方または両方のオペランドに集合演算子を指定できます。複数の集合演算子やネストされた集合演算子は、左から右に評価されます。

同じ問合せで集合演算子を同時に指定できます。

集合演算子を指定するSELECT文には、次の制限があります。

  • どちらのSELECT文でも、FIRST NumRowsは指定できません。

  • UNIONUNION ALLMINUSまたはINTERSECTSELECT副問合せは、同じ数の投影式が必要です。このことは、INSERT...SELECTにも該当します。

  • 最終結果をソートするためにORDER BYを指定することはできますが、集合演算子の各オペランドで使用することはできません。ORDER BY句で指定できるのは、最も左側のSELECT文の表の列名または列の別名のみです。

  • GROUP BYは、集合演算子の各SELECTオペランドをグループ化するために使用できますが、集合演算子の結果をグループ化するためには使用できません。

  • マテリアライズド・ビューや結合表では、集合演算子を使用できません。

説明

  • 相関名を使用する場合、相関名は基本名の構文ルールを満たしている必要があります。1つのSELECT文のすべての相関名は、一意である必要があります。相関名は、表をその表自体に結合する場合に役立ちます。FROM句内で表の相関名を複数回定義し、選択リストとWHERE句でその相関名を使用して、その表の列を指定します。相関名の詳細は、「TableSpec」を参照してください。

  • SELECT...FOR UPDATEは副問合せを指定するSELECT文で使用できますが、最も外側の問合せでのみ指定できます。

  • 問合せで、FIRST NumRowsまたはROWS m TO nが指定されている場合、返される行の数を制限するためにROWNUMを使用することはできません。

  • FIRST NumRowsROWS m TO nは、同じSELECT文で同時に使用することはできません。

  • PL/SQLでSELECT...INTO文を使用します。PL/SQLの外側でSELECT...INTO文を使用する場合、TimesTenでは構文は許容されますが、暗黙的に無視されます。

この例では、SELECT文での列の別名(max_salary)の使用方法を示します。

SELECT MAX(salary) AS max_salary 
FROM employees 
WHERE employees.hire_date > '2000-01-01 00:00:00';
< 10500 >
1 row found.

この例では、2つの表ordersおよびlineitemsを使用します。

orders表およびlineitems表は、次のように作成されます。

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にあります。

年頭以降に入力されたすべての注文の合計を検索するには、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';

次の問合せについて考えてみます:

SELECT * FROM tablea, tableb
WHERE tablea.column1 = tableb.column1 AND tableb.column2 > 5
FOR UPDATE;

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

  • tablea.column1の値が、少なくとも1つのtableb.column1の値と同じ。このとき、tableb.column2は5より大きい。

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

  • tableb.column2の値が5よりも大きい。

  • tableb.column1の値が、少なくとも1つのtablea.column1の値と同じ。

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

この例は、(+)結合演算子を示しています。

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

外部結合条件は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);

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);

次の問合せは、内部結合になります。(+)演算子が指定されていない条件は、内部結合として扱われます。

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

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

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

結合のその他の例は、「JoinedTable」を参照してください。

次の例は、student表の順序の現在の値を返します。

SELECT SEQ.CURRVAL FROM student;

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

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

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

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

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

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

次の例では、INTERSECT集合演算子の使用方法を示します。employees表にNULLdepartment_id値があります。departments表では、department_idNOT NULLの主キーとして定義されます。INTERSECT集合演算子を使用して返される行には、department_id値がNULLdepartments表の行は含まれません。

Command> SELECT department_id FROM employees INTERSECT SELECT department_id 
         FROM departments;
< 10 >
< 20 >
< 30 >
< 40 >
< 50 >
< 60 >
< 70 >
< 80 >
< 90 >
< 100 >
< 110 >
11 rows found.
Command> SELECT DISTINCT department_id FROM employees;
< 10 >
< 20 >
< 30 >
< 40 >
< 50 >
< 60 >
< 70 >
< 80 >
< 90 >
< 100 >
< 110 >
< <NULL> >
12 rows found.

次の例では、最初の問合せでは返されるが、2番目の問合せでは返されない行を組み合せて、MINUS集合演算子の使用方法を示します。employees表にNULLdepartment_id値を含む行のみが返されます。

Command> SELECT department_id FROM employees 
         MINUS SELECT department_id FROM departments;
< <NULL> >
1 row found.

次の例では、GROUP BY句におけるSUBSTR式の使用方法およびHAVING句における副問合せの使用方法を示します。最初の10行が返されます。

Command> SELECT ROWS 1 TO 10 SUBSTR (job_id, 4,10), department_id, manager_id, 
         SUM (salary) FROM employees
         GROUP BY SUBSTR (job_id,4,10),department_id, manager_id
         HAVING (department_id, manager_id) IN
          (SELECT department_id, manager_id FROM employees x
           WHERE x.department_id = employees.department_id)
         ORDER BY SUBSTR (job_id, 4,10),department_id,manager_id;
< ACCOUNT, 100, 108, 39600 >
< ACCOUNT, 110, 205, 8300 >
< ASST, 10, 101, 4400 >
< CLERK, 30, 114, 13900 >
< CLERK, 50, 120, 22100 >
< CLERK, 50, 121, 25400 >
< CLERK, 50, 122, 23600 >
< CLERK, 50, 123, 25900 >
< CLERK, 50, 124, 23000 >
< MAN, 20, 100, 13000 >
10 rows found.

次の例では、更新のためにemployees表をロックし、ロックが取得できるまで10秒間待機します。ロックが10秒以内に取得できない場合、エラーが返されます。最初の5行が選択されます。

Command> SELECT FIRST 5 last_name FROM employees FOR UPDATE WAIT 10;
< King >
< Kochhar >
< De Haan >
< Hunold >
< Ernst >
5 rows found.

次の例では、更新のためにdepartments表をロックします。選択した行が別のプロセスにロックされており、ロックが取得できない場合はエラーが返されます。これは、NOWAITが指定されているためです。

Command> SELECT FIRST 5 last_name e FROM employees e, departments d 
         WHERE e.department_id = d.department_id 
         FOR UPDATE OF d.department_id NOWAIT;
< Whalen >
< Hartstein >
< Fay >
< Raphaely >
< Khoo >
5 rows found.

次のように、HRスキーマを使用して、副問合せとFOR UPDATE句を同時に使用する例を示します。

Command> SELECT employee_id, job_id FROM job_history 
         WHERE (employee_id, job_id) NOT IN (SELECT employee_id, job_id 
         FROM employees) 
         FOR UPDATE;
< 101, AC_ACCOUNT >
< 101, AC_MGR >
< 102, IT_PROG >
< 114, ST_CLERK >
< 122, ST_CLERK >
< 176, SA_MAN >
< 200, AC_ACCOUNT >
< 201, MK_REP >
8 rows found.

次のように、SELECT ROWS m TO nおよびSELECT FIRSTの動的パラメータのプレースホルダを使用します。

Command> SELECT ROWS ? TO ? employee_id FROM employees;

Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.

Enter Parameter 1 (TT_INTEGER) > 1
Enter Parameter 2 (TT_INTEGER) > 3
< 100 >
< 101 >
< 102 >
3 rows found.
Command> SELECT ROWS :a TO :b employee_id FROM employees;

Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.

Enter Parameter 1 (TT_INTEGER) > 1
Enter Parameter 2 (TT_INTEGER) > 3
< 100 >
< 101 >
< 102 >
3 rows found.
Command> SELECT FIRST ? employee_id FROM employees;

Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.

Enter Parameter 1 (TT_INTEGER) > 3
< 100 >
< 101 >
< 102 >
3 rows found.

次の例では、ORDER BY句でのNULLS LASTの使用方法を示します。employees表を問い合せて、コミッションの割合が.30より大きいかNULLである従業員を検索します。最初の7人の従業員を選択し、commission_pctlast_nameで順序付けします。commision_pctを降順で順序付けし、NULLS LASTを使用してNULL値の行を問合せの最後に表示します。commission_pctlast_nameを出力します。

Command> SELECT FIRST 7 commission_pct,last_name
         FROM employees where commission_pct > .30
         OR commission_pct IS NULL
         ORDER BY commission_pct DESC NULLS LAST,last_name;
< .4, Russell >
< .35, King >
< .35, McEwen >
< .35, Sully >
< <NULL>, Atkinson >
< <NULL>, Austin >
< <NULL>, Baer >
7 rows found.

WithClause

構文

WithClauseには、次の構文があります。

WITH QueryName AS ( Subquery ) [, QueryName AS ( Subquery )] ...

パラメータ

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

パラメータ 説明

QueryName AS (Subquery)

SELECT文で複数回使用できる副問合せの別名を指定します。

説明

副問合せのファクタリングによってWITH句が提供され、この句を使用して副問合せブロックに名前を割り当てることができ、その後はその名前をメインのSELECT問合せで複数回参照できます。問合せ名は、メインの問合せとメインの問合せに含まれる副問合せで参照できます。

WITH句は、メインのSELECT文の接頭辞としてのみ定義できます。

副問合せのファクタリングは、重複する、または複雑な副問合せブロックを1つ以上の場所で使用する複雑な問合せの簡素化に役立ちます。また、TimesTenでは、副問合せのファクタリングを使用し、副問合せブロックを一度評価およびマテリアライズして、その結果をSELECT文での各参照に提供することで、問合せを最適化します。

メインの問合せで集合演算子UNIONMINUS、およびINTERSECTを指定できます。

WITH句の使用制限:

  • ビューまたはマテリアライズド・ビュー定義でWITH句を使用しないでください。

  • 再帰的な副問合せのファクタリングはサポートされていません。

  • 副問合せまたは導出表ではWITH句を使用しないでください。

  • 問合せの別名に列パラメータ・リストを指定できません。たとえば、TimesTenではWITH w1(c1,c2) AS ...はサポートされません。

次の例では、初期問合せブロックに対して問合せ名dept_costsおよびavg_costを作成し、これらの名前をメインの問合せの本体で使用します。

Command> WITH dept_costs AS (
         SELECT department_name, SUM(salary) dept_total
         FROM employees e, departments d
         WHERE e.department_id = d.department_id
         GROUP BY department_name),
          avg_cost AS (
         SELECT SUM(dept_total)/COUNT(*) avg
         FROM dept_costs)
         SELECT * FROM dept_costs
         WHERE dept_total >
         (SELECT avg FROM avg_cost)
         ORDER BY department_name;

> DEPARTMENT_NAME DEPT_TOTAL
-------------------------------
Sales 304500
Shipping 156400

SelectList

SQL構文

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

{* | [Owner.]TableName.* | 
  { Expression | [[Owner.]TableName.]ColumnName |
    [[Owner.]TableName.]ROWID | NULL
  }
  [[AS] ColumnAlias] } [,...]

パラメータ

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

パラメータ 説明

*

問合せ結果の列として、FROM句に指定されたすべての表のすべての列を含めます。

[Owner.]TableName.*

指定した表のすべての列を結果に含めます。

Expression

集計問合せに、GROUP BY句または集計関数が含まれます。

選択リストが集計問合せでない場合、列参照はFROM句内の表を参照する必要があります。

集計問合せの選択リスト内の列参照は、GROUP BY句内の列リストを参照する必要があります。GROUP BY句がない場合、列参照はFROM句内の表を参照する必要があります。GROUP BY句の詳細は、「GROUP BY句」を参照してください。

[[Owner.]Table.] ColumnName

指定された所有者の指定された表の特定の列を含めます。順序のCURRVALまたはNEXTVAL列も指定できます。詳細は、「TimesTen ClassicでのCURRVALおよびNEXTVALの使用方法」を参照してください。

[[Owner.]Table.] ROWID

指定された所有者の指定された表のROWID擬似列を含めます。

NULL

NULLを指定した場合、デフォルトではVARCHAR(0)のデータ型が生成されます。結果を別のデータ型に変換するには、CAST関数を使用します。ORDER BY句にはNULLを指定できます。

ColumnAlias

ORDER BY句で使用される列の別名は、SelectListの列に対応している必要があります。同じ別名で複数の列を指定できます。

{*|[Owner.]TableName.*|

{Expression |[[Owner.]TableName.]ColumnName |

[[Owner.]TableName.]ROWID

}

[[AS] ColumnAlias]} [,...]

説明

  • 各句は、構文に示されたとおりの順序で指定する必要があります。

  • TimesTenでは、SelectListで副問合せはサポートされません。

  • 選択リストの結果列は、次のいずれかの方法で取得できます。

    • 結果列は、FROM句にリストされているいずれかの表から直接取得できます。

    • 結果列の値は、FROM句にリストされている表の特定の列の値を使用して、算術式を使用して計算できます。

    • 単一表の複数の列の値を算術式で結合して、結果列の値を生成できます。

    • 集計関数(AVGMAXMINSUMおよびCOUNT)を使用すると、行のグループの結果列の値を計算できます。集計関数は、単独で使用することも、式の中で使用することもできます。同じ表の複数の列を処理するDISTINCT修飾子を含む集計関数を指定できます。GROUP BY句を指定しない場合は、問合せを満たすすべての行に関数が適用されます。GROUP BY句を指定した場合は、GROUP BY句で定義された各グループに1回ずつ関数が適用されます。GROUP BY句とともに集計関数を使用する場合は、選択リストに集計関数、算術式、GROUP BY句の列を含めることができます。GROUP BY句の詳細は、「GROUP BY句」を参照してください。

    • 固定値を含む結果列は、定数を指定するか、または定数のみを含む式を使用して作成できます。

  • 選択リストを使用すると、結果列の取得方法を指定できるだけでなく、問合せ結果を表示する位置を制御できます。選択リストで最初に指定した結果列が問合せ結果の最も左側の列に表示され、残りの列も同様に表示されます。

  • SelectListの結果列は、左から右の順に番号が付けられます。左端の列の番号は1です。ORDER BY句内のこの列番号によって、結果列を参照できます。これは、算術式または集計関数で定義した列を参照する場合に特に便利です。

  • 表をその表自体と結合するには、FROM句内で表の相関名を複数回定義し、選択リストとWHERE句でその相関名を使用して、その表の列を指定します。

  • GROUP BY句を使用した場合、次のように、選択リストに従ってグループごとに1つの応答が返されます。

    • 行は、グループ化される前にWHERE句によって削除されます。

    • GROUP BY句は、結果行をグループ化します。詳細は、「GROUP BY句」を参照してください。

    • 選択リストの集計関数は、グループ単位で計算されます。

次の例では、部品が届くまでの平均日数の値のみが返されます。

SELECT AVG(deliverydays)
FROM purchasing.supplyprice;

次の文は、20日未満で配送されるすべての部品の部品番号および配送時刻を返します。

SELECT partnumber, deliverydays
FROM purchasing.supplyprice
WHERE deliverydays < 20;

単一の部品で複数行が返される場合があります。

次の文は、各部品の部品番号と平均価格を返します。

SELECT partnumber, AVG(unitprice)
FROM purchasing.supplyprice
GROUP BY partnumber;

次の例では、結合によってカリフォルニア州の業者の名前と住所が返されます。行は、partnumberの値の昇順で返されます。重複する部品番号を含む行は、vendornameの値の昇順で返されます。FROM句では、選択リストとWHERE句の両方で使用される、2つの相関名(vs)を定義しています。vendornumber列は、vendorssupplypriceで共通する唯一の列です。

SELECT partnumber, vendorname, s.vendornumber,vendorcity
  FROM purchasing.supplyprice s, purchasing.vendors v
  WHERE s.vendornumber = v.vendornumber AND vendorstate = 'CA'
ORDER BY partnumber, vendorname;

次の問合せでは、表purchasing.partsをそれ自体に結合して、シリアル番号が1133-P-01の部品と同じ販売価格の部品を特定します。

SELECT q.partnumber, q.salesprice
  FROM purchasing.parts p, purchasing.parts q
  WHERE p.salesprice = q.salesprice AND p.serialnumber = '1133-P-01';

次に、特定の行のROWIDを取得する方法の例を示します。取得したROWIDの値は、後で別のSELECT文、DELETE文またはUPDATE文で使用できます。

SELECT rowid
FROM purchasing.vendors
WHERE vendornumber = 123;

次に、列の別名を使用して、employees表からデータを取得する方法の例を示します。

SELECT MAX(salary) AS max_salary FROM employees;

TableSpec

SQL構文

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

TableNameSyntax | JoinedTable | DerivedTable

TableNameSyntax::=  [Owner.]TableName  [CorrelationName] |
                   ([Owner.]TableName) [CorrelationName] |
                   ([Owner.]TableName  [CorrelationName])

単純な表指定の構文は、次のとおりです。

[Owner.]TableName or ([Owner.]TableName)

パラメータ

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

パラメータ 説明

TableNameSyntax

参照する表を指定します。カッコはオプションです。

CorrelationName

CorrelationNameは、直前で指定した表の別名を指定します。SELECT文の他の場所でその表の列にアクセスする際、文の中で実際の表名ではなく相関名を使用します。相関名の有効範囲は、それが使用されているSQL文です。相関名は、基本名の構文ルールを満たしている必要があります。詳細は、「基本名」を参照してください。

単一の文のすべての相関名は、一意である必要があります。

JoinedTable

表の結合を定義する問合せを指定します。詳細は、「JoinedTable」を参照してください。

DerivedTable

SELECT文の評価から導出された表を指定します。このSELECT文には、FIRST NumRowsまたはROWS m TO n句は指定できません。詳細は、「DerivedTable」を参照してください。

JoinedTable

JoinedTableパラメータには、CROSS JOININNER JOINLEFT OUTER JOINまたはRIGHT OUTER JOINから導出された表を指定します。

SQL構文

JoinedTableの構文は次のとおりです。

{CrossJoin | QualifiedJoin}

CrossJoinは、次のようになります:

TableSpec1 CROSS JOIN TableSpec2

また、QualifiedJoinは、次のようになります:

TableSpec1 [JoinType] JOIN TableSpec2 ON SearchCondition

QualifiedJoinパラメータでは、JoinTypeの構文は次のようになります。

{INNER | LEFT [OUTER] | RIGHT [OUTER]}

パラメータ

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

パラメータ 説明

CrossJoin

2つの表に相互結合を実行します。戻り値は、入力表のデカルト積となる結果表です。結果は、次の構文を持つ問合せと同じになります。

SELECT Selectlist FROM Table1, Table2

QualifiedJoin

結合がJoinTypeの種類になることを指定します。

TableSpec1

JOIN句の最初の表を指定します。

TableSpec2

JOIN句の2番目の表を指定します。

JoinType JOIN

実行する結合の種類を指定します。サポートされる結合の種類は、次のとおりです。

  • INNER

  • LEFT [OUTER]

  • RIGHT [OUTER]

INNER JOINは、SearchConditionを満たす2つの表の行を結合した結果表を返します。

LEFT OUTER JOINは、SearchConditionに一致する結合行と、SearchConditionがTRUEと評価されなかった最初の表の行および2番目の表のすべての行を返します。

RIGHT OUTER JOINは、SearchConditionに一致する結合行と、SearchConditionがTRUEと評価されなかった2番目の表の行および最初の表のすべての行を返します。

ON SearchCondition

JOINパラメータで使用する検索基準を指定します。SearchConditionが参照できるのは、現在条件を満たしている結合内で参照されている表のみです。

説明

  • FULL OUTER JOINはサポートされていません。

  • 結合表は、マテリアライズド・ビューを定義する文以外のすべての文で、FROM句内の表を置き換えるために使用できます。したがって、結合表は、UNIONMINUSINTERSECT、副問合せ、非マテリアライズド・ビューまたは導出表で使用できます。

  • 結合表のオペランドに副問合せは指定できません。たとえば、次の文はサポートされていません

    SELECT * FROM
      regions INNER JOIN (SELECT * FROM countries) table2
      ON regions.region_id=table2.region_id;
    
  • 結合表のオペランドとしてビューを指定できます。

  • 結合表のオペランドとして一時表は指定できません。

  • OUTER JOINは、WHERE句のSearchConditionでの(+)演算子の使用またはJOIN表操作の使用という2つの方法で指定できます。同じ文で2つの指定方式の両方を使用することはできません。

  • 結合順およびグループ化はJoinedTable演算と併用できますが、(+)演算子とは併用できません。たとえば、次の演算は(+)演算子と併用できません

    t LEFT JOIN (t2 INNER JOIN t3 ON x2=x3) ON (x1 = x2 - x3)

これらの例では、HRスキーマのregionsおよびcountries表を使用します。

次の例では、左外部結合を実行します。

SELECT * FROM regions LEFT JOIN countries
  ON regions.region_id=countries.region_id
  WHERE regions.region_id=3;

< 3, Asia, JP, Japan, 3 >
< 3, Asia, CN, China, 3 >
< 3, Asia, IN, India, 3 >
< 3, Asia, AU, Australia, 3 >
< 3, Asia, SG, Singapore, 3 >
< 3, Asia, HK, HongKong, 3 >
6 rows found.

次のように、左外部結合を(+)演算子とともに実行することもできます。

SELECT * FROM regions, countries
  WHERE regions.region_id=countries.region_id (+)
    AND regions.region_id=3;

次の例では、右外部結合を実行します。

SELECT * FROM regions RIGHT JOIN countries
  ON regions.region_id=wountries.region_id
  WHERE regions.region_id=3;

< AU, Australia, 3, 3, Asia >
< CN, China, 3, 3, Asia >
< HK, HongKong, 3, 3, Asia >
< IN, India, 3, 3, Asia >
< JP, Japan, 3, 3, Asia >
< SG, Singapore, 3, 3, Asia >
6 rows found.

次の例では、右外部結合を(+)演算子とともに実行します。

SELECT * FROM countries, regions
       WHERE regions.region_id (+)=countries.region_id
       AND countries.region_id=3;
< JP, Japan, 3, 3, Asia >
< CN, China, 3, 3, Asia >
< IN, India, 3, 3, Asia >
< AU, Australia, 3, 3, Asia >
< SG, Singapore, 3, 3, Asia >
< HK, HongKong, 3, 3, Asia >
6 rows found.

右結合方式では、同じ行が異なる表示順序で生成されることに注意してください。結合結果の行の順序は予期できません。

次の例では、内部結合を実行します。

SELECT * FROM regions INNER JOIN countries
  ON regions.region_id=countries.region_id
  WHERE regions.region_id=2;

< 2, Americas, US, United States of America, 2 >
< 2, Americas, CA, Canada, 2 >
< 2, Americas, BR, Brazil, 2 >
< 2, Americas, MX, Mexico, 2 >
< 2, Americas, AR, Argentina, 2 >
5 rows found.

次の例では、相互結合を実行します。

SELECT * FROM regions CROSS JOIN countries 
  WHERE regions.region_id=1;

< 1, Europe, AR, Argentina, 2 >
< 1, Europe, AU, Australia, 3 >
< 1, Europe, BE, Belgium, 1 >
< 1, Europe, BR, Brazil, 2 >
...
< 1, Europe, SG, Singapore, 3 >
< 1, Europe, UK, United Kingdom, 1 >
< 1, Europe, US, United States of America, 2 >
< 1, Europe, ZM, Zambia, 4 >
< 1, Europe, ZW, Zimbabwe, 4 >
25 rows found.

DerivedTable

導出表は、FROM句のSELECT文の結果で、別名を持ちます。

SQL構文

DerivedTableの構文は次のとおりです。

(Subquery) [CorrelationName]

パラメータ

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

パラメータ 説明

Subquery

副問合せの詳細は、「副問合せ」を参照してください。

CorrelationName

オプションで、CorrelationNameを使用して、導出表の別名を指定します。問合せで参照される表名とは異なる名前である必要があります。

説明

導出表を使用する場合は、次の制限が適用されます。

  • 別の表を参照しないSELECT文ではDUAL表を使用できますが、この場合は少なくとも1つの行を返す必要があります。DUALから選択することは、定数式(結果が定数値になる式)をSELECT文で計算する場合に便利です。 DUALには行が1つしかないため、定数が返されるのは1回のみです。

  • Subqueryは、別の導出表の列を参照できません。

  • 導出表は、結合表のソースとしては使用できません。

  • 導出表は、DELETE文またはUPDATE文のターゲットとしては使用できません。