0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Postgres JOIN体験記

Posted at

はじめに

公式のテーブルがわかりにくいと感じ、自分でテーブルを作成し動作確認を行った結果、公式がわかりやすいということがわかった。という記事です。
今回やるのは、7.2.1.1. 結合テーブルです。

テーブル準備

1つ目のusersテーブル

CREATE TABLE users (
    id INT,
    name VARCHAR(255),
    company_id INT
);

INSERT INTO users (id, name, company_id) VALUES 
(1, 'saito', 1),
(2, 'suzuki', 2),
(3, 'tanaka', 4);

SELECT * FROM users;
 id |  name  | company_id 
----+--------+------------
  1 | saito  |          1
  2 | suzuki |          2
  3 | tanaka |          4

2つ目のcompanysテーブル

CREATE TABLE companys (
    id INT,
    name VARCHAR(255)
);

INSERT INTO companys (id, name) VALUES 
(1, 'JAL'),
(2, 'ANA'),
(3, 'peach');

SELECT * FROM companys;
 id | name  
----+-------
  1 | JAL
  2 | ANA
  3 | peach

JOINしてみる

① CROSS JOIN

SELECT * FROM users CROSS JOIN companys;
 id |  name  | company_id | id | name  
----+--------+------------+----+-------
  1 | saito  |          1 |  1 | JAL
  1 | saito  |          1 |  2 | ANA
  1 | saito  |          1 |  3 | peach
  2 | suzuki |          2 |  1 | JAL
  2 | suzuki |          2 |  2 | ANA
  2 | suzuki |          2 |  3 | peach
  3 | tanaka |          4 |  1 | JAL
  3 | tanaka |          4 |  2 | ANA
  3 | tanaka |          4 |  3 | peach

② JOIN ON

SELECT * FROM users JOIN companys ON users.id = companys.id;
 id |  name  | company_id | id | name  
----+--------+------------+----+-------
  1 | saito  |          1 |  1 | JAL
  2 | suzuki |          2 |  2 | ANA
  3 | tanaka |          4 |  3 | peach

③ NATURAL JOIN

確認できませんでした、、、
idが共通カラムなので、実行できるかと思いましたが、できませんでした。理由は自分が作成した2つのテーブルの共通カラムは、idとnameでした。nameも両方で同じ値のデータ必要でした。

SELECT * FROM users NATURAL INNER JOIN companys;
 id | name | company_id 
----+------+------------
(0 rows)

④ LEFT JOIN ON

SELECT * FROM users  LEFT JOIN companys ON users.id = companys.id;
 id |  name  | company_id | id | name  
----+--------+------------+----+-------
  1 | saito  |          1 |  1 | JAL
  2 | suzuki |          2 |  2 | ANA
  3 | tanaka |          4 |  3 | peach

⑤ LEFT JOIN USING

SELECT * FROM users  LEFT JOIN companys USING(id);
 id |  name  | company_id | name  
----+--------+------------+-------
  1 | saito  |          1 | JAL
  2 | suzuki |          2 | ANA
  3 | tanaka |          4 | peach

⑥ RIGHT JOIN

SELECT * FROM users  RIGHT JOIN companys ON users.id = companys.id;
 id |  name  | company_id | id | name  
----+--------+------------+----+-------
  1 | saito  |          1 |  1 | JAL
  2 | suzuki |          2 |  2 | ANA
  3 | tanaka |          4 |  3 | peach

⑦ FULL JOIN

SELECT * FROM users  FULL JOIN companys ON users.id = companys.id;
 id |  name  | company_id | id | name  
----+--------+------------+----+-------
  1 | saito  |          1 |  1 | JAL
  2 | suzuki |          2 |  2 | ANA
  3 | tanaka |          4 |  3 | peach

感想

公式のテーブルはわかりにくいと考えて自分でテーブル作成しましたが、公式の方が明らかにわかりやすいということがわかりました。
自分で作成したテーブルでは確認できないコマンドもあったので、テーブル名だけ変えるぐらいにして、まずは公式に従った方法がいいですね。それに加え、カラム名は不適切だと記事を書いていて思いました。次はダブらないようにしたいです。

参考

公式↓
https://www.postgresql.jp/docs/9.2/queries-table-expressions.html
大変わかりやすい↓
https://qiita.com/ysda/items/0d473e644409e45965d7
youtubeで↓
https://youtu.be/kHROFydu3JA?si=6DefyD-zpERRvzvP

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?