概要
アウトプット用に、学習した内容を紹介していきます。
本日はMySQLでLEFT JOINを使ってみます。
環境
Mac OS Mojave 10.14.6
MySQL 5.7.28
表の結合
以下の二つの表がデータベースに登録されており、これを結合してユーザーが投稿した内容を表示したいとします。
userテーブル
| id | name | gender | age |
|---|---|---|---|
| 1 | john | m | 18 |
| 2 | paul | m | 20 |
| 3 | alice | f | 15 |
| 4 | dabid | m | 17 |
postsテーブル
| id | user_id | content |
|---|---|---|
| 1 | 1 | Hello |
| 2 | 1 | World |
| 3 | 2 | I'm Paul. |
| 4 | 4 | 😀 |
| 5 | 5 | 😂 |
posts表の全てのcontentと、それに対応したusers表のnameが欲しいカラムです。
この時、以下のSELECT文による左外部結合を用いることで欲しい結果が得られます。
mysql> SELECT name,content
-> FROM posts
-> LEFT JOIN users
-> ON posts.user_id = users.id;
+-------+-----------+
| name | content |
+-------+-----------+
| john | Hello |
| john | World |
| paul | I'm Paul. |
| dabid | 😀 |
| NULL | 😂 |
+-------+-----------+
5 rows in set (0.00 sec)
無事にnameと、それに対応するcontentが表示されました。また'😂'に対応するnameがusers側に存在しないため、nameがNULLになっています。
ちなみに上記の表をINSERTで作成しようとすると、posts表・contentカラムに登場してくるシングルクォーテーション、そして絵文字で、それぞれエラーを吐いてしまう可能性があります。
シングルクォーテーションはエスケープ、絵文字は文字コードをutf8からutf8mb4に変更することで対応が可能ですので、気になった方はぜひ調べてみてください。