コンテンツにスキップ

SELECT (SQL)

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Jkr2255 (会話 | 投稿記録) による 2012年11月16日 (金) 14:10個人設定で未設定ならUTC)時点の版 (FROM句: 表が不要なクエリ)であり、現在の版とは大きく異なる場合があります。

SELECTステートメントは、1つもしくは複数のテーブルからデータを抽出する、SQLにおけるデータ操作言語 (DML)ステートメントの1つである。

これは、データベースの1つもしくは複数のテーブルからデータを抽出するための命令で、データ操作言語 (DML)の中では最もよく使用される。プログラマはどのような結果を欲しいのかをSQL文で記述する必要はあるが、その結果を取得するためにどのような物理的な操作が実行されるのかを指示する必要はなく、データベースシステム(クエリオプティマイザ)がそのSQL文から最適なクエリプラン(実行計画)を作成する。

なお、「テーブル」は「表」、「行」は「レコード」、「列」は「項目」と呼ぶこともある。

文法

 SELECT [ALL | DISTINCT] 列名 [,列名...]
 FROM テーブル名 [,テーブル名...]
 [WHERE 条件式]
 [GROUP BY 列名 [HAVING 条件式]]
 [ORDER BY 列名]
 GROUP BY 列名[,列名...]
 ORDER BY 列名[,列名...]

SELECT句

SELECT文において必須の構成句。指定列を記述することで、列を射影する。*で全列表示できる。また、算術演算子、グループ関数が使用可能。

入力規則

列名入力規則の主なものとしては

  • 列名に使用できる文字は半角英数字および、$,#,_(アンダースコア)のみ。但し、一部のDBMSにおける日本語版に限り全角文字が使用可能。
  • 列名の先頭は半角アルファベットのみ。
  • 文字上限は半角30文字まで。
  • デフォルトは大文字で表示される。小文字などで表示したい場合は単一行関数を用いるか、" "で括るなどの処置が必要である。
  • 各種DBMSにおける予約語は使用できない場合がある。
列別名
列名 [AS] 列別名 (ASは省略可)

で、列別名表示ができる。但し、WHERE句、GROUP BY句、HAVING句では列別名の記述はできない。また、列名の表示に際して、デフォルトは半角英大文字である。これを小文字などで表示させたい場合、単一行関数の文字関数を使用するか、" "で括るかするとよい。

ALL/DISTINCTの指定
ALL...テーブルに同じデータ行がある場合でもすべてのデータを返す。指定がない場合はALLが選択される
DISTINCT(UNIQUE)...テーブルに同じデータ行がある場合、重複を取り除いた1件のみを返す.
グループ関数はCOUNTのみ使用可能。
単一行関数
単一の行を操作する関数で、一つの行に対し、一つの結果を返していく関数。SELECT句、WHERE句、ORDER BY句で使用可能で、以下の種類がある。また、ネスト(入れ子)に制限はない。
  • 文字関数
文字を操作する関数。LOWER,UPPER,INITCAP,CONCAT,SUBSTR,INSTR,LENGTH,TRIM,REPLACEなどがある。
  • 数値関数
数値を操作する関数。ROUND(四捨五入)、TRUNC(切り捨て)、MOD(剰余)がある。
  • 日付関数
日付を操作する関数。
  • データ型変換関数。
特定のデータ型を特定のデータ型に変換できる。TO_CHAR,TO_NUMBER,TO_DATEがある。
グループ関数
グループ化を行った行に対して一つの結果を返す関数。SELECT句(但し、GROUP BY句で指定した列のみ)、HAVING句、ORDER BY句で使用可能。ネストは2段まで可能である。種類としてはAVG(平均値),MAX(最大値)、MIN(最小値)、SUM(合計)、COUNT(返される行数)などがある。
集合演算
複数表から問合わせ結果を参照する複合問合わせを行うための演算子を用いた構文のこと。UNION(和集合)、UNION ALL(全集合)、INTERSECT(積集合)、EXCEPTまたはMINUS(差分集合)があるが、DBMS環境によって使用できないものや演算子の名称が異なるものもある。各演算子における優先順位はなく、左から右に、順番に処理される。

主な条件として

  • 問い合わせる行を一致させる必要がある。
  • 各SELECT句に対応する行のデータ型の種類を一致させる必要がある(一部データ型において互換性は持つ)。
  • データサイズは一致していなくても良い。
  • ある条件を満たせば、列名は異なっていても構わない。
  • UNION ALL以外はソートされて返される。デフォルトは前文の第1列が基準となる。

FROM句

SELECT文において必須の構成句。FROM句では列参照に用いる表を指定する。複数の表から指定する場合、結合が行われ、JOINを用いるほか、WHERE句によって共通列の結合関係を指定することも可能(但し、この場合は外部結合ができない。但し、OracleDBMSの場合、(+)という特殊な記号を使用して、外部結合を行える)。なお、表を必要としないクエリを行う場合も、DUAL表のようなダミーの表を指定することとなるが、このような場合にFROMを省略できる拡張の行われた処理系も多く存在する。

このFROM句では表別名の指定が可能であるが、一旦表別名を指定した場合、表別名で記述してやらないとエラーになる。

結合(JOIN句)
複数の表から行を参照する場合に用い、JOINを利用することが多い。種類としては以下のものがある。
  1. クロス結合
  2. 内部結合(等価結合、非等価結合、自然結合、自己結合を含む)
  3. 外部結合

一方、あるいは双方の値にNULL値を含む場合に使用される。左側外部結合、右側外部結合、完全外部結合の3種類がある。

等価結合の一般的な書式は以下の通りである。

SELECT 任意の表名.共通列 FROM 表名A [INNER] JOIN 表名B ON 表名A.共通列 = 表名B.共通列;
ここで表名は記述の簡便化を図るため別名表示させることが多い。その場合、共通列には必ず表別名で記述しないとエラーになる。また、SELECT句において共通列は必ずどの表のものかを記述しないといけない(これを表修飾という)。その他の共通でない列は、必ずしも表修飾させなくても良いがパフォーマンスが低下するため、表修飾を習慣づけるのが望ましいとされている。

他にNATURAL JOIN(自然結合)、またUSING句(共通列の限定)を使用する場合がある。これらの場合も、色々と細かい制約が発生する。

WHERE句

WHERE句は、データを抽出する選択条件式を指定する。単一式を用いるほか、複数条件を照会する副問合わせが用いられることも多い。また、テーブル間結合を行う際には、その結合関係を指定する。このWHERE句ではグループ関数を使用してはいけないルールが存在する。
パターンマッチング検索
SQL文では、以下の図式を用いることで部分一致検索が可能である。パターンマッチに用いられるワイルドカードには「%」(0文字以上)「 _ 」(1文字)がある。書式は以下の通りである。
WHERE 列名 LIKE '_A%'
ここではAの前に一文字、Aの後に0文字以上の値が選択される(たとえばJAPAN,CAROL,CASTLE,5Aなど)。
副問合わせ
副問合わせは値が一定でない値に対して問合わせが可能であり、必ず( )で囲む必要がある。FROM句、WHERE句、HAVING句で使用可能。FROM句で指定されていない別表を参照することも可能であり、また、ネストにも制限はない(但し、パフォーマンスは低下するおそれがある)。
副問合わせに対して単一行を選択したい場合は比較演算子を用いる。この場合、複数行が検索されればエラーとなる。もし、複数行を選択したい場合は、一般にIN、他にANY(SOME)+比較演算子、ALL+比較演算子、またはEXISTSを用い、。いずれの式も頭にNOTを付記すれば、否定表現となる。この比較条件の記述はDBMSの環境に依存していることが多い。

GROUP BY句

GROUP BY句は、グループ化する列名または列名を含んだ式を指定する。列別名は使用できない。また、SELECT文でGROUP BY句で、グループ関数を除き、グループ化する列以外の列が存在した場合、一緒に記述する必要がある。

例: SELECT A. B FROM LIST GROUP BY A, B;
(グループ化するのはAだが、B列も一緒に記述しないとエラーとなる)。

また、GROUP BY句を含むとビューの作成ができない(SELECT文でグループ関数を使用した場合、あるいはDISTINCT句を使用した場合も同じ)。

HAVING句

HAVING句は、GROUP BY句で集計した結果に対して抽出条件を指定する際に使用する。グループ関数の使用が可能である。順序はGROUP BY句と前後になっても問題ない。

ORDER BY句

ORDER BY句は、ソートする列または列を含んだ式を指定するもので、いかなる場合でも構文の最後に指定する。カンマで区切ることで、複数列を指定できる。通常はASC(ascending order)、すなわち昇順指定であり、降順指定したい場合はDESC(descending order)と表記する。また、列別名での指定が可能なほか、序数での指定が可能である(たとえば、2番目の列で参照したい場合、ORDER BY 2とできる)。

ここでのNULLは無限大の値とみなされ、昇順の場合は最後、降順の場合は最初に表示される。

サンプル

テーブル "T" SQL文 結果
C1 C2
1 a
2 b
SELECT * FROM T;
C1 C2
1 a
2 b
C1 C2
1 a
2 b
SELECT C1 FROM T;
C1
1
2
C1 C2
1 a
2 b
SELECT * FROM T WHERE C1 = 1;
C1 C2
1 a
C1 C2
1 a
2 b
SELECT * FROM T ORDER BY C1 DESC;
C1 C2
2 b
1 a

右図のテーブル"T"欄のテーブルに対して、SQL文 SELECT * FROM T; を実行すると、結果欄に示されているように、テーブル"T"のすべての行とすべての列が返される。

同じテーブル"T"に対して、SQL文 SELECT C1 FROM T; を実行すると、テーブル"T"のすべての行の列C1のみが返される。これは、関係代数 における「射影」に相当する。

同じテーブル"T"に対して、SQL文 SELECT * FROM T WHERE C1 = 1; を実行すると、列C1 の値が 1 であるすべて行のすべての列が返される。これは、関係代数 における「選択」に相当する。

最後のSQL文 SELECT * FROM T ORDER BY C1 DESC; は最初のSQL文と同じ行を返すが、並び順が、ORDER BY句により、C1に対して降順(Z-A)になる。ORDER BY句で複数列を指定する場合は、カンマで区切る。例:ORDER BY C1 ASC, C2 DESC(この場合、列C1に対しては昇順、列C2に対しては降順になる。)

関連項目