SQL:如何正确连接表?

Posted

技术标签:

【中文标题】SQL:如何正确连接表?【英文标题】:SQL: How to join tables right? 【发布时间】:2016-07-05 15:53:11 【问题描述】:

假设我有 3 张桌子:

CREATE TABLE animals 
(
    animal_id   INT PRIMARY KEY,
    animal_name VARCHAR(100)
);

CREATE TABLE zoos 
(
     zoo_id   INT PRIMARY KEY,
     zoo_name VARCHAR(100)
);

CREATE TABLE zoo_has_animals 
(
     zoo_id    INT,
     animal_id INT
);

我需要弄清所有空荡荡的动物园。我尝试使用下一个脚本加入他们:

SELECT zoos.zoo_name
FROM zoos
LEFT JOIN zoo_has_animals ON zoos.zoo_id = zoo_has_animals.zoo_id;

但它返回所有非空动物园而不是所需的空动物园。我做错了什么?

【问题讨论】:

这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。 你想要一个 OUTER LEFT JOIN。我总是参考this diagram,希望对您有所帮助。 @marc_s 这是给MySQL的。 无论您使用什么平台,都可以查找IS NULL 的概念。 @Aaron 他已经在使用LEFT JOIN... 【参考方案1】:

根本不需要JOIN

SELECT z.zoo_name
FROM zoos as z
WHERE NOT EXISTS(SELECT 1 FROM zoo_has_animals
                 WHERE zoo_id = z.zoo_id);

JOIN:

SELECT z.zoo_name
FROM zoos as z
LEFT JOIN zoo_has_animals as h
     ON z.zoo_id = h.zoo_id 
WHERE h.zoo_id IS NULL;

【讨论】:

我明白了,但是可以通过 JOIN 来做到这一点吗? @Alex 当然,答案是在 cmets 上给出的。无论如何,用它的一个版本更新了我的答案

以上是关于SQL:如何正确连接表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个表之间创建正确的联接?

从表内连接中删除 - ORA-00933:SQL 命令未正确结束

SQL 命令未正确结束尝试使用查询连接 3 个表

如何编写两个表的正确左连接?

如何在 Sqlalchemy 中正确使用 SQL 连接/子查询

gorm / go 如何正确连接两个表?