テーブルをつなぐ

INPUT · スライド

片方の表を残してつなぐ

01 / 05

結合で消える行がある

JOIN が返すのは鍵が一致した行だけだった。だから注文したことのない会員は、結果から消えてしまう。

下のクエリで名前を重複なしに出しても4人しか出てこない。members には5人いるのに、ののかがいないんだ。

SELECT DISTINCT members.name  FROM members  JOIN orders  ON members.id = orders.member_id  ORDER BY members.name;

実行結果

いつき
かえで
すずな
みなと

02 / 05

消えると困ることがある

「まだ一度も買っていない会員に案内を出したい」——これは消えた行にこそ答えがある問いだよね。

注文がない会員も表に残したままつなぎたい。そのための書き方が LEFT JOIN だよ。

03 / 05

`LEFT JOIN` は左を残す

JOINLEFT JOIN に変えるだけ。FROM に書いた左側の表の行を全部残して、右側は相手がいれば足す、いなければ空のままにする。

下の結果はさっきより1行多い10行。いちばん下にののかが残っているよ。

SELECT members.name,  orders.quantity, members.city  FROM members  LEFT JOIN orders  ON members.id = orders.member_id  ORDER BY members.id, orders.id;

実行結果

みなと | 2 | あおば市
みなと | 4 | あおば市
みなと | 6 | あおば市
すずな | 4 | ひなた町
すずな | 3 | ひなた町
かえで | 1 | あおば市
かえで | 2 | あおば市
いつき | 3 | みずうみ市
いつき | 2 | みずうみ市
ののか |  | ひなた町

04 / 05

空いたところは `NULL`

ののかの quantity が空いていたよね。あれが NULL(値が無い)だよ。相手の行がないので、右側の列は埋められないんだ。

ということは IS NULL で「相手がいなかった行」を探せる。第1章で覚えた IS NULL が、ここで効いてくるよ。

SELECT members.name  FROM members  LEFT JOIN orders  ON members.id = orders.member_id  WHERE orders.id IS NULL;

実行結果

ののか

05 / 05

商品の側でも同じ

同じやり方で「一度も注文されていない商品」も出せる。左に items を置いて LEFT JOIN orders すればいいよ。

売れ残りを見つける、案内が届いていない人を見つける——無いものをさがすのが LEFT JOIN のいちばんの出番だよ。ここから書いてみよう。

SELECT items.name  FROM items  LEFT JOIN orders  ON items.id = orders.item_id  WHERE orders.id IS NULL;

実行結果

つきよの花びん