SELECT文に使用できる予約語のまとめ

データベースの4大命令のうち、一番使われているのがSELECTです。多数の予約語により、修飾を続けて記述することができます。本日はSELECT文に使用できる予約語を紹介いたします。


1.基本構文 -- FROM

SELECT <列名>
 FROM <テーブル名>

データを取得するテーブルを指定するために必ず指定します。


2.行の絞り込み -- WHERE

SELECT <列名> 
 FROM <テーブル名> 
 WHERE <条件式>

指定した条件に応じて対象行を絞り込む


3.別名の定義 -- AS

SELECT <列名> AS <別名>
 FROM <テーブル> AS <別名>

SELECT文における列名やテーブル名の指定では、それぞれの記述の後ろに「AS + 任意のキーワード」をつけることで、別名を定義することができます。
※Oracle DBではつけない


4.重複行の除外 -- DISTINCT

SELECT DISTINCT <列名>
 FROM <テーブル名>

SELECT文にDISTINCTを追加すると結果表の中で内容が重複している行があれば、その重複を取り除いてくれます。


5.結果を並べ替える -- ORDER BY

・1列で並べ替える

SELECT <列名> FROM <テーブル名>
 ORDER BY <列名> DESC

昇順:ASC
降順:DESC
※並び順は、省略するとASCと同じ意味になる

・複数列で並べ替える

SELECT * FROM <テーブル名>
 ORDER BY <列名1> DESC, <列名2> DESC

ORDER BY句に列挙した列それぞれに対して、昇順で並べるか降順で並べるかを指定することができます。

・列番号を指定するORDER BY句

SELECT<列名1>, <列名2> FROM <テーブル名>
 ORDER BY 1 DESC, 2 DESC

※SELECT文の選択列リストの記述を修正すると並び替えの結果にも影響が及ぶ

6.検索件数限定 -- OFFSET – FETCH

SELECT * FROM <テーブル名>
	ORDER BY <列名> DESC
 OFFSET 先頭から除外する行数 ROWS
 (FETCH NEXT/FIRST 取得行数 ROWS ONLY)

列名の降順で並べ替える結果の中に、取得したい行を指定します。

取得行を限定するそのほかの方法*

・LIMITの利用(Db2、MySQL、MariaDB、PostgreSQL、H2 Database)

SELECT * FROM <テーブル名>
 ORDER BY <列名> DESC LIMIT 3

LIMITで指定した行数しか表示されません。
※LIMITの代わりに、OFFSETで読み飛ばす行数を指定することも可能


・ROW_NUMBER()の利用


SELECT K.<列名1>, K.<列名2>
 FROM(
  SELECT *,ROW_NUMBER() OVER (ORDER BY <列名2> DESC) RNFROM <テーブル名>
 )K
 WHERE K.RN >= 1 AND K.RN <= 3

ROW_NUMBER() は指定条件での順序を返す命令


・ROWNUMの利用(Oracle DB)

SELECT <列名1>, <列名2>
 FROM(
  SELECT K.*, ROWNUM AS RN
   FROM(
    SELECT * FROM <テーブル名> ORDER BY <列名2> DESC
     )K
  )
 WHERE RN >= 1 AND RN <= 3

ROWNUMは結果表の行番号を表す予約語


・TOPの利用(SQL Server)

SELECT TOP(3)  <列名1>, <列名2> 
 FROM <テーブル名>
 ORDER BY <列名2> DESC

TOPで指定した行数のみ表示されます


7.検索結果の足し算 -- UNION

SELECT <列名1>,<列名2>,<列名3> FROM <テーブル名1>
 UNION (ALL)
SELECT <列名1>,<列名2>,<列名3> FROM <テーブル名2>
 (ORDER BY 2,3,1)

和集合の結果に重複行があった場所に動作が違ってきます。
UNIONは重複行を1行にまとめます。
UNION ALLは重複行をすべてそのまま返します。

※SELECTの結果を集合演算子でまとめるときは、選択列リストの列数とそれぞれデータ型が一致していなければならない
※集合演算子でORDER BY句を使うときのSELECTの最後に記述する


8.検索結果の引き算 -- EXCEPT/MINUS

SELECT <列名1>,<列名2>,<列名3> FROM <テーブル名1>
 EXCEPT (ALL)
SELECT <列名1>,<列名2>,<列名3> FROM <テーブル名2>
 (ORDER BY 2,3,1)

2つの検索結果の差を求めます。
※SELECTの結果を集合演算子でまとめるときは、選択列リストの列数とそれぞれデータ型が一致していなければならない
※集合演算子でORDER BY句を使うときのSELECTの最後に記述する
※Oracle DBではEXCEPTの代わりにMINUSというキーワードを用いる


9.検索結果で重複部分の取得 -- INTERSECT

SELECT <列名> FROM <テーブル名1>
 INTERSECT (ALL)
SELECT <列名> FROM <テーブル名2>

積集合は和集合と同じく、どの順番でSELECT文を記述しても結果は変わりません。またINTERSECTにALLキーワードを付けると、積集合から重複した行が取り除かれなくなります。
※SELECTの結果を集合演算子でまとめるときは、選択列リストの列数とそれぞれデータ型が一致していなければならない
※集合演算子でORDER BY句を使うときのSELECTの最後に記述する


10.グループ化

SELECT <列名1>,<列名2>
 FROM <テーブル名>
 (WHERE 集計前の表に対する絞り込み条件)	 --集計関数使用不可
 GROUP BY <グループ化列名>
 HAVING 集計結果に対する絞り込み条件	 --集計関数使用可、別名使用不可
 (ORDER BY <集計関数>)

HAVING句に記述する条件式は、WHERE句のものと非常によく似っていますが、両者は絞り込みを実行するタイミングに違いがあります。
WHEREは集計前の表に対する絞り込み条件
HAVINGは集計結果に対する絞り込み条件


10.集計関数*

SELECT SUM(列名)
 FROM <テーブル名>

集計関数結果を求めます。

※ 関数の引数は列名でなければならない 誤り例:AVG(SUM(数量))
※ SELECT文、ORDER BY句、HAVING句でしか利用できない。


まとめ

SELECT文に記述可能な予約語を紹介しました。

SELECT文の全貌

SELECT <列名1>, <集計関数>
 FROM <テーブル名>
 [WHERE 条件式]
 [GROUP BY グループ化列名]
 [HAVING 集計結果に対する条件式]
 [ORDER BY 並び替え列名]

カッコでくくられた修飾は任意で記述するものですが、それぞれをかける場所は決まっています。ORDER BY句は他にどのような修飾を書いたとしても、必ず最後に記述する必要がありますので、注意してください。


エンジニアファーストの会社
株式会社CRE-CO


この記事が気に入ったらサポートをしてみませんか?