情報系のべんきょう

情報系のノートを作ります.ビギナー向けでは無いです.

SQL <前編>

SQL

前回はデータベースの正規化の話をしましたが,次はSQLの話を2つの記事に分けてしていきます.

前半の記事では,SQLの基本的な構文を紹介します.

SQL(Structured Query Language)は,データベースの定義や操作を実行するために用いられます.

目次

1.SELECT

2.DISTICNT

3.集合関数

4.FROM

5.WHERE

6.GROUP BY

7.HAVING

8.ORDER BY

9.UNION,INTERSECT,EXCEPT

1. SELECT

SELECTの後に列名を指定することでその列のデータのみがその順番通りに抽出されます.

ちなみに,このように指定した列名のデータのみを抽出することを射影といいます.

1.1. SELECT "列名1","列名2",...

"列名1", "列名2", ...と複数の列を抽出できます.

例1(表1参照)
SELECT 学籍番号,氏名

FROM 学生

f:id:chankilu23:20201231141452j:plain

1.2. SELECT "列名" AS "新列名"

"列名"のデータを,"新列名"を新たな列名として抽出します.

例2(表2参照)
SELECT 学籍番号,氏名 AS 名前

FROM 学生

f:id:chankilu23:20201231141750j:plain

1.3. SELECT *

FROM句で指定したテーブルの全ての列が抽出されます.

例3(表3参照)
SELECT *

FROM 学生

f:id:chankilu23:20201231141805j:plain

1.4. SELECT * FROM "表名1", "表名2", ...

SELECTで*と指定し,FROM句で表を指定すると,指定した表の値の全ての組み合わせが抽出されます.

これを直積といいます.

例4(表4参照)
SELECT *

FROM 学生,学部

f:id:chankilu23:20210102121318j:plain

目次へ

2. DISTINCT

distinctとは,ここでは「区別ができる」というような意味で,DISTINCTは射影したときに行を重複させずに出力します.

DISTINCTがないとどうなるのか見てみます.

例5(表5参照)
SELECT 所属サークル

FROM 学生

f:id:chankilu23:20210101174725j:plain

赤字で示したように,軽音とダンスが重複して表示されています.

一方で,SELECTの直後でDISTINCTを指定してみます.

例6(表6参照)
SELECT DISTINCT 所属サークル

FROM 学生

f:id:chankilu23:20210101174741j:plain

重複していた軽音とダンスは 1行しか表示されていません.

トップへ

3. 集合関数

3.1. MAX, MIN

それぞれ最大値(maximum)と最小値(minimum)を求めます.

SELECTの後にMAX("列名")を指定すると,"列名"の値における最大値が得られます.

MIN("列名")を指定すると,"列名"の値における最小値が得られます.

先ほどのSELECT ASと合わせることで以下のようになります.

例7(表7参照)
SELECT MAX(成績) AS 成績の最大,MIN(成績) AS 成績の最小

FROM 学生

f:id:chankilu23:20210102123043j:plain

3.2. AVG

平均(average)を求めます.

NULLがあった(値が登録されていない)ときはその行は無いものとして計算します.

下の例では,

 \dfrac{48+65+73+99+54+44}{6}

を計算します.

例8(表8参照)
SELECT AVG(成績) AS 成績の平均

FROM 学生

f:id:chankilu23:20210102123127j:plain

3.3. SUM

和(summation)を求めます.

NULLがあったときはAVGと同様にその行は無いものとして計算します.

例9(表9参照)
SELECT SUM(成績) AS 成績の和

FROM 学生

f:id:chankilu23:20210102123139j:plain

3.4. COUNT

行の数を求めます(count).

COUNT(*)と指定すると,全ての行数がカウントされます.

COUNT("列名")と指定すると,"列名"のNULL以外がカウントされます.

例えば,体調不良などで試験を欠席した人以外を数えるときは以下のようにするといいでしょう.

例10(表10参照)
SELECT COUNT(*) AS 合計人数,COUNT(成績) AS 受験人数

FROM 学生

f:id:chankilu23:20210102123150j:plain

トップへ

4. FROM

FROM句では,データを抽出するテーブル名であったりビュー名を指定します.

例4で見たようにFROM句では複数の表を指定できます.

また,相関名という概念があります.

相関名とは,テーブル名につけた別の名前のことです.

下の例では,ASで相関名をXとしています.

ただし,相関名を指定したときは,列名は"相関名.列名"で指定します.

例11(表11参照)
SELECT X.学籍番号,X.氏名

FROM 学生 AS X

f:id:chankilu23:20210103152906j:plain

トップへ

5. WHERE

WHERE句の後に条件を指定することによって,その条件を満たす行のみを抽出します.

条件に合う行を取り出すことを選択といいます.

条件には抽出条件と結合条件があります.

5.1. 抽出条件

抽出条件に用いる演算子として,比較演算子や論理演算子などがあります.

5.1.1. 比較演算子

比較演算子には6種類あり,それぞれ次のような意味を持っています.

f:id:chankilu23:20210103160800j:plain:w1500

ここでは,>=の例だけ挙げておきます.

例12(表12参照)
SELECT *

FROM 学生
WHERE 成績 >= 65

f:id:chankilu23:20210103203449j:plain

5.1.2. 論理演算子

AND演算子

WHEREの後に,"条件1" AND "条件2" と指定すると,"条件1"と"条件2"が共に真であるような行が抽出されます.

ただし,NULLのある行は無条件に抽出しません.

例13(表13参照)
SELECT *

FROM 学生
WHERE 学籍番号 < 0005 AND 成績 >= 65

f:id:chankilu23:20210104153117j:plain

OR演算子

WHEREの後に,"条件1" OR "条件2" と指定すると,"条件1"と"条件2"のうち少なくとも一方が真であるような行が抽出されます.

ただし,NULLのある行は無条件に抽出しません.

例14(表14参照)
SELECT *

FROM 学生
WHERE 学籍番号 < 0005 OR 成績 >= 65

f:id:chankilu23:20210104153134j:plain

NOT演算子

WHEREの後に,NOT "条件1" と指定すると,"条件1"が偽であるような行が抽出されます.

ただし,NULLのある行は無条件に抽出しません.

例15(表15参照)
SELECT *

FROM 学生
WHERE NOT 成績 = 65

f:id:chankilu23:20210104180132j:plain

5.1.3. その他

IN()演算子

WHEREの後に,"列名" IN ("値1", "値2", ....)と指定すると,"列名"が"値1", "値2", ...に一致するような行が抽出されます.

ただし,NULLのある行は無条件に抽出しません.

例16(表16参照)
SELECT *

FROM 学生
WHERE 成績 IN (44, 46, 48)

f:id:chankilu23:20210104162744j:plain

BETWEEN AND演算子

WHEREの後に,"列名" BETWEEN "値1" AND "値2" と指定すると,"列名"の値が"値1"以上"値2"以下であるような行が抽出されます.

例17(表17参照)
SELECT *

FROM 学生
WHERE 成績 BETWEEN 48 AND 72

f:id:chankilu23:20210104175435j:plain

IS NULL演算子

WHEREの後に,"列名" IS NULLと指定すると,"列名"の値がNULLであるような行が抽出されます.

例18(表18参照)
SELECT *

FROM 学生
WHERE 成績 IS NULL

f:id:chankilu23:20210104175448j:plain

IS NOT NULL演算子

WHEREの後に,"列名" IS NOT NULLと指定すると"列名"の値がNULLでないような行が抽出されます.

例19(表19参照)
SELECT *

FROM 学生
WHERE 成績 IS NOT NULL

f:id:chankilu23:20210104175500j:plain

LIKE演算子

文字列の検索に使います.

WHEREの後に,"列名" '文字列検索条件'と指定すると,"列名"の値がその文字列検索条件を満たす行を抽出します.

文字列検索条件に用いるのは

%:0文字以上の任意の文字列

_:1文字以上の任意の文字列

があります.

以下に4つ例を出します.

例20 前方一致検索 (表20参照)
SELECT *

FROM 学生
WHERE 氏名 LIKE '中%'

f:id:chankilu23:20210105102649j:plain

例21 後方一致検索 (表21参照)
SELECT *

FROM 学生
WHERE 氏名 LIKE '%花'

f:id:chankilu23:20210105104353j:plain

例22 中間一致検索1 (表22参照)
SELECT *

FROM 学生
WHERE 氏名 LIKE '%中%'

%は任意の0文字分なので,この例22では先頭が"中"でもOKです.

f:id:chankilu23:20210105104414j:plain

例23 中間一致検索2 (表23参照)
SELECT *

FROM 学生
WHERE 氏名 LIKE '_中%%'

アンダースコア"_"は任意の1文字分なので,この例23では2文字目が"中"である,という条件であることに注意します.

f:id:chankilu23:20210107165029j:plain

5.2 結合条件

結合条件とは,指定された2つの列の値が同じ行を抽出する条件です.

例24(表24参照)
SELECT *

FROM 学生,学部
WHERE 所属学部コード = 学部コード

f:id:chankilu23:20210105153216j:plain

下の例25のように,違う表で列名が同じ場合は,"表名.列名"のように指定します.

例25(表25参照)
SELECT *

FROM 学生,学部
WHERE 学生.学部コード = 学部.学部コード

f:id:chankilu23:20210105153236j:plain

下の例26のように,相関名を用いることもできます.

例26(表26参照)
SELECT *

FROM 学生 A,学部 B
WHERE A.学部コード = B.学部コード

f:id:chankilu23:20210105153256j:plain

トップへ

6. GROUP BY

GROUP BY句は,指定した列の値が同じ行をグループ化します.

普通は集合関数と一緒に使います.

また制約があり,SELECTの後に指定する項目は

・GROUP BY句の後にした列名

・集合関数

のどちらかでないといけません.


下の例27は,学部ごとの成績の平均を抽出したものです.

例27(表27参照)
SELECT 学部名 AVG(成績)

FROM 学生,学部
WHERE 学生.学部コード = 学部.学部コード
GROUP BY 学部名

f:id:chankilu23:20210105153732j:plain

トップへ

7. HAVING

HAVING句では,GROUP BY句でグループ化した後の行に対する条件を指定します.

また制約があり,HAVINGの後に指定する抽出条件は

・GROUP BY句で指定した列名

・集合関数

のどちらかでないといけません.

例28(表28参照)
SELECT 学部名 AVG(成績)

FROM 学生,学部
WHERE 学生.学部コード = 学部.学部コード
GROUP BY 学部名
HAVING AVG(成績) > 80

f:id:chankilu23:20210105161038j:plain

トップへ

8. ORDER BY

ORDER BY句は,指定した列に関して,抽出した行を昇順または降順にソート(並び替え)します.

昇順ではASC(ascending)を指定し,降順ではDESC(descending)を指定します.

何も指定しない場合は,ASCがデフォルトで指定されます.

複数の列に関してソートすることも可能で,優先順位の高い順に

ORDER BY "列名1", "列名2", ...

とすればよいです.

例29(表29参照)
SELECT *

FROM 学生
ORDER BY 学部コード,成績

f:id:chankilu23:20210107145755j:plain

ORDER BY の後に整数 nを指定すると,SELECTで指定した列のうち n番目の列を指定することができます.

例30(表30参照)
SELECT 学部コード,AVG(成績)

FROM 学生
GROUP BY 学部コード
ORDER BY 2 DESC

f:id:chankilu23:20210107165715j:plain

トップへ

9.UNION,INTERSECT,EXCEPT

数学でいう和集合,共通部分,差集合に対応する演算子です.

これらの演算子を使うときには,SELECTで指定した表の列名や列の構成が同じである必要があります.

そこまで頻出ではないようなのでサラッと紹介だけします.

9.1. UNION

2つの表のうち,少なくとも一方に属する行を抽出します.

ALLを付けると,重複行は取り除かれません.

ALLを付けなければ,重複行は取り除かれます.

例31(表31参照)
SELECT * FROM 工学部生

UNION ALL

SELECT * FROM ダンス部

f:id:chankilu23:20210107154357j:plain

9.2 INTERSECT

2つの表に共に属する行を抽出します.

例32(表32参照)
SELECT * FROM 工学部生

INTERSECT

SELECT * FROM ダンス部

f:id:chankilu23:20210107154412j:plain

9.3 EXCEPT

先に指定した表に属する行のうち,後に指定した表に属する行を取り除きます.

例33(表33参照)
SELECT * FROM 工学部生

EXCEPT

SELECT * FROM ダンス部

f:id:chankilu23:20210107170025j:plain


基本的なSQLの構文を解説しました.

後半の記事ではデータ定義言語や副問合せなどの話をします.

ふぅ,疲れた.

参考:金子則彦「データベーススペシャリスト合格教本」,アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」