LAMPのお勉強日記 (11)
LAMP環境のお勉強日記
承前
上記エントリに呼応して、自分を「人体実験」することにした。
目的
- 自分が何をやったのか記録する
- 自分が何を出来るのか公開する
はじめに
>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 | +------+-----------+------+----------+
今回は中途半端だけれどここまで。
次回は外部結合から