SELECT分の基礎
SQL (Structured Query Language) とは、データベースを操作するための言語です。
具体的には、データの検索、挿入、更新、削除など、データベースに対して様々な操作を行うために使用されます。
試験では「すでに存在するデータベースの表を使って、必要な情報を取り出す」ためにSQLが多く問われます。
これを問合せ(クエリ)とよび、SELECT文が用いられます。
SELECT文の書式
SELECT 列名リスト ← 射影する列を指定する
FROM 表名リスト ← 射影する列を指定する
WHERE 条件式 ← 検索条件を指定する
GROUP BY 列名リスト ← グループ化する列を指定する
HAVING 条件式 ← グループに対する抽出条件を指定する
ORDER BY 列名リスト ← 整列条件を指定する
実行順序(内部的)
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
条件式の記述法
①条件式
演算子 | 説明 |
---|---|
= | 等しい |
> | 大きい |
< | 小さい |
>= | 大きい、もしくは等しい |
<= | 小さい、もしくは等しい |
<>(または!=) | 等しくない |
AND | 2つの条件を結合し、両方の条件が真 |
OR | 2つの条件のうち、どちらか一方が真 |
NOT | 式の結果を反転 |
BETWEEN a AND b | 対象のフィールドが a とb の範囲内 |
IN | 対象のフィールドが式の一覧の1つに一致 |
LIKE | 対象のフィールドがパターンに一致 |
複数の条件式を指定する場合は、論理演算子ANDやORで各条件を連結します。
また、条件式の前にNOTを付けると、条件を満たさない場合に真となります。
論理演算子の優先度は
NOT > AND > OR
となります。例えば「条件Aと条件Bの少なくとも一つを満たし、かつ条件Cを満たす」条件にしたい場合は、カッコを用いて次のように記述します。
(条件A OR 条件B)AND 条件C
②LIKE記述
文字列の一部が一致するパターンマッチの条件を記述する場合、LIKEを使います。
このとき(%)や(_)などのワイルドカードを使って文字列を検索します。
パーセント( %) 0文字以上の任意の文字列」
アンダスコア( _ ) 「1文字の任意の文字」
例えば、次のように用います。
WHERE 氏名 LIKE ’_藤’ 藤で終わる2文字の文字列(加藤、佐藤など)
WHERE 氏名 LIKE ’藤%’ 藤から始まる文字列(藤、藤田、藤ケ崎など)
CASE式
CASE式は、上から順に条件を評価していき、条件にあったときの結果式の値を返します。これによって多分岐を実現することができます。CASE式を使用するには、次の二つの方法があります。
単純CASE式
CASE カラム名
WHEN 条件A THEN 処理A 条件Aに一致した場合、処理A
WHEN 条件B THEN 処理B 条件Bに一致した場合、処理B
ELSE 処理C 上のどの条件にも一致しない場合、処理C
END
CASE 性別コード
WHEN ’0’ THEN ’男’
WHEN ’1’ THEN ’女’
END
WHEN句で書いた条件に該当する場合にTHEN句の処理を行います。
WHEN句の条件のいずれにも当てはまらない場合はELSE句の処理を行います。
検索CASE式
CASE
WHEN 条件式A THEN 処理A 条件式Aを満たす場合、処理A
WHEN 条件式B THEN 処理B 条件式Bを満たす場合、処理B
ELSE 処理C 上のどの条件にも一致しない場合、処理C
END
CASE
WHEN 年齢 >=20 THEN ’成人’
ELSE ’未成年’
END
単純CASE式と違ってCASEの直後に条件の対象を指定しません。
条件についてはすべてWHEN句で指定します。
表の結合
①FROM句に表名を列挙し、WHERE句に結合条件を記す
SELECT 社員.社員番号, 社員.氏名 , 部署.部署名
FROM 社員, 部署
WHERE 社員.部署コード = 部署.部署コード
②FROM句に、JOINキーワードを用いて表明と結合条件を記す
①と同じ結果を得る場合
SELECT 社員.社員番号, 社員.氏名 , 部署.部署名
FROM 社員 [INNER]JOIN 部署 ON 社員.部署コード = 部署.部署コード
外部結合
外部とは、2つ以上のテーブルをキーとなるカラム(列)を基に結合し、一致する行だけでなく一致しない行も含めて結果に表示する手法です。
結合するカラムの値が一致しない場合でも、関連性を持ったデータを結合することができます。これにより、欠損データを補完しながら情報を取得することが可能です。
SELECT 列名
FROM テーブル1
[LEFT/RIGHT/FULL] OUTER JOIN テーブル2
ON テーブル1.キーとなる列名 = テーブル2.キーとなる列名;
左外部結合(LEFT OUTER JOIN)
左外部結合は、指定したテーブル(左側のテーブル)の全ての行を含み、共通のキーに基づいて結合条件を満たす行がある場合にはそれを結合します。
一致しない場合は右側のテーブルの該当箇所にはNULLが入ります。左外部結合は左側のテーブルのすべての情報を維持しながら、右側のテーブルのデータを結合する際に使用されます。
右外部結合(RIGHT OUTER JOIN)
右外部結合は指定したテーブル(右側のテーブル)の全ての行を含み、共通のキーに基づいて結合条件を満たす行がある場合にはそれを結合します。
一致しない場合は左側のテーブルの該当箇所にはNULLが入ります。右外部結合は右側のテーブルのすべての情報を維持しながら、左側のテーブルのデータを結合する際に使用されます。
自己結合
自己結合とは、1つのテーブルを自分自身と結合する処理のことを指します。
例えば、社員表に社員番号と同じ形式の上司の社員番号が定義されているとします。自己結合する場合、FROM句で表に相関名(別名)をつけ「異なる表」として取り扱う必要があります。
SELECT A.氏名 AS 部下指名, B.氏名 AS 上司氏名
FROM 社員 A, 社員 B
WHERE A.上司社員番号 = B.社員番号