建设一个小说网站,哪个网站做调查赚钱多,app模板素材下载免费,ui设计师面试问题大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型#xff0c;但还有一些连接类型是基于关系代数运算符的#xff0c;在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型#xff1a;半连接#xff08;Semi …大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 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 中执行我们的查询可以看到它与预期的一样 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 中执行的上述查询和其结果 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