[PostgreSQL] JOIN 的类型

作为备忘录,有时会纠结使用哪个选项。
进行验证时使用的Postgres版本是12.7。

前提 tí)

使用以下表定义和数据进行验证。

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 public.companies(id, name, tel)
VALUES 
    (1, '株式会社ほげ', '00-0000-0000'),
    (2, '株式会社ふが', '00-0000-1111'),
    (3, '株式会社ぴよ', '00-0000-2222');


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

(内部)连接

只显示符合联接条件(ON)的记录。

SELECT 
    e.id AS employee_id, 
    e.name AS employee_name, 
    c.id AS company_id, 
    c.name AS company_name
FROM employees e
JOIN companies c ON c.id = e.company_id

结果 –

employee_idemployee_namecompany_idcompany_name1テスト太郎1株式会社ほげ2テスト次郎1株式会社ほげ3テスト三郎2株式会社ふが

左(外)连接

左外部結合意味著,会显示所有左表(FROM指定的表格),
对于不能匹配到結合条件的右表(JOIN指定的表格)会以NULL的形式进行結合。

SELECT 
    e.id AS employee_id, 
    e.name AS employee_name, 
    c.id AS company_id, 
    c.name AS company_name
FROM employees e
LEFT JOIN companies c ON c.id = e.company_id

结果

employee_idemployee_namecompany_idcompany_name1テスト太郎1株式会社ほげ2テスト次郎1株式会社ほげ3テスト三郎2株式会社ふが4テスト五郎

右外连接

右外部結合的意思是将右表(通过JOIN指定的表)的所有记录显示出来,并且将不满足连接条件的左表(通过FROM指定的表)设置为NULL进行连接。

SELECT 
    e.id AS employee_id, 
    e.name AS employee_name, 
    c.id AS company_id, 
    c.name AS company_name
FROM companies c
RIGHT JOIN employees e ON e.company_id = c.id

结果

LEFT JOIN的中文意思是「左联结」。

全(外)连接

完全外部联接。
将左联接和右联接的结果合并在一起。

SELECT 
    e.id AS employee_id, 
    e.name AS employee_name, 
    c.id AS company_id, 
    c.name AS company_name
FROM employees e
FULL JOIN companies c ON c.id = e.company_id

结果 (jié guǒ)

employee_idemployee_namecompany_idcompany_name1テスト太郎1株式会社ほげ2テスト次郎1株式会社ほげ3テスト三郎2株式会社ふが4テスト五郎

3株式会社ぴよ

笛卡尔积

提取两个表的所有记录,并显示所有组合。

SELECT 
    e.id AS employee_id, 
    e.name AS employee_name, 
    c.id AS company_id, 
    c.name AS company_name
FROM employees e
CROSS JOIN companies c
ORDER BY e.id

结果 (jié guǒ)

employee_idemployee_namecompany_idcompany_name1テスト太郎1株式会社ほげ1テスト太郎2株式会社ふが1テスト太郎3株式会社ぴよ2テスト次郎1株式会社ほげ2テスト次郎2株式会社ふが2テスト次郎3株式会社ぴよ…………

以下为参照:

依照
根据
按照
参考

    • PostgreSQL 12.4文書 7.2. テーブル式

 

    「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
广告
将在 10 秒后关闭
bannerAds