首页 > 解决方案 > 这个 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;

标签: sql

解决方案


逗号分隔连接与 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 加入其他比较,例如<=.


推荐阅读