湯LOG

主に自分用のメモ

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 を使います。

Subquery

SELECT "フィールド1" FROM "テーブル1" WHERE "フィールド2" [比較演算子]
(SELECT "フィールド1" FROM "テーブル2" WHERE "条件");

WHERE 句又は HAVING 句にもう一つのSQL文を挿入すると、テーブルの結合や他のテーブルの情報の抽出が可能になります。(Subqueryという)
今回のテーブルではいい感じのSQL文が作れなそうなので例は割愛します、、


以上で、自分が重要だと感じたMySQLコマンドの紹介を終わります。