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に指定できるのは、集約キーもしくは、集約関数のみに制限される。