sql - 这个 SQL 连接有什么作用?
问题描述
下面的连接是我认为所谓的 theta 连接,非 equi 连接。我是否正确地说 equi 连接适用于匹配的内容,而非 equi 连接适用于不匹配的内容。那么下面的非 equi join 是如何工作的呢?
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMPTBL E, SALGRADE S
WHERE E.SAL
BETWEEN S.LOSAL AND S.HISAL;
解决方案
逗号分隔连接与 ANSI 连接:
逗号分隔的连接已成为过去(根据 1992 年的 SQL 标准,它们已成为冗余),不应再使用。如果表格不相关,我们会将逗号替换为单词CROSS JOIN
以明确意图,即
SELECT e.ename, e.sal, s.grade
FROM emptbl e, salgrade s
是
SELECT e.ename, e.sal, s.grade
FROM emptbl e
CROSS JOIN salgrade s
但是,在您的情况下,您有一个连接条件。
SELECT e.ename, e.sal, s.grade
FROM emptbl e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
是
SELECT e.ename, e.sal, s.grade
FROM emptbl e
INNER JOIN salgrade s OB e.sal BETWEEN s.losal AND s.hisal;
这个连接的作用是:将每条emptbl
记录与salgrade
工资在该salgrade
范围内的所有记录结合起来。这应该只是一行,因为工资等级可能不会重叠。
e.sal BETWEEN s.losal AND s.hisal
也可以写成
e.sal <= s.losal AND e.sal >= s.hisal
例子:
空的
姓名 | 萨尔 ------+----- 约翰 | 1000 简 | 1500
萨尔格莱德
等级 | 失落| 希萨尔 ------+--------+------ 低 | 0 | 800 医学 | 801 | 1200 高 | 1201 | 2000
结果
姓名 | 萨尔 | 年级 ------+------+------ 约翰 | 1000 | med <-- 因为 1000 介于 801 和 1200 之间 简 | 1500 | 高 <-- 因为 1201 和 2000 之间的 1500
Equi 连接与非 Equi 连接:
顺便说一下,非等值连接和等值连接做同样的事情,所以没有必要知道这个词汇表。唯一的区别是 equi join 加入,=
而非 equi join 加入其他比较,例如<=
.
推荐阅读
- swift - 用户移动节点时的 SpriteKit 隧道
- nginx - Next.js - 如何构建大型项目?
- python - 从表格行中的列表中搜索文本,如果找到,则将其提取到新列中
- python - 如何在 Flask 中为与 HTML 一起工作的视频制作 URL?
- python - 等待命令作者的反应来编辑帮助分类页面
- javascript - 将 uint8array 传递给函数
- javascript - 受信任的 Web 应用程序中原生 android 和渐进式 Web 应用程序之间的两种方式的桥梁
- c++ - 我可以在父类中声明一个占位符变量,并在子类中以不同的类型声明它吗?
- android - 实时从后台线程向 UI 线程发送消息
- sql-server - 将 SQL Server 输出推送到 Azure Blob 存储