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

SQL 干货 | SQL 半连接

大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型,但还有一些连接类型是基于关系代数运算符的,在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型:半连接(Semi Join)。下周我们将讨论与之类似的反连接。为了更好地了解这些连接类型是如何工作的,我们将在 Navicat Premium Lite 17 中对 PostgreSQL dvdrental 数据库 执行一些 SELECT 查询。这是一个基于 MySQL Sakila 样本数据库的免费数据库。

半连接的解释

试想一下,ANSI SQL 支持半连接。如果支持的话,其语法可能与 Cloudera Impala 的语法扩展类似,即左半连接和右半连接。于此相关的,下面是一个使用半连接的查询:

SELECT *
FROM actor
LEFT SEMI JOIN film_actor USING (actor_id)

上述查询将返回所有出演过电影的演员。但问题是,我们不希望结果中出现任何电影,也不希望同一演员出现在多行中。我们只希望每个演员在结果中出现一次(或零次)。“Semi”一词来源于拉丁语,在英语中翻译为“half”。因此,我们的查询只实现了“半连接”,在这种情况下是左半边。在 SQL 中,我们可以使用两种语法来完成半连接:EXISTS 和 IN。

使用 EXISTS 实现半连接

下面是使用 EXISTS 进行半连接的等价方法:

SELECT *
FROM actor a
WHERE EXISTS (SELECT * FROM film_actor faWHERE a.actor_id = fa.actor_id
)

如果我们在 Navicat Premium Lite 17 中执行我们的查询,可以看到它与预期的一样:

semi_join_exists (147K)

EXISTS 操作符不使用连接,而是检查 film_actor 表中是否存在一个演员的一条或多条记录。 由于使用了 WHERE 子句,大多数数据库都能识别出我们执行的是 SEMI JOIN 而不是普通的 EXISTS()。

使用 IN 实现半连接

IN 和 EXISTS 是完全等价的 SEMI JOIN 模仿,因此在大多数数据库中,下面的查询会产生与前面的 EXISTS 查询完全相同的结果:

SELECT *
FROM actor
WHERE actor_id IN (SELECT actor_id FROM film_actor
)

下面是在 Navicat Premium Lite 17 中执行的上述查询和其结果:

semi_join_in (157K)

EXISTS 被认为是功能更强大的语法(尽管它有些繁杂)。

结语

在今天的博客中,我们学习了如何使用 ANSI SQL 语法模拟半连接。 除了在“正确性”方面是最佳解决方案外,使用“半”连接(SEMI)而不是内连接(INNER JOIN)在性能上也有一些好处,因为数据库可以在找到第一个匹配项后立即停止寻找匹配项。

是否有兴趣试用下 Navicat Premium Lite 17?你可以下载它进行 为期 14 天的全功能免费试用。 它适用于 Windows、macOS 和 Linux 操作系统。

Navicat 17 最新资讯 & 技术干货

- Navicat 17 体验官火热招募中

- Navicat- 17 新特性 | 用户界面再升级

- Navicat 17 新特性 | 模型设计创新与优化

- Navicat 17 新特性 | 查询与配置

- Navicat 17 新特性 | Navicat BI 功能革新升级

- Navicat 17 新特性 | 原生支持国产 Linux ARM 平台以及银河麒麟与统信操作系统

- 聚焦 Navicat 17 新特性 | 数据字典提升数据结构清晰度

- Navicat 17 新增 PolarDB 与 Garnet 数据库

- Navicat 17 新特性 | 聚焦 MongoDB

- Navicat 17 新特性 | 新增 Redis 哨兵部署模式

- 免费版 Navicat Premium Lite

http://www.lryc.cn/news/468833.html

相关文章:

  • 洛谷 P1226:【模板】快速幂
  • nginx常规操作
  • Docker镜像不能访问
  • TCP simultaneous open测试
  • Spring 配置文件动态读取pom.xml中的属性
  • Konva 组,层级
  • vue图片加载失败的图片
  • 终止,半成收入来自海外,收入可持续性被质疑
  • 日常记录,使用springboot,vue2,easyexcel使实现字段的匹配导入
  • Unable to open nested entry ‘********.jar‘ 问题解决
  • 反编译华为-研究功耗联网监控日志
  • 线程池——Java
  • java 17天 TreeSet以及Collections
  • JavaScript 第27章:构建工具与自动化
  • Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题
  • 如何实现网页上的闪烁效果
  • 事件总线—Event Bus 使用及讲解
  • 信息安全工程师(67)网络流量清洗技术与应用
  • 【项目】论坛系统测试
  • XJ02、消费金融|消费金融业务模式中的主要主体
  • 基于神经网络的农业病虫害损失预测
  • 【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO
  • Web应用框架-Django应用基础
  • qt QMainWindow详解
  • 第二单元历年真题整理
  • Ubuntu下载protobuf
  • 【算法优化】混合策略改进的蝴蝶优化算法
  • 什么是标准差?详解
  • C++20中头文件syncstream的使用
  • 判断特定时间点开仓的函数(编程技巧)