1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

基本情報技術者試験 データベース編②

Last updated at Posted at 2021-07-15

#初めに
前回の続きを書いていきます。

#SQLでDBを操作する
SQLというのは、DBMS(データベース管理システム)へ命令するために用いられる言語のことで
以下のような流れでユーザーがDBMSへ命令し、データを抽出したりなどを行います。
SQLの例.001.jpeg
様々な命令文がSQLには用意されており、

・表(テーブル)を定義するCREATE文
・行(レコード)を挿入するINSERT文
・削除するDELETE文
・行(レコード)の一部を更新するUPDATE文

などなど。

これらの命令は、スキーマの定義や表の作成といった定義を担当するデータ定義言語DDL
データの抽出や挿入、更新、削除といった操作を担当するデータ操作言語DMLに分けることができます。

SQLはこの2つの言語によって構成されています。

命令文の中で最も特徴的なのが、SELECT文です。
これは様々な条件を付与することで、柔軟にデータを抽出することができます。

データというのはただ貯め込むだけでは意味を持ちません。

何らかの条件付け(売り上げ上位の商品など)を行い
抽出することで初めてデータに意味がくっついてきます。

#SELECT文の基本的な書式
SELECT文によるデータ抽出の基本として

どのような条件で?
どの表から?
どの列を取り出す?

これらを指定することによってDBから様々なデータを取得できます。

例えば、以下のような表があったとしてDBMSに命令したとします。

・商品表
スクリーンショット 2021-07-13 12.55.55.png
どのような条件で?
単価50以上のもの

どの表から?
商品表から

どの列を取り出す?
商品名と単価

結果は以下のようになりました↓
スクリーンショット 2021-07-14 15.36.25.png
このように命令に合ったデータを取り出せます。

実際の書式はこんな感じで↓

SELECT 列名 FROM 表名 WHERE 条件

先ほどの命令をSQLで書くとこんな感じです↓

SELECT 商品名, 単価 FROM 商品表 WHERE 単価>=50

#関係演算とビュー表
前回の記事で正規化が出てきました。

DBに貯め込んだデータに矛盾や重複が発生しないように
表を最適化するといったものでしたね。

しかし、どんどん分割されていった正規化済みの表を見てみると
番号が並んであるだけだったり正直、分かりにくかったりします。
スクリーンショット 2021-07-14 15.52.15.png
ここまでの話では「データをいかに効率的に貯め込むか」でしたが
そのデータを活用できなきゃ意味がありません。

そういう時に関係演算が役に立ちます。

関係演算は、表と表をくっつけて新しい表を作ったり
表の中から特定の行や列を取り出したりなどが出来ます。

というわけで、関係演算はDBに貯め込んだデータを使って様々な表を生成できます。
このような、仮想的に作る一時的な表のことをビュー表と呼びます。

###・特定の列を抽出する(射影)
射影は、表の中から特定の列を取り出す関係演算です。

SQLでは以下のように記述し、射影を行います。

SELECT 商品名 FROM 商品表

・商品表
スクリーンショット 2021-07-13 12.55.55.png
射影を行う事によって、「商品名」が取り出されました↓
スクリーンショット 2021-07-14 16.03.01.png

###・特定の行を抽出する(選択)
選択は、表の中から特定の行を取り出す関係演算です。

SQLでは以下のように記述し、選択を行います。

SELECT * FROM 商品表 WHERE 単価>70

SELECT文で選択を行うには、WHERE句を用いて
取り出したい行の条件を指定します。

・商品表
スクリーンショット 2021-07-13 12.55.55.png
選択を行う事によって、条件に合った行が取り出されました↓
スクリーンショット 2021-07-14 16.12.10.png
先ほどもチラッと出てきましたね。

因みに、

SELECT * FROM ~

のように列名のところに*(アスタリスク)を使うと全ての列が抽出対象になります。
これは表の構造をそのままで、特定の行のみを取り出したい時に便利です。

WHERE句は比較演算子を用いて条件を指定していきます。
スクリーンショット 2021-07-14 16.29.26.png

###・条件を組み合わせて抽出する
例えば、「50以上100未満の商品」など複数の条件を
組み合わせて抽出したいとします。

その場合は論理演算子

・AND
・OR
・NOT

の3つを用います。

以下の表から抽出していきたいと思います。

・商品表
スクリーンショット 2021-07-13 12.55.55.png
#####○AND

SELECT * FROM 商品表 WHERE 単価>30 AND 単価<60

単価が30より大きく、かつ60未満のデータが取り出されました↓
スクリーンショット 2021-07-14 16.46.05.png
#####○OR

SELECT * FROM 商品表 WHERE 単価<30 OR 単価>60

単価が30未満または60より大きいデータが取り出されました↓
スクリーンショット 2021-07-14 16.49.22.png
#####○NOT

SELECT * FROM 商品表 WHERE NOT(単価<30 OR 単価>60)

単価が30未満でもなく、60より大きくないデータが取り出されました↓
スクリーンショット 2021-07-14 16.50.38.png

###・表と表を結合する(結合)
結合は、表と表を結合させる関係演算です。

結合を行うには、FROM句の中にくっつけたい表の名前を羅列して
WHERE句で結合させたい列を指定します。

SELECT * FROM 表名, 表名 WHERE 表名.列名=表名.列名

ここで注目するのが「表名.列名」の記述です。
これはどの表に所属する列かを表しています。

列を特定するために必要なだけで重複しない列名であれば
表名.」の部分は省略してもOKです。

では実際に以下の表を結合していきましょう。

・受注表
スクリーンショット 2021-07-14 17.13.53.png
・顧客表
スクリーンショット 2021-07-13 14.24.04.png

SELECT * FROM 受注表, 顧客表 WHERE 受注表.顧客コード=顧客表.顧客コード

「顧客コード」を使って各行が結びつけられました↓
スクリーンショット 2021-07-14 17.13.55.png
ちなみに結合させる列名が同じ名前同士である必要はありません。

###・データを整列させる
抽出結果を整列させたい場合はORDER BY句を用います。

ORDER BY 列名 ASC(またはDESC)

昇順で並べたい場合はASC(省略可)
降順で並べるにはDESCを記述します。

実際に以下の表の「単価」を並び替えてみます。

・商品表
スクリーンショット 2021-07-13 12.55.55.png

SELECT * FROM 商品表 ORDER BY 単価

「単価」が昇順で並べられました↓
スクリーンショット 2021-07-15 9.13.44.png
記述する時は、ASCは省略できるので
わざわざ記述していません。

因みに複数の列を並び替えることも可能です。

以下の表で複数の列を整列させてみましょう。

・受注表
スクリーンショット 2021-07-14 17.13.53.png

SELECT 顧客コード, 受注No, 受注日時 FROM 受注表 ORDER BY 顧客コード, 受注日時 DESC

「顧客コード」は昇順に、「受注日時」は降順に並べ替えられました↓
スクリーンショット 2021-07-15 9.22.30.png

###・集計を行う
データを取り出す際に集計を行うことができ、その為の様々な関数(集合関数)が用意されています。

これを用いると、列の合計値や最大値、行数(レコード件数)などを求めることが出来ます。
スクリーンショット 2021-07-15 9.38.57.png
例えば、扱っている商品の平均単価を求めたいなら以下のように記述します。

・商品表
スクリーンショット 2021-07-13 12.55.55.png

SELECT AVG(単価) FROM 商品表

「単価」の平均を求めることが出来ました↓
スクリーンショット 2021-07-15 9.49.37.png

###・データをグループ化する
グループ化というのは、特定の列を指定し、その中身が一致する項目をまとめて扱うことです。

これは集合関数と組み合わせることによって更に強力なものとなります。

グループ化には、GROUP BY句を用います。

GROUP BY 列名

実際に以下の表で、グループ化と集合関数を用いていきましょう。

・商品分類表
スクリーンショット 2021-07-15 10.14.01.png

SELECT 分類, AVG(単価) FROM 商品分類表 GROUP BY 分類

分類ごとの平均単価が求められました↓
スクリーンショット 2021-07-15 10.17.10.png

###・グループに条件を付けて絞り込んでいく
グループ化を行なった際に、これに条件を付けて取り出すグループを絞り込むことが出来ます。

条件を付けて絞り込むにはHAVING句を用います。

GROUP BY 列名 HAVING 絞り込み条件

以下の表から絞り込み条件を記述して取り出していきます。

・商品分類表
スクリーンショット 2021-07-15 10.14.01.png

SELECT 分類, AVG(単価) FROM 商品分類表 GROUP BY 分類 HAVING AVG(単価)>70

分類ごとの平均単価を求め、その中から平均単価が70より大きいグループを取り出せました↓
スクリーンショット 2021-07-15 10.31.28.png
#おわりに
今回はここまでです。

間違っている部分や気になる部分があれば
コメントして下さると有り難いです。

次の記事です。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?