当前位置: 首页 > article >正文

SQL 查询方式比较:子查询与自连接

在 SQL 中,子查询和自连接是两种常见的查询方式,它们的功能虽然可以相同,但实现的方式不同。本文通过具体示例,深入探讨这两种查询方式,并配合数据展示,帮助大家理解它们的使用场景和差异。

数据示例

假设我们有以下的 Customers 表,更新后的数据如下:

cust_id

cust_name

cust_contact

1

Alice

123-456-7890

2

Bob

234-567-8901

3

Charlie

345-678-9012

4

Alice

456-789-0123

5

Jim Jones

567-890-1234

6

Jim Jones

678-901-2345

7

Alice

678-901-2345

在这个表中,cust_name 表示顾客的名字,cust_contact 表示顾客的联系电话。

查询目标

我们要找出所有与顾客 "Jim Jones" 同名的其他顾客信息,即找出名字为 "Jim Jones" 的所有记录。

1. 使用子查询

SELECT cust_id, cust_name, cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name
                   FROM Customers
                   WHERE cust_contact = '567-890-1234');

  • 执行步骤
    • 内层子查询:SELECT cust_name FROM Customers WHERE cust_contact = '567-890-1234' 返回 cust_name 为 "Jim Jones"。
    • 外层查询:通过 cust_name = 'Jim Jones' 来查找所有名字为 "Jim Jones" 的顾客记录。
  • 输出结果

cust_id

cust_name

cust_contact

5

Jim Jones

567-890-1234

6

Jim Jones

678-901-2345

查询结果返回了两条记录,分别是 cust_id = 5 和 cust_id = 6。

2. 使用自连接

SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = '567-890-1234';

  • 执行步骤
    • c1 和 c2 都是 Customers 表的别名。
    • 通过 c1.cust_name = c2.cust_name 确保名字相同。
    • 通过 c2.cust_contact = '567-890-1234' 找到 cust_contact 为 '567-890-1234' 的顾客(即 "Jim Jones")。
    • 返回所有名字为 "Jim Jones" 的顾客记录。
  • 输出结果

cust_id

cust_name

cust_contact

5

Jim Jones

567-890-1234

6

Jim Jones

678-901-2345

同样地,查询结果返回了两条记录,分别是 cust_id = 5 和 cust_id = 6。

3. 子查询与自连接的比较

  • 子查询:使用子查询时,内层查询先找出 "Jim Jones" 的名字,然后外层查询通过这个名字查找所有相同名字的顾客。适合结构简单的查询。
  • 自连接:使用自连接时,通过将同一个表连接到自己,可以更灵活地进行数据比较和匹配。适合需要在同一表中查找多条相关数据的场景。

结论

无论是使用子查询还是自连接,都能够得到相同的结果,且 Jim Jones 有两条记录。通过这个案例,我们可以看出:

  • 子查询 更加简洁,适合查询简单的单一条件。
  • 自连接 更适合处理复杂的关系,尤其是同一表中的多条记录之间的比较。

在实际应用中,可以根据查询的复杂度和性能需求选择合适的方式。


http://www.kler.cn/a/444440.html

相关文章:

  • LabVIEW与PLC点位控制及OPC通讯
  • 如何处理对象的状态变化?如何实现工厂模式?
  • 如何实现一套完整的CI/CD?
  • 当我用影刀AI Power做了一个旅游攻略小助手
  • 【Javaweb】第一篇上,什么是web?
  • 密码生成器:随机密码在线生成,保障您的数字安全
  • Unity3D实现迷宫Game(第一人称视角)
  • 从零开始学TiDB(6)深入学习Placement Driver(PD)
  • XXE靶场
  • 无人预见的人工智能创业大难题
  • 【第九节】Git 服务器搭建
  • ExcelVBA编程输出ColorIndex与对应颜色色谱
  • 在 Spring Boot 3 中实现基于角色的访问控制
  • 每天40分玩转Django:实操博客应用
  • 基于Matlab实现三维地球模型(源码)
  • 【Python】使用Selenium 操作浏览器 自动化测试 记录
  • ECharts柱状图-柱图32,附视频讲解与代码下载
  • 电商数据API接口的未来趋势:智能化与自动化
  • Redis篇-16--持久化篇(RDB,AOF,混合持久化,最佳策略)
  • 【java】规则引擎