#初めに
前回の続きを書いていきます。
#SQLでDBを操作する
SQL
というのは、DBMS(データベース管理システム)へ命令するために用いられる言語
のことで
以下のような流れでユーザーがDBMSへ命令し、データを抽出したりなどを行います。
様々な命令文がSQLには用意されており、
・表(テーブル)を定義するCREATE文
・行(レコード)を挿入するINSERT文
・削除するDELETE文
・行(レコード)の一部を更新するUPDATE文
などなど。
これらの命令は、スキーマの定義や表の作成といった定義を担当するデータ定義言語DDL
と
データの抽出や挿入、更新、削除といった操作を担当するデータ操作言語DML
に分けることができます。
SQLはこの2つの言語によって構成されています。
命令文の中で最も特徴的なのが、SELECT文
です。
これは様々な条件を付与することで、柔軟にデータを抽出することができます。
データというのはただ貯め込むだけでは意味を持ちません。
何らかの条件付け(売り上げ上位の商品など)を行い
抽出することで初めてデータに意味がくっついてきます。
#SELECT文の基本的な書式
SELECT文によるデータ抽出の基本として
・どのような条件で?
・どの表から?
・どの列を取り出す?
これらを指定することによってDBから様々なデータを取得できます。
例えば、以下のような表があったとしてDBMSに命令したとします。
・どの表から?
商品表から
・どの列を取り出す?
商品名と単価
結果は以下のようになりました↓
このように命令に合ったデータを取り出せます。
実際の書式はこんな感じで↓
SELECT 列名 FROM 表名 WHERE 条件
先ほどの命令をSQLで書くとこんな感じです↓
SELECT 商品名, 単価 FROM 商品表 WHERE 単価>=50
#関係演算とビュー表
前回の記事で正規化が出てきました。
DBに貯め込んだデータに矛盾や重複が発生しないように
表を最適化するといったものでしたね。
しかし、どんどん分割されていった正規化済みの表を見てみると
番号が並んであるだけだったり正直、分かりにくかったりします。
ここまでの話では「データをいかに効率的に貯め込むか
」でしたが
そのデータを活用できなきゃ意味がありません。
そういう時に関係演算
が役に立ちます。
関係演算は、表と表をくっつけて新しい表を作ったり
表の中から特定の行や列を取り出したりなどが出来ます。
というわけで、関係演算はDBに貯め込んだデータを使って様々な表を生成できます。
このような、仮想的に作る一時的な表のことをビュー表
と呼びます。
###・特定の列を抽出する(射影)
射影
は、表の中から特定の列を取り出す関係演算
です。
SQLでは以下のように記述し、射影を行います。
SELECT 商品名 FROM 商品表
・商品表
射影を行う事によって、「商品名」が取り出されました↓
###・特定の行を抽出する(選択)
選択
は、表の中から特定の行を取り出す関係演算
です。
SQLでは以下のように記述し、選択を行います。
SELECT * FROM 商品表 WHERE 単価>70
SELECT文で選択を行うには、WHERE句
を用いて
取り出したい行の条件を指定します。
・商品表
選択を行う事によって、条件に合った行が取り出されました↓
先ほどもチラッと出てきましたね。
因みに、
SELECT * FROM ~
のように列名のところに*(アスタリスク)を使うと全ての列が抽出対象
になります。
これは表の構造をそのままで、特定の行のみを取り出したい時に便利です。
###・条件を組み合わせて抽出する
例えば、「50以上100未満の商品」など複数の条件を
組み合わせて抽出したいとします。
その場合は論理演算子
の
・AND
・OR
・NOT
の3つを用います。
以下の表から抽出していきたいと思います。
SELECT * FROM 商品表 WHERE 単価>30 AND 単価<60
単価が30より大きく、かつ60未満のデータが取り出されました↓
#####○OR
SELECT * FROM 商品表 WHERE 単価<30 OR 単価>60
単価が30未満または60より大きいデータが取り出されました↓
#####○NOT
SELECT * FROM 商品表 WHERE NOT(単価<30 OR 単価>60)
単価が30未満でもなく、60より大きくないデータが取り出されました↓
###・表と表を結合する(結合)
結合
は、表と表を結合させる関係演算
です。
結合を行うには、FROM句の中にくっつけたい表の名前を羅列して
WHERE句で結合させたい列を指定します。
SELECT * FROM 表名, 表名 WHERE 表名.列名=表名.列名
ここで注目するのが「表名.列名
」の記述です。
これはどの表に所属する列か
を表しています。
列を特定するために必要なだけで重複しない列名であれば
「表名.
」の部分は省略してもOK
です。
では実際に以下の表を結合していきましょう。
SELECT * FROM 受注表, 顧客表 WHERE 受注表.顧客コード=顧客表.顧客コード
「顧客コード」を使って各行が結びつけられました↓
ちなみに結合させる列名が同じ名前同士である必要はありません。
###・データを整列させる
抽出結果を整列させたい場合はORDER BY句
を用います。
ORDER BY 列名 ASC(またはDESC)
昇順で並べたい場合はASC(省略可)
で
降順で並べるにはDESC
を記述します。
実際に以下の表の「単価」を並び替えてみます。
SELECT * FROM 商品表 ORDER BY 単価
「単価」が昇順で並べられました↓
記述する時は、ASCは省略できるので
わざわざ記述していません。
因みに複数の列を並び替えることも可能です。
以下の表で複数の列を整列させてみましょう。
SELECT 顧客コード, 受注No, 受注日時 FROM 受注表 ORDER BY 顧客コード, 受注日時 DESC
「顧客コード」は昇順に、「受注日時」は降順に並べ替えられました↓
###・集計を行う
データを取り出す際に集計を行うことができ、その為の様々な関数(集合関数
)が用意されています。
これを用いると、列の合計値や最大値、行数(レコード件数)などを求めることが出来ます。
例えば、扱っている商品の平均単価を求めたいなら以下のように記述します。
SELECT AVG(単価) FROM 商品表
###・データをグループ化する
グループ化
というのは、特定の列を指定し、その中身が一致する項目をまとめて扱うこと
です。
これは集合関数と組み合わせることによって更に強力なものとなります。
グループ化には、GROUP BY句
を用います。
GROUP BY 列名
実際に以下の表で、グループ化と集合関数を用いていきましょう。
SELECT 分類, AVG(単価) FROM 商品分類表 GROUP BY 分類
###・グループに条件を付けて絞り込んでいく
グループ化を行なった際に、これに条件を付けて取り出すグループを絞り込むことが出来ます。
条件を付けて絞り込むにはHAVING句
を用います。
GROUP BY 列名 HAVING 絞り込み条件
以下の表から絞り込み条件を記述して取り出していきます。
SELECT 分類, AVG(単価) FROM 商品分類表 GROUP BY 分類 HAVING AVG(単価)>70
分類ごとの平均単価を求め、その中から平均単価が70より大きいグループを取り出せました↓
#おわりに
今回はここまでです。
間違っている部分や気になる部分があれば
コメントして下さると有り難いです。
次の記事です。