PostgreSQL innerjoinとleftjoin

テーブルとテストデータ作成
CREATE TABLE companies(
id bigint primary key,
name varchar(50) NOT NULL,
tel varchar(50)
);

CREATE TABLE employees(
id bigint primary key,
company_id bigint,
name varchar(50) NOT NULL,
age integer,
FOREIGN KEY (company_id) references companies(id)
);

INSERT INTO companies(id, name, tel) VALUES
(1, ‘株式会社ほげ’, ’00-0000-0000′),
(2, ‘株式会社ふが’, ’00-0000-1111′),
(3, ‘株式会社ぴよ’, ’00-0000-2222′);

INSERT INTO employees(id, company_id, name, age) VALUES
(1, 1, ‘テスト太郎’, 25),
(2, 1, ‘テスト次郎’, 20),
(3, 2, ‘テスト三郎’, 30),
(4, null, ‘テスト五郎’, 40);

### 内部結合(inner join)
結合条件に一致するレコードだけ表示
testdb=# SELECT
testdb-# e.id AS employee_id,
testdb-# e.name AS employee_name,
testdb-# c.id AS company_id,
testdb-# c.name AS company_name
testdb-# FROM employees e
testdb-# JOIN companies c ON c.id = e.company_id;
employee_id | employee_name | company_id | company_name
————-+—————+————+————–
1 | テスト太郎 | 1 | 株式会社ほげ
2 | テスト次郎 | 1 | 株式会社ほげ
3 | テスト三郎 | 2 | 株式会社ふが

### LEFT JOIN
左外部結合。左テーブルを全て表示し、結合条件に一致しない右テーブルはNULLとして結合
testdb=# SELECT
testdb-# e.id AS employee_id,
testdb-# e.name AS employee_name,
testdb-# c.id AS company_id,
testdb-# c.name AS company_name
testdb-# FROM employees e
testdb-# LEFT JOIN companies c ON c.id = e.company_id;
employee_id | employee_name | company_id | company_name
————-+—————+————+————–
1 | テスト太郎 | 1 | 株式会社ほげ
2 | テスト次郎 | 1 | 株式会社ほげ
3 | テスト三郎 | 2 | 株式会社ふが
4 | テスト五郎 | |

### LIGHT JOIN
testdb=# SELECT
testdb-# e.id AS employee_id,
testdb-# e.name AS employee_name,
testdb-# c.id AS company_id,
testdb-# c.name AS company_name
testdb-# FROM employees e
testdb-# RIGHT JOIN companies c ON c.id = e.company_id;
employee_id | employee_name | company_id | company_name
————-+—————+————+————–
1 | テスト太郎 | 1 | 株式会社ほげ
2 | テスト次郎 | 1 | 株式会社ほげ
3 | テスト三郎 | 2 | 株式会社ふが
| | 3 | 株式会社ぴよ
(4 rows)

なるほど、これは勉強になる。