reponの忘備録

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

LAMPのお勉強日記 (11)

LAMP環境のお勉強日記

目的

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

経過

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

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

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



はじめに

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

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

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

mysql>use db1

今日学んだこと

複数のテーブルの編集

基本となるテーブル

今回は複数のテーブルを扱うので、基本のテーブルを複数作る。

tb,tb1,tb2,tb3の4つ。

mysql>select * from tb;
+------+------+------+
| 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 |
+------+------+------+
mysql>select * from tb1;
+------+-----------+------+
| bang | nama      | tosi |
+------+-----------+------+
| a101 | sato      |   40 |
| a102 | takahashi |   28 |
| a103 | nakagawa  |   20 |
| a104 | watanabe  |   23 |
| a105 | nishizawa |   35 |
+------+-----------+------+
mysql>select * from tb2;
+------+----------+------+
| bang | nama     | tosi |
+------+----------+------+
| a106 | nakamura |   26 |
| a107 | tanaka   |   24 |
| a108 | suzuki   |   23 |
| a109 | murai    |   25 |
| a110 | yoshida  |   27 |
+------+----------+------+
mysql>select * from tb3;
+------+----------+
| bang | ken      |
+------+----------+
| a101 | tokyo    |
| a102 | saitama  |
| a103 | kanagawa |
| a104 | hokkaido |
| a105 | sizuoka  |
+------+----------+

※コマンド・プロンプトで日本語入力は出来るのですが、データ入力して出力すると文字化けします。

コマンド・プロンプトの問題なのか、MySQLの問題なのか、わからないのでローマ字で進めています。
c:\xampp\mysql\my.cnfの設定変更はきっちりやっています。

複数の抽出結果を合わせて表示する

「select [カラム名1] from [テーブル名1] union select [カラム名2] from [テーブル名2];」

ex)
mysql>select * from tb1 union select * from tb2;
+------+-----------+------+
| bang | nama      | tosi |
+------+-----------+------+
| a101 | sato      |   40 |
| a102 | takahashi |   28 |
| a103 | nakagawa  |   20 |
| a104 | watanabe  |   23 |
| a105 | nishizawa |   35 |
| a106 | nakamura  |   26 |
| a107 | tanaka    |   24 |
| a108 | suzuki    |   23 |
| a109 | murai     |   25 |
| a110 | yoshida   |   27 |
+------+-----------+------+
3つ以上のテーブルから「union」でデータを集める

「select [カラム名1] from [テーブル名1] union select [カラム名2] from [テーブル名2] union select [カラム名3] from [テーブル名3]……;」

条件を付けて複数の抽出結果を合わせて表示する

「select [カラム名1] from [テーブル名1] where [条件1] union select [カラム名2] from [テーブル名2] where [条件2]……;」

ex)tbから「uria」200以上、tb1から「tosi」35以上のデータで、カラム「bang」を集める
mysql>select bang from tb where uria>=200 union select bang from tb1 where tosi>=35;
+------+
| bang |
+------+
| a101 |
| a102 |
| a105 |
+------+
条件を付けて複数の抽出結果を合わせて表示する(重複を許す)

前項では、重複する「a101」が自動的に一つにまとめられていますが、

  • データの数が多くなるとまとめるのに時間がかかる

ので、重複するデータも合わせて表示する方法があります。

「union all」です。

ex)
mysql>select bang from tb where uria>=200 union all select bang from tb1 where tosi>=35;
+------+
| bang |
+------+
| a101 |
| a102 |
| a101 |
| a105 |
+------+
内部結合

「tb」と「tb1」のbangをキーにして、二つのテーブルを結合させます。

ex)主キーをどちらにするかによって変わってくる
mysql>select * from tb join tb1 on tb.bang=tb1.bang;
+------+------+------+------+-----------+------+
| bang | uria | tuki | bang | nama      | tosi |
+------+------+------+------+-----------+------+
| a103 |  101 |    4 | a103 | nakagawa  |   20 |
| a102 |   54 |    5 | a102 | takahashi |   28 |
| a104 |  181 |    4 | a104 | watanabe  |   23 |
| a101 |  184 |    4 | a101 | sato      |   40 |
| a103 |   17 |    5 | a103 | nakagawa  |   20 |
| a101 |  300 |    5 | a101 | sato      |   40 |
| a102 |  205 |    6 | a102 | takahashi |   28 |
| a104 |   93 |    5 | a104 | watanabe  |   23 |
| a103 |   12 |    6 | a103 | nakagawa  |   20 |
+------+------+------+------+-----------+------+
mysql>select * from tb1 join tb on tb.bang=tb1.bang;
+------+-----------+------+------+------+------+
| bang | nama      | tosi | bang | uria | tuki |
+------+-----------+------+------+------+------+
| a103 | nakagawa  |   20 | a103 |  101 |    4 |
| a102 | takahashi |   28 | a102 |   54 |    5 |
| a104 | watanabe  |   23 | a104 |  181 |    4 |
| a101 | sato      |   40 | a101 |  184 |    4 |
| a103 | nakagawa  |   20 | a103 |   17 |    5 |
| a101 | sato      |   40 | a101 |  300 |    5 |
| a102 | takahashi |   28 | a102 |  205 |    6 |
| a104 | watanabe  |   23 | a104 |   93 |    5 |
| a103 | nakagawa  |   20 | a103 |   12 |    6 |
+------+-----------+------+------+------+------+

上記のテーブルからは、どちらも「a107」が消えている。

これは、内部結合だからである。

カラムを選んでテーブルを結合
ex)
mysql>select tb.bang,tb1.nama,tb.uria from tb join tb1 on tb.bang=tb1.bang;
+------+-----------+------+
| bang | nama      | uria |
+------+-----------+------+
| a103 | nakagawa  |  101 |
| a102 | takahashi |   54 |
| a104 | watanabe  |  181 |
| a101 | sato      |  184 |
| a103 | nakagawa  |   17 |
| a101 | sato      |  300 |
| a102 | takahashi |  205 |
| a104 | watanabe  |   93 |
| a103 | nakagawa  |   12 |
+------+-----------+------+
テーブル名にエイリアスを使う

テーブル名が複雑になってくることを考え、エイリアスを使う。

ex)
mysql>select x.bang,y.nama,x.uria from tb as x join tb1 as y on x.bang=y.bang;
+------+-----------+------+
| bang | nama      | uria |
+------+-----------+------+
| a103 | nakagawa  |  101 |
| a102 | takahashi |   54 |
| a104 | watanabe  |  181 |
| a101 | sato      |  184 |
| a103 | nakagawa  |   17 |
| a101 | sato      |  300 |
| a102 | takahashi |  205 |
| a104 | watanabe  |   93 |
| a103 | nakagawa  |   12 |
+------+-----------+------+

非常にすっきりしてわかりやすい。

条件を付けて抽出し、結合する
ex)tbで売上100以上のデータだけを抽出
mysql>select x.bang,y.nama,x.uria from tb as x join tb1 as y on x.bang=y.bang where x.uria>=100;
+------+-----------+------+
| bang | nama      | uria |
+------+-----------+------+
| a103 | nakagawa  |  101 |
| a104 | watanabe  |  181 |
| a101 | sato      |  184 |
| a101 | sato      |  300 |
| a102 | takahashi |  205 |
+------+-----------+------+
さらに複数のテーブルを結合する
ex)
mysql>select x.bang,y.nama,x.uria,z.ken from tb as x join tb1 as y on x.bang=y.bang join tb3 as z on x.bang=z.bang;
+------+-----------+------+----------+
| bang | nama      | uria | ken      |
+------+-----------+------+----------+
| a103 | nakagawa  |  101 | kanagawa |
| a102 | takahashi |   54 | saitama  |
| a104 | watanabe  |  181 | hokkaido |
| a101 | sato      |  184 | tokyo    |
| a103 | nakagawa  |   17 | kanagawa |
| a101 | sato      |  300 | tokyo    |
| a102 | takahashi |  205 | saitama  |
| a104 | watanabe  |   93 | hokkaido |
| a103 | nakagawa  |   12 | kanagawa |
+------+-----------+------+----------+


今回は中途半端だけれどここまで。

次回は外部結合から

おしらせ

つながり合うSNS


http://survive-sns.jp/


メンバー募集中です!


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