見出し画像

備忘録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:今回使用するデータ

スクリーンショット 2021-05-23 16.19.36

前回に引き続き、このお寿司やさんデータを使用します。
前回全く触れられなかった 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:テーブルを結合する

スクリーンショット 2021-05-24 14.43.50

・テーブルの結合方法

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:複数の文字列を結合させる

スクリーンショット 2021-05-24 15.21.14

・結合させる方法

SELECT 先頭に置くカラム
CONCAT(値1, 値2, 値3, 好きなだけ) FROM テーブル名;


[ SELECTに指定したカラム ] を先頭に置き [ CONCATに指定した値を結合して表示 ]する。
指定した値が数値の場合、数値は文字列として出力される。
テーブルに存在しない値も ”任意の文字列” で追加して表示できる。

つまりこうすると
CONCAT("これは", "登録", "されていない", "文字列です");

こうなる
⇨これは登録されていない文字列です

このように結合させる。
[緑枠] は先頭に置くカラム。[黄枠] が結合して表示する値。
先頭は何でも良いけど、idが一番無難で分かり易い。

[ menuテーブル ] を読み込んで、 [ id ] を先頭に置き
[ カラムname ] と [ カラムprice ] と [ "円" ] を結合して取得、表示する。

[”円”] のように、テーブルに存在しない文字列、またはカラムでも
値として記述することで問題なく付け加えることが出来る。
一応、テーブルを跨いで結合することも出来る。


7:データをグループ化し、合計や平均値を取得する

スクリーンショット 2021-05-24 16.17.14

・グループ化の方法

SELECT 表示するカラム1, 表示するカラム2, 好きなだけ,,,
FROM テーブル名 GROUP BY グループ化するカラム名;


グループ化する = グループ化により変化した情報を得たい
と言う目的があるため 表示するカラム1 はグループ化の基準となる項目になる。

そのため、以下の構図が成り立つ
表示するカラム1 = グループ化するカラム名

このように取得する。
グループ化はカラムに対して行い、各レコードで同じ情報をまとめる。
そのため、文字列であってもグループ化することが出来る。

[ menuテーブル ] にある [ priceカラム ] をグループ化し
[ price毎 ] に [ stockの合計 ] と [ stockの平均値 ] を表示する。 

このように、数値でも文字列でも指定した物をグループ化できる。
正直、テーブルに入っている値の作り方を失敗したと思っている( ˘ω˘)


8:データの総量をカウントする

スクリーンショット 2021-05-24 16.40.27

・カウントを行う方法

SELECT グループ化するカラム, COUNT(カウントするカラム)
FROM テーブル名 GROUP BY グループ化するカラム名;


[カウントするカラム] が各グループに [何個入っているか] をカウントする。
文字列・数値に関わらず [何回登場したか?] により出力される値が決定される。

このようにカウントを行う。
グループ化された項目に対して、いくつの情報を含んでいるかを出力する。

[ priceグループ ] 含まれる [ nameの数 ] を出力している。

文字列・数値に関係なくグループ内に格納されたレコードの数を出力する。
グループ化による合計や平均と併せると便利そうです。
商品をジャンル分けして、それぞれいくつの商品があるか?とか?


9:終わりに

ひとまず、今回でDCLについては終了です。
基本1つずつ小分けにして書きましたが、実際はこれらを組み合わせるハズ。
そりゃあもうあれやこれやと。
きっと、如何に上手くこの組み合わせを考えられるか?
って言うのが本質なんじゃあないかなぁと想像してます。

果たして本当に出来るんすかね?
自信が無くなってきますよっ!
でもやるからにはやらんとねぇ〜。

次回を何にするかはまだ未定です。
ある程度、学習がひと段落したら書くと思います。



終わり!!!!!!!!!!!!!!!!!

この記事が気に入ったらサポートをしてみませんか?