SELECT (SQL)
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...テーブルに同じデータ行がある場合、重複を取り除いた1件のみを返す.
- グループ関数はCOUNTのみ使用可能。
- 単一行関数
- グループ関数
FROM句
SELECT文において必須の構成句。FROM句では列参照に用いる表を指定する。複数の表から指定する場合、結合が行われ、JOINを用いるほか、副問合わせによる共通列の結合関係を指定することも可能(但し、この場合は外部結合ができない)。
このFROM句では表別名の指定が可能であるが、一旦表別名を指定した場合、表別名で記述してやらないとエラーになる。
- 結合(JOIN句)
WHERE句
- WHERE句は、データを抽出する選択条件式を指定する。単一式を用いるほか、複数条件を照会する副問合わせが用いられることも多い。また、テーブル間結合を行う際には、その結合関係を指定する。このWHERE句ではグループ関数を使用してはいけないルールが存在する。
- パターンマッチング検索
- 副問合わせ
- 副問合わせに関して単一行を選択したい場合は=,<,>,<>(あるいは!=)を用いる。複数行を選択したい場合は、一般にIN、他にANY(SOME)、ALL、またはEXISTSを用い、。いずれの式も頭にNOTを付記すれば、否定表現となる。
GROUP BY句
- GROUP BY句は、グループ化する列名または列名を含んだ式を指定する。列別名は使用できない。また、SELECT文でGROUP BY句で、グループ関数を除き、グループ化する列以外の列が存在した場合、一緒に記述する必要がある。
例: SELECT A. B FROM LIST GROUP BY A, B;
(グループ化するのはAだが、B列も一緒に記述しないとエラーとなる)。
また、GROUP BY句を含むとVIEWの作成ができない。
HAVING句
HAVING句は、GROUP BY句で集計した結果に対して抽出条件を指定する際に使用する。グループ関数の使用が可能である。順序はGROUP BY句と前後になっても問題ない。
ORDER BY句
- ORDER BY句は、ソートする列または列を含んだ式を指定するもので、いかなる場合でも構文の最後に指定する。カンマで区切ることで、複数列を指定できる。通常はASC(ascending order)、すなわち昇順指定であり、降順指定したい場合はDESC(descending order)と表記する。また、列別名での指定が可能なほか、序数での指定が可能である(たとえば、2番目の列で参照したい場合、ORDER BY 2とできる)。
サンプル
テーブル "T" | SQL文 | 結果 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
SELECT * FROM T;
|
| ||||||||||||
|
SELECT C1 FROM T;
|
| ||||||||||||
|
SELECT * FROM T WHERE C1 = 1;
|
| ||||||||||||
|
SELECT * FROM T ORDER BY C1 DESC;
|
|
右図のテーブル"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に対しては降順になる。)