SQL構文

SQL構文

書き順 評価順序 備考
1 7 SELECT (DISTINCT) 列の指定 DISTINCTを指定すると列の値が重複する場合、排除してくれる
2 2 FROM テーブル WHERE句で内部結合する際は、結合するテーブルをすべて列挙する
3 3 INNR(LEFT/RIGHT OUTER) JOIN 結合テーブル ON 結合条件 抽出条件より先に評価される
4 4 WHERE 抽出(選択)条件 集約より先に評価される
4 5 GROUP BY 集約キー SELECTで指定できるカラムは集約キーか集約関数に限定される
5 6 HAVING 集約条件 集約キーの値から集約対象にするのかどうか
6 - ORDER BY ソートキー
- 1 (サブクエリ) 別名「副問合せ」。なので句だけでなく関数の引数にも指定することができ、結果が()内に展開される

検索

列の選択

SELECT (DISTINCT) 列の選択
FROM 検索テーブル
  • SELECT DISTINCT 列1, ... 指定した列の値が重複する場合は、1つにまとめられる
    • NULLも一つの値として評価される

行の選択

SELECT (DISTINCT) 列の選択
FROM 検索テーブル
WHERE 抽出条件

抽出条件

述語(trueもしくはfalseを返す式)を指定することができる。 述語には、比較演算子、論理演算子やLIKE演算子などの特殊演算子が使用できる。

比較演算子

演算子 意味
= 等価
<> 等価でない
>= ~以上
> より大きい
<= ~以下
< より小さい

文字列'Hello'に一致する行を選択する

SELECT * FROM テーブル WHERE 列 = 'Hello'

特殊演算子

演算子 意味
LIKE 文字列検索
ANY 複数の値を実現し、どれか一致すればtrueを返す
ALL 複数の値を実現し、全てに一致すればtrueを返す
BETWEEN 範囲検索。両端を含む
IS (NOT) NULL =ではNULLかどうかの判定は不可
(NOT) IN 含まれるかどうか
EXISTS 他のテーブルにレコードが存在する場合、trueを返す

文字列に一致する行を選択する

SELECT * FROM テーブル WHERE 列 LIKE '完全一致検索'
SELECT * FROM テーブル WHERE 列 LIKE '%後方一致検索'
SELECT * FROM テーブル WHERE 列 LIKE '前方一致検索%'
SELECT * FROM テーブル WHERE 列 LIKE '_部分一致検索_'
  • % 0文字以上の任意の文字
  • _ 任意の一文字

ANYによる複数の値を実現

SELECT * FROM テーブル 列 = ANY(値1, 値2, 値3)
  • 列 比較演算子 ANY(...) という形を取る
  • ANY(値1, 値2, 値3) 値1,値2,値3のどれともなる
  • ANY(サブクエリ) サブクエリで出力される値となる

2021年8月1日から2021年8月31日の間の行を選択する

SELECT * FROM テーブル WHERE date BETWEEN '2021/08/01' AND '2021/08/31'

NULLでない行を選択する

SELECT * FROM テーブル WHERE 列 IS NOT NULL

任意の値に該当する行のみ選択する

SELECT * FROM テーブル WHERE 列 IN(値1, 値2, 値3)

Bテーブルにレコードが存在する行のみ選択する

SELECT * FROM Aテーブル WHERE EXISTS(SELECT * FROM Bテーブル WHERE B.列 = A.列)
  • サブクエリ側のSELECT句に指定する値は定数でもよい
  • サブクエリの結果、レコードが存在する場合は、trueを返す

テーブルの結合

SELECT -
FROM -
INNER(OUTER) JOIN 結合テーブルを指定
ON 結合条件
WHERE 行の選択

先に結合条件が実行され、次に抽出条件が実行される

3つのテーブルを結合する

SELECT A.列, B.列, C.列 FROM A 
    INNER JOIN B ON A.列 = B.列
    INNER JOIN C ON A.列 = C.列
    WHERE A.列 > 200
  • テーブルA,B,Cが結合条件に従って内部結合されてからWHEREによる抽出条件で行が選択される
  • 結合条件は過不足なくテーブルの列同士を'='で結びつける必要がある

NOTE

サブクエリの使用はNG

NG 1

SELECT A.列, B.列 FROM A 
    INNER JOIN B ON A.列 = (サブクエリ)

NG 2

SELECT A.列, B.列 FROM A 
    INNER JOIN B ON A.列 IN(サブクエリ)

WHERE句を使った結合

内部結合となる。 抽出条件と混ざるため、近年は、INNER JOINを使うのが一般的。

テーブルA,B,Cを内部結合する

SELECT * FROM A, B, C WHERE A.列 = B.列 AND B.列 = C.列 AND 抽出条件
  • FROM句に結合するすべてのテーブルを列挙する
  • WHERE句に結合条件を指定する
  • 抽出条件はANDで結ぶ

集約

行を1つもしくはグループごとにまとめる。

集約関数

集約関数を使うことで行を1つにまとめることができる。

集約関数 意味
SUM() 列の値を合計値
AVG() 列の値を平均値
MIN() 列の値の最小値
MAX() 列の値の最大値
COUNT(*もしくは) 引数に*を指定した場合、NULLを含める。DISITINCTキーワードが使用可能

列の値が重複しない行数を出力する

SELECT COUNT(DISTINCT 列) FROM テーブル

NOTE

入れ子にできない。

# NG
SELECT 集約関数(集約関数(列)) FROM テーブル

集約関数とGROUP BY句

テーブル全体で一行にまとめるのではなく、グループごとに集約する。

NOTE

SELECTに指定できるのは、集約キーもしくは、集約関数のみに制限される。

参考文献

  • SQL 第2版ゼロからはじめるデータベース操作
  • SQL 苦手を克服する本
    • 評価順序について
  • 出るとこだけ!基本情報技術者 午後
    • 標準SQL NG集
  • よく分かるSQL 高橋麻奈
  • 理論から学ぶデータベース実践入門
    • データベース実装について