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

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_nameFROM CustomersWHERE 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.lryc.cn/news/508225.html

相关文章:

  • Linux下学【MySQL】所有常用类型详解( 配实操图 通俗易懂 )
  • Gin-vue-admin(1):环境配置和安装
  • 如何在centos系统上挂载U盘
  • 2024年12月大语言模型最新对比:GPT-4、Claude 3、文心一言等详细评测
  • openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接
  • day16 python(4)——UnitTest
  • Kafka快速扫描
  • python打包时候遇到问题:ImportError: DLL load failed while importing _ufuncs: 找不到指定的模块
  • 【6】期末复习C#第6套
  • 开源轮子 - EasyExcel01(核心api)
  • SpringBoot3+Vue3开发在线考试系统
  • 2. Kafka入门-开发环境准备
  • Halcon中histo_2dim(Operator)算子原理及应用详解
  • TCP 与 UDP
  • ubuntu 安装更新 ollama新版本
  • Numpy基本操作
  • 本地部署webrtc应用怎么把http协议改成https协议?
  • 基于xiaothink对Wanyv-50M模型进行c-eval评估
  • 使用k6进行kafka负载测试
  • Unity A*算法实现+演示
  • 浏览器要求用户确认 Cookies Privacy(隐私相关内容)是基于隐私法规的要求,VUE 实现,html 代码
  • 如何设计高效的商品系统并提升扩展性:从架构到实践的全方位探索
  • 使用计算机创建一个虚拟世界
  • datasets笔记:两种数据集对象
  • 【ETCD】【Linearizable Read OR Serializable Read】ETCD 数据读取:强一致性 vs 高性能,选择最适合的读取模式
  • 【CSS in Depth 2 精译_089】15.2:CSS 过渡特效中的定时函数
  • 不常用命令指南
  • spring mvc | servlet :serviceImpl无法自动装配 UserMapper
  • STM32 HAL库之串口接收不定长字符
  • Pyqt6的tableWidget填充数据