SQL <前編>
SQL
前回はデータベースの正規化の話をしましたが,次はSQLの話を2つの記事に分けてしていきます.
前半の記事では,SQLの基本的な構文を紹介します.
SQL(Structured Query Language)は,データベースの定義や操作を実行するために用いられます.
目次
1. SELECT
SELECTの後に列名を指定することでその列のデータのみがその順番通りに抽出されます.
ちなみに,このように指定した列名のデータのみを抽出することを射影といいます.
1.1. SELECT "列名1","列名2",...
"列名1", "列名2", ...と複数の列を抽出できます.
FROM 学生
1.2. SELECT "列名" AS "新列名"
"列名"のデータを,"新列名"を新たな列名として抽出します.
FROM 学生
1.3. SELECT *
FROM句で指定したテーブルの全ての列が抽出されます.
FROM 学生
1.4. SELECT * FROM "表名1", "表名2", ...
SELECTで*と指定し,FROM句で表を指定すると,指定した表の値の全ての組み合わせが抽出されます.
これを直積といいます.
FROM 学生,学部
2. DISTINCT
distinctとは,ここでは「区別ができる」というような意味で,DISTINCTは射影したときに行を重複させずに出力します.
DISTINCTがないとどうなるのか見てみます.
FROM 学生
赤字で示したように,軽音とダンスが重複して表示されています.
一方で,SELECTの直後でDISTINCTを指定してみます.
FROM 学生
重複していた軽音とダンスは行しか表示されていません.
3. 集合関数
3.1. MAX, MIN
それぞれ最大値(maximum)と最小値(minimum)を求めます.
SELECTの後にMAX("列名")を指定すると,"列名"の値における最大値が得られます.
MIN("列名")を指定すると,"列名"の値における最小値が得られます.
先ほどのSELECT ASと合わせることで以下のようになります.
FROM 学生
3.2. AVG
平均(average)を求めます.
NULLがあった(値が登録されていない)ときはその行は無いものとして計算します.
下の例では,
を計算します.
3.3. SUM
和(summation)を求めます.
NULLがあったときはAVGと同様にその行は無いものとして計算します.
FROM 学生
3.4. COUNT
行の数を求めます(count).
COUNT(*)と指定すると,全ての行数がカウントされます.
COUNT("列名")と指定すると,"列名"のNULL以外がカウントされます.
例えば,体調不良などで試験を欠席した人以外を数えるときは以下のようにするといいでしょう.
FROM 学生
4. FROM
FROM句では,データを抽出するテーブル名であったりビュー名を指定します.
例4で見たようにFROM句では複数の表を指定できます.
また,相関名という概念があります.
相関名とは,テーブル名につけた別の名前のことです.
下の例では,ASで相関名をXとしています.
ただし,相関名を指定したときは,列名は"相関名.列名"で指定します.
FROM 学生 AS X
5. WHERE
WHERE句の後に条件を指定することによって,その条件を満たす行のみを抽出します.
条件に合う行を取り出すことを選択といいます.
条件には抽出条件と結合条件があります.
5.1. 抽出条件
抽出条件に用いる演算子として,比較演算子や論理演算子などがあります.
5.1.1. 比較演算子
比較演算子には6種類あり,それぞれ次のような意味を持っています.
ここでは,>=の例だけ挙げておきます.
FROM 学生
WHERE 成績 >= 65
5.1.2. 論理演算子
AND演算子
WHEREの後に,"条件1" AND "条件2" と指定すると,"条件1"と"条件2"が共に真であるような行が抽出されます.
ただし,NULLのある行は無条件に抽出しません.
FROM 学生
WHERE 学籍番号 < 0005 AND 成績 >= 65
OR演算子
WHEREの後に,"条件1" OR "条件2" と指定すると,"条件1"と"条件2"のうち少なくとも一方が真であるような行が抽出されます.
ただし,NULLのある行は無条件に抽出しません.
FROM 学生
WHERE 学籍番号 < 0005 OR 成績 >= 65
NOT演算子
WHEREの後に,NOT "条件1" と指定すると,"条件1"が偽であるような行が抽出されます.
ただし,NULLのある行は無条件に抽出しません.
FROM 学生
WHERE NOT 成績 = 65
5.1.3. その他
IN()演算子
WHEREの後に,"列名" IN ("値1", "値2", ....)と指定すると,"列名"が"値1", "値2", ...に一致するような行が抽出されます.
ただし,NULLのある行は無条件に抽出しません.
FROM 学生
WHERE 成績 IN (44, 46, 48)
BETWEEN AND演算子
WHEREの後に,"列名" BETWEEN "値1" AND "値2" と指定すると,"列名"の値が"値1"以上"値2"以下であるような行が抽出されます.
FROM 学生
WHERE 成績 BETWEEN 48 AND 72
IS NULL演算子
WHEREの後に,"列名" IS NULLと指定すると,"列名"の値がNULLであるような行が抽出されます.
FROM 学生
WHERE 成績 IS NULL
IS NOT NULL演算子
WHEREの後に,"列名" IS NOT NULLと指定すると"列名"の値がNULLでないような行が抽出されます.
FROM 学生
WHERE 成績 IS NOT NULL
LIKE演算子
文字列の検索に使います.
WHEREの後に,"列名" '文字列検索条件'と指定すると,"列名"の値がその文字列検索条件を満たす行を抽出します.
文字列検索条件に用いるのは
%:0文字以上の任意の文字列
_:1文字以上の任意の文字列
があります.
以下に4つ例を出します.
FROM 学生
WHERE 氏名 LIKE '中%'
FROM 学生
WHERE 氏名 LIKE '%花'
FROM 学生
WHERE 氏名 LIKE '%中%'
%は任意の0文字分なので,この例22では先頭が"中"でもOKです.
FROM 学生
WHERE 氏名 LIKE '_中%%'
アンダースコア"_"は任意の1文字分なので,この例23では2文字目が"中"である,という条件であることに注意します.
5.2 結合条件
結合条件とは,指定された2つの列の値が同じ行を抽出する条件です.
FROM 学生,学部
WHERE 所属学部コード = 学部コード
下の例25のように,違う表で列名が同じ場合は,"表名.列名"のように指定します.
FROM 学生,学部
WHERE 学生.学部コード = 学部.学部コード
下の例26のように,相関名を用いることもできます.
FROM 学生 A,学部 B
WHERE A.学部コード = B.学部コード
6. GROUP BY
GROUP BY句は,指定した列の値が同じ行をグループ化します.
普通は集合関数と一緒に使います.
また制約があり,SELECTの後に指定する項目は
・GROUP BY句の後にした列名
・集合関数
のどちらかでないといけません.
下の例27は,学部ごとの成績の平均を抽出したものです.
7. HAVING
HAVING句では,GROUP BY句でグループ化した後の行に対する条件を指定します.
また制約があり,HAVINGの後に指定する抽出条件は
・GROUP BY句で指定した列名
・集合関数
のどちらかでないといけません.
8. ORDER BY
ORDER BY句は,指定した列に関して,抽出した行を昇順または降順にソート(並び替え)します.
昇順ではASC(ascending)を指定し,降順ではDESC(descending)を指定します.
何も指定しない場合は,ASCがデフォルトで指定されます.
複数の列に関してソートすることも可能で,優先順位の高い順に
ORDER BY "列名1", "列名2", ...
とすればよいです.
FROM 学生
ORDER BY 学部コード,成績
ORDER BY の後に整数を指定すると,SELECTで指定した列のうち番目の列を指定することができます.
9.UNION,INTERSECT,EXCEPT
数学でいう和集合,共通部分,差集合に対応する演算子です.
これらの演算子を使うときには,SELECTで指定した表の列名や列の構成が同じである必要があります.
そこまで頻出ではないようなのでサラッと紹介だけします.
9.1. UNION
2つの表のうち,少なくとも一方に属する行を抽出します.
ALLを付けると,重複行は取り除かれません.
ALLを付けなければ,重複行は取り除かれます.
UNION ALL
SELECT * FROM ダンス部
9.2 INTERSECT
2つの表に共に属する行を抽出します.
INTERSECT
SELECT * FROM ダンス部
9.3 EXCEPT
先に指定した表に属する行のうち,後に指定した表に属する行を取り除きます.
EXCEPT
SELECT * FROM ダンス部
基本的なSQLの構文を解説しました.
後半の記事ではデータ定義言語や副問合せなどの話をします.
ふぅ,疲れた.
参考:金子則彦「データベーススペシャリスト合格教本」,アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」