reponの忘備録

「喉まででかかってる」状態を解消するためのメモ

LAMPのお勉強日記 (9)

LAMP環境のお勉強日記

目的

  • 自分が何をやったのか記録する
  • 自分が何を出来るのか公開する

経過

まず、MySQLの勉強をする(その後、PHPとの連携の勉強に移る予定)。

XAMPPにより、コマンドプロンプトで作業する。

リレーショナルデータベースとは(再掲)



はじめに

MySQLモニタに入る。
コマンドプロンプト

>mysql -u root -p
Enter password:[パスワード]
mysql>

使用するデータベースを指定する

mysql>use db1

今日学んだこと

基本となるテーブル
mysql>select * from tb1;
+------+------+------+
| bang | uria | tuki |
+------+------+------+
| a103 |  101 |    4 |
| a102 |   54 |    5 |
| a104 |  181 |    4 |
| a101 |  184 |    4 |
| a103 |   17 |    5 |
| a101 |  300 |    5 |
| a102 |  205 |    6 |
| a104 |   93 |    5 |
| a103 |   12 |    6 |
| a107 |   87 |    6 |
+------+------+------+


グループ化


カラム「bang」のように、同じ番号がいくつか並んでいる場合、それらをグループ化できる。


「select [カラム名] from [テーブル名] group by [グループ化するカラム];」

ex)
mysql>select * from tb1 group by bang;
+------+------+------+
| bang | uria | tuki |
+------+------+------+
| a101 |  184 |    4 |
| a102 |   54 |    5 |
| a103 |  101 |    4 |
| a104 |  181 |    4 |
| a107 |   87 |    6 |
+------+------+------+

抽出されたデータは、カラムbangでは重複しないデータだが、重複するデータの中では任意のデータが選ばれている。

グループごとの数を数える

「count」関数を使う

ex)
mysql>select count(*) from tb1 group by bang;
+----------+
| count(*) |
+----------+
|        2 |
|        2 |
|        3 |
|        2 |
|        1 |
+----------+

わかりにくいので、改変。

ex)
mysql>select bang,count(*) as '件数' from tb1 group by bang;
+------+------+
| bang | 件数 |
+------+------+
| a101 |    2 |
| a102 |    2 |
| a103 |    3 |
| a104 |    2 |
| a107 |    1 |
+------+------+
グループごとの合計を出す

「sum()」関数を使う

ex)カラム「uria」の合計を出してみる
mysql>select bang,sum(uria) as '合計' from tb1 group by bang;
+------+------+
| bang | 合計 |
+------+------+
| a101 |  484 |
| a102 |  259 |
| a103 |  130 |
| a104 |  274 |
| a107 |   87 |
+------+------+
グループごとの平均を出す

avg()」関数を使う

ex)カラム「uria」の平均を出してみる
mysql>select bang,avg(uria) as '平均' from tb1 group by bang;
+------+----------+
| bang | 平均     |
+------+----------+
| a101 | 242.0000 |
| a102 | 129.5000 |
| a103 |  43.3333 |
| a104 | 137.0000 |
| a107 |  87.0000 |
+------+----------+


条件付きグループで表示する


「having」を使う

「select [集計したカラム] from [テーブル名] group by [グループ化するカラム] having 条件;」

ex)合計が200以上のグループだけ表示する
mysql>select bang,sum(uria) from tb1 group by bang having sum(uria)>=200;
+------+-----------+
| bang | sum(uria) |
+------+-----------+
| a101 |       484 |
| a102 |       259 |
| a104 |       274 |
+------+-----------+
ex)以下と比較
mysql>select bang,sum(uria) from tb1 group by bang;
+------+-----------+
| bang | sum(uria) |
+------+-----------+
| a101 |       484 |
| a102 |       259 |
| a103 |       130 |
| a104 |       274 |
| a107 |        87 |
+------+-----------+
抽出してからグループ化する

「where」を使う。

ex)カラム「uria」が50以上のデータを抽出しグループ化して平均を取る
mysql>select bang,avg(uria) from tb1 where uria>=50 group by bang;
+------+-----------+
| bang | avg(uria) |
+------+-----------+
| a101 |  242.0000 |
| a102 |  129.5000 |
| a103 |  101.0000 |
| a104 |  137.0000 |
| a107 |   87.0000 |
+------+-----------+

カラム「bang」で「a103」に該当するカラム「uria」のデータは、「101」「17」「12」ですが、後ろの二つは50以下なので抽出されず、結果として「a103」に対応する「avg(uria)」は「101」となります。

グループ化してから並び替える
ex)bangとavg(uria)を表示するけど、group by bangでグループ化して、order by avg(uria) descで昇順に並べるよ
mysql>select bang,avg(uria) from tb1 group by bang order by avg(uria) desc;
+------+-----------+
| bang | avg(uria) |
+------+-----------+
| a101 |  242.0000 |
| a104 |  137.0000 |
| a102 |  129.5000 |
| a107 |   87.0000 |
| a103 |   43.3333 |
+------+-----------+
並べる順番

「where」
  ↓
「group by」
  ↓
「order by ○○ (desc)」

ex)
mysql>select bang,avg(uria) from tb1 where uria>=50 group by bang order by avg(uria) desc;
+------+-----------+
| bang | avg(uria) |
+------+-----------+
| a101 |  242.0000 |
| a104 |  137.0000 |
| a102 |  129.5000 |
| a103 |  101.0000 |
| a107 |   87.0000 |
+------+-----------+


今回はここまで。

次回は、データの編集から。

おしらせ

つながり合うSNS


http://survive-sns.jp/


メンバー募集中です!


サーバを新たに立て、一新した「サバイブSNS2.0」に、ぜひご加入ください!