SELECT

SELECTステートメントは、1つもしくは複数のテーブルからデータを抽出する、SQLにおけるデータ操作言語 (DML)ステートメントの1つです。
これは、データベースの1つもしくは複数のテーブルからデータを抽出するための命令で、データ操作言語 (DML)の中では最もよく使用されます。

開発者はどのような結果が欲しいのかをSQL文で記述する必要がありますが、その結果を取得するためにどのような物理的な操作が実行されるのかを指示する必要はなく、データベースシステム(クエリオプティマイザ、query optimizer)がそのSQL文から最適なクエリプラン(実行計画)を作成します。

文法

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

SELECT句

SELECT文において必須の構成句です。
SELECT句の次に指定列を記述することで、列を射影(RDBにおいて表の中からある必要な列のみを抽出する操作)します。

算術演算子、グループ関数の使用が可能です。

ALL : テーブルに同じデータ行がある場合でもすべてのデータを返す。指定がない場合はALLが選択される。
DISTINCT : テーブルに同じデータ行がある場合、重複を取り除いた1件のみを返す。

使用例1 : 全列取得

メタ文字である「*」を指定し、指定されたテーブル内の全ての列を射影します。

SELECT * FROM teble_name;

使用例2 : 指定列取得

指定されたテーブル内の指定された列を射影します。

SELECT column1, column2 FROM teble_name;

使用例3 : 重複行除外(DISTINCT指定)

指定されたテーブル内の指定された列を射影し、列の組み合わせにおいて重複する行を除外します。

SELECT DISTINCT column1 FROM teble_name;

使用例4 : 別名(エイリアス)設定(AS指定)

指定した列、または値、計算結果に別名(エイリアス、alias)を付与し射影します。

SELECT column1 + column2 AS alias FROM teble_name;

FROM句

SELECT文において必須の構成句です。
FROM句の次にテーブル名を記述することで、列参照に用いるテーブルを指定します。
複数のテーブルを結合してSELECTを行う場合、テーブル名を「,」で区切り、指定します。
また、JOINを使用して結合条件をFROM句にて指定することも可能です。

使用例1 : テーブル指定

指定されたテーブルを参照元として使用します。

SELECT * FROM teble_name;

使用例2 : 表別名(エイリアス)設定(AS指定あり / AS指定なし)

指定されたテーブルに表別名(エイリアス、alias)を付与し、参照元として使用します。
Oracle以外のデータベースでは表別名にASを使用し、明示的に記述することができます。
また、表別名を指定したものについては、SELECT句、WHERE句等でテーブル名を指定する場合、表別名を記述する必要があります。

SELECT * FROM teble_name AS table_alias;
SELECT * FROM teble_name table_alias;

WHERE句

参照するテーブルから目的とする行を取得する場合、WHERE句にてデータを抽出する選択条件式を指定します。
単一式を用いるほか、複数条件を照会する副問合せが用いられます。

また、テーブル間結合を行う際には、その結合関係を指定します。

使用例1 : 条件式の指定

等号、不等号を使用し、条件式を指定します。

SELECT * FROM teble_name WHERE column = 1;

使用例2 : 複数条件式の指定

複数の条件を指定する場合、AND、OR を指定します。

SELECT * FROM teble_name1 WHERE column1 = 1 AND (column2 <= 20 OR column3 > 100);

GROUP BY句

GROUP BY句は、グループ化する列名または列名を含んだ式を指定します。
集計関数(COUNT、MIN、MAX、AVG、SUM 等)共に使用することで、グループ単位の集計を得ることができます。

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

使用例

以下の例では column1 毎にグルーピングし、集計した行数を取得します。

SELECT column, COUNT(*) FROM teble_name GROUP BY column;

HAVING句

HAVING句は、GROUP BY句で集計した結果に対して抽出条件を指定する際に使用されます。
集計関数を含んだ条件式を記述することが可能でこの条件に合致するグループのみを結果として取得することができます。
(集計関数を含む式は、WHERE句では記述することができません。)

順序はGROUP BY句と前後になっても問題ありません。

使用例

以下の例では column1 毎にグルーピングし、集計した column2 の合計値が1以上であるグループのみを取得します。

SELECT column1, SUM(column2) FROM teble_name GROUP BY column1 HAVING SUM(column2) >= 1;

ORDER BY句

ORDER BY句は、ソートする列または列を含んだ式を指定するもので、いかなる場合でも構文の最後に指定します。
複数の列でソートを行う場合、優先度の高い列から「,」区切で指定します。

通常はASC(ascending order)、すなわち昇順指定であり、降順指定したい場合はDESC(descending order)と表記します。

ここでのNULLはDBMSに依存し、最大値をとるものと最小値をとるものがあります。
また、ORDER BY句を指定しない場合のSELECT結果の順番は不定であり、同じSQLであっても取得順が変わる可能性があります。

使用例

以下の例では column1 で昇順ソートを行い、column2 で降順ソートを行います。
column1 でのソートが優先される為、column1 でのソート結果に同値が含まれている場合、その行に対して column2 を使用したソートが実施されます。

SELECT column1, column2 FROM teble_name ORDER BY column1 ASC, column2 DESC;


Last updated:2017/06/30
Author:efn

';