文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SQL 语句中 LEFT JOIN 后用 ON 还是 WHERE:深入解析与实例

2024-11-29 18:19

关注

1. LEFT JOIN 与 ON

ON 子句用于指定 LEFT JOIN 的连接条件。当使用 ON 子句时,即使在右表中没有匹配的记录,左表的所有记录也会被返回,右表的字段在这种情况下会填充 NULL。

示例代码

假设我们有两个表:employees(员工表)和 departments(部门表)。

-- 创建示例表
CREATE TABLE employees (
    id INT,
    name VARCHAR(100),
    department_id INT
);

CREATE TABLE departments (
    id INT,
    department_name VARCHAR(100)
);

-- 插入示例数据
INSERT INTO employees (id, name, department_id) VALUES
(1, 'Alice', 1),
(2, 'Bob', 2),
(3, 'Charlie', NULL);

INSERT INTO departments (id, department_name) VALUES
(1, 'HR'),
(2, 'Engineering');

现在我们想要查询所有员工及其对应的部门名称,即使某些员工没有分配部门。

-- 使用 LEFT JOIN 和 ON 子句
SELECT 
    e.id,
    e.name,
    d.department_name
FROM 
    employees e
LEFT JOIN 
    departments d
ON 
    e.department_id = d.id;

输出结果:

id

name

department_name

1

Alice

HR

2

Bob

Engineering

3

Charlie

NULL

2. LEFT JOIN 与 WHERE

WHERE 子句用于过滤查询结果。当在 LEFT JOIN 后使用 WHERE 子句时,它会过滤掉所有不满足条件的记录,包括因为 LEFT JOIN 而产生的 NULL 值。

示例代码

如果我们错误地将连接条件放在 WHERE 子句中:

-- 使用 LEFT JOIN 和错误的 WHERE 子句
SELECT 
    e.id,
    e.name,
    d.department_name
FROM 
    employees e
LEFT JOIN 
    departments d
ON 
    1=1  -- 这里故意使用一个总是为真的条件
WHERE 
    e.department_id = d.id;

输出结果:

id

name

department_name

1

Alice

HR

2

Bob

Engineering

注意到 Charlie 被排除了,因为 WHERE 子句过滤掉了 department_id 不匹配的记录,包括那些因为 LEFT JOIN 本应返回 NULL 的记录。

3. 正确使用 ON 和 WHERE

场景一:过滤连接后的结果

如果我们想要查询所有员工及其部门名称,但只显示那些部门名称不为空的记录,可以这样做:

-- 使用 LEFT JOIN 和正确的 WHERE 子句
SELECT 
    e.id,
    e.name,
    d.department_name
FROM 
    employees e
LEFT JOIN 
    departments d
ON 
    e.department_id = d.id
WHERE 
    d.department_name IS NOT NULL;

输出结果:

id

name

department_name

1

Alice

HR

2

Bob

Engineering

场景二:额外的过滤条件

如果我们想要查询所有在“Engineering”部门的员工,同时保留其他员工的记录但部门名称为空,可以这样做:

-- 使用 LEFT JOIN、ON 和额外的过滤条件
SELECT 
    e.id,
    e.name,
    d.department_name
FROM 
    employees e
LEFT JOIN 
    departments d
ON 
    e.department_id = d.id
AND 
    d.department_name = 'Engineering';  -- 这个条件放在 ON 中

输出结果:

id

name

department_name

1

Alice

NULL

2

Bob

Engineering

3

Charlie

NULL

注意到 Alice 和 Charlie 仍然保留在结果中,但他们的部门名称显示为 NULL,因为他们不属于“Engineering”部门。

结论

在 LEFT JOIN 中,ON 和 WHERE 子句的使用有显著区别。ON 子句用于指定连接条件,而 WHERE 子句用于过滤结果。将连接条件错误地放在 WHERE 子句中会导致 LEFT JOIN 的行为类似于 INNER JOIN,从而失去左表中的一些记录。正确理解和使用 ON 和 WHERE 子句对于获得预期的查询结果至关重要。

来源:程序员编程日记内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯