備忘録8:SQLについて(4/3)-DCL
転職のための3月6日から某スクールにでプログラミング学習を始めた32歳のおっさんです。時系列でHTML⇨CSS⇨Rails & JavaScript &SQLを学習中。
前回に引き続きSQL。今回は、前回に引き続きDCLです。
学習内容:SQLによるデータベース操作
1:開幕の自問自答
①また予定回数で終わんなかったんすか?
⇨はい。
②で、今回もDCMだけど、具体的に何するんすか?
⇨後述しますが、各情報を結合させて、新しい情報を取得します。
③Do You Koto?
⇨別々のテーブルを関連付けてまとめて表示したり
テーブル内の情報をまとめて平均値を得たり。です。
前回は情報を取得するだけでしたが
今回は、既存の情報から新しい情報を得るための操作です。
と、言う訳で前回の続きです。
合計値とか、平均値とか、エクセルでも散々やったやつですね。
SQLを扱う上でかなり重要度が高そう?な気がします。
実際にどうなのかは分かりませんがっ!
2:全体の流れ
⓪今回使用するデータ
①DCLについて確認
②テーブルを結合する
③文字列を結合する
④データをグループ化し、合計や平均値を取得する
⑤グループ化したデータの総量をカウントする
3:今回使用するデータ
前回に引き続き、このお寿司やさんデータを使用します。
前回全く触れられなかった costテーブルくん の出番がやってきました。
4:DCLとは?????
前回のおさらいです。
一応、前回とは別の記事なのでもう一度書いておきます。
DCLとは、SQLによる操作を大きく3つに分類したうちの1つ
DDL:データの定義 ※Data Definition Language
DML:データの操作 ※Data Manipulation Language
DCL:データの制御 ※Data Control Language ←これの続き
そして、今回使用する演算子が以下の子達です。
前回でたデータ取得の演算子くんたちは今回省略します。
既存の情報を組み合わせ、新しい情報を得るための操作。
JOIN:2つのテーブルを結合して取得する。Railsのreferences的な。
CONCAT:複数の文字列を結合させる。苗字+名前で氏名になる。
GROUP BY:データをグループ化し、平均値や総計を出し、取得する。
COUNT:グループ化されたデータの総量をカウントする。
5:テーブルを結合する
・テーブルの結合方法
SELECT パターン
FROM テーブル名1
JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2.カラム名2;
テーブル名が長くて書くのがめんどくさい場合は、記述内で別の名前を付けられる。
SELECT *
FROM menu m
JOIN cost c ON m.id = c.menu_id;
「テーブル名 半角スペース 新しい名前」と記述することで
この記述内でのみ、新しい名前を使うことが出来る。
このように結合を行う。
テーブル1・2の順番は、どちらが先でも問題ない。
[ menuテーブルのカラムid ] と [ costテーブルのカラムmenu_id ]から
互いに対応する [ 値 ] を関連付けて、1つのレコードとして取得する。
Railsで言う、アソシエーション的な感じですね。referencesのやつ。
多分、考え方的にはほぼ合っていると思います。
データをより関連づけて考え易くなるため、とてもありがたいですね( ˘ω˘)
6:複数の文字列を結合させる
・結合させる方法
SELECT 先頭に置くカラム
CONCAT(値1, 値2, 値3, 好きなだけ) FROM テーブル名;
[ SELECTに指定したカラム ] を先頭に置き [ CONCATに指定した値を結合して表示 ]する。
指定した値が数値の場合、数値は文字列として出力される。
テーブルに存在しない値も ”任意の文字列” で追加して表示できる。
つまりこうすると
CONCAT("これは", "登録", "されていない", "文字列です");
こうなる
⇨これは登録されていない文字列です
このように結合させる。
[緑枠] は先頭に置くカラム。[黄枠] が結合して表示する値。
先頭は何でも良いけど、idが一番無難で分かり易い。
[ menuテーブル ] を読み込んで、 [ id ] を先頭に置き
[ カラムname ] と [ カラムprice ] と [ "円" ] を結合して取得、表示する。
[”円”] のように、テーブルに存在しない文字列、またはカラムでも
値として記述することで問題なく付け加えることが出来る。
一応、テーブルを跨いで結合することも出来る。
7:データをグループ化し、合計や平均値を取得する
・グループ化の方法
SELECT 表示するカラム1, 表示するカラム2, 好きなだけ,,,
FROM テーブル名 GROUP BY グループ化するカラム名;
グループ化する = グループ化により変化した情報を得たい
と言う目的があるため 表示するカラム1 はグループ化の基準となる項目になる。
そのため、以下の構図が成り立つ
表示するカラム1 = グループ化するカラム名
このように取得する。
グループ化はカラムに対して行い、各レコードで同じ情報をまとめる。
そのため、文字列であってもグループ化することが出来る。
[ menuテーブル ] にある [ priceカラム ] をグループ化し
[ price毎 ] に [ stockの合計 ] と [ stockの平均値 ] を表示する。
このように、数値でも文字列でも指定した物をグループ化できる。
正直、テーブルに入っている値の作り方を失敗したと思っている( ˘ω˘)
8:データの総量をカウントする
・カウントを行う方法
SELECT グループ化するカラム, COUNT(カウントするカラム)
FROM テーブル名 GROUP BY グループ化するカラム名;
[カウントするカラム] が各グループに [何個入っているか] をカウントする。
文字列・数値に関わらず [何回登場したか?] により出力される値が決定される。
このようにカウントを行う。
グループ化された項目に対して、いくつの情報を含んでいるかを出力する。
[ priceグループ ] 含まれる [ nameの数 ] を出力している。
文字列・数値に関係なくグループ内に格納されたレコードの数を出力する。
グループ化による合計や平均と併せると便利そうです。
商品をジャンル分けして、それぞれいくつの商品があるか?とか?
9:終わりに
ひとまず、今回でDCLについては終了です。
基本1つずつ小分けにして書きましたが、実際はこれらを組み合わせるハズ。
そりゃあもうあれやこれやと。
きっと、如何に上手くこの組み合わせを考えられるか?
って言うのが本質なんじゃあないかなぁと想像してます。
果たして本当に出来るんすかね?
自信が無くなってきますよっ!
でもやるからにはやらんとねぇ〜。
次回を何にするかはまだ未定です。
ある程度、学習がひと段落したら書くと思います。
終わり!!!!!!!!!!!!!!!!!
この記事が気に入ったらサポートをしてみませんか?