SQL初心者のおぼえがき(4)
以下の記事の続きです。yuzatakujp1013.hatenablog.com
yuzatakujp1013.hatenablog.com
yuzatakujp1013.hatenablog.com
4回にわたってMySQLの基本的なコマンドを見ていきましたが、おそらく今回で最後となります。
新しいテーブルの作成
これまで扱ってきたテーブルに加え、postsテーブルを新たに作成します。
mysql> create table posts ( -> id int not null primary key auto_increment, -> user_id int not null, -> title varchar(255), -> body text, -> created datetime -> );
mysql> insert into posts(user_id, title, body, created) values -> (1, 'title-1 by taguchi', 'body-1', '2012-05-11 14:00:00'), -> (1, 'title-2 by taguchi', 'body-2', '2012-05-11 12:00:00'), -> (2, 'title-3 by suzuki', 'body-3', '2012-05-11 13:00:00'), -> (4, 'title-4 by kimura', 'body-4', '2012-05-11 10:00:00'), -> (4, 'title-5 by kimura', 'body-5', '2012-05-11 09:00:00');
複数のテーブルの操作
JOIN
複数のテーブルをまたがる場合、少し書き方がめんどうになってきます。
SELECT "テーブル名1"."フィールド名1" , "テーブル名2"."フィールド名2" from "テーブル名1","テーブル名2"
これだけだとちょっとわかりづらいので例を見てみましょう。
例えば、blog_usersテーブルのnameと、postsテーブルのtitleを紐付けて表示したい場合
mysql> select blog_users.name,posts.title from blog_users,posts where blog_users.id = posts.user_id; +---------+--------------------+ | name | title | +---------+--------------------+ | taguchi | title-1 by taguchi | | taguchi | title-2 by taguchi | | suzuki | title-3 by suzuki | | kimura | title-4 by kimura | | kimura | title-5 by kimura | +---------+--------------------+
where文では、blog_usersテーブルのユーザIDとpostsテーブルのIDが等しいものを表示するよう条件を指定しています。
このように、複数のテーブルのデータを結合することを一般にJOINといいます。
UNION
次に、二つのSQL文の結果を結合するコマンドを見ていきます。
これにはUNION文を使います
[SQL文1] UNION [SQL文2]
mysql> select created from blog_users union select created from posts; +---------------------+ | created | +---------------------+ | 2015-05-11 10:00:00 | | 2015-06-21 20:00:00 | | 2015-06-28 15:00:00 | | 2015-06-29 16:00:00 | | 2012-05-11 14:00:00 | | 2012-05-11 12:00:00 | | 2012-05-11 13:00:00 | | 2012-05-11 10:00:00 | | 2012-05-11 09:00:00 | +---------------------+
UNION文はJOINと多少類似しますが、UNIONでは同じデータの種類に対して使われます。
また、UNIONは重複した値は一つにまとめるようになっています。(これはDISTINCT文に近い)
重複を許し、条件に一致するデータを表示したいときは UNION ALL を使います。