此SQL连接的作用是什么?

时间:2019-02-20 10:11:35

标签: sql

下面的联接是我认为的theta联接,即非等联接。我说的对吗?对等联接适用于匹配项,非等联接适用于不匹配项。那么以下非等额联接如何工作?

SELECT E.ENAME, E.SAL, S.GRADE 
FROM EMPTBL E, SALGRADE S
WHERE E.SAL
BETWEEN S.LOSAL AND S.HISAL;

2 个答案:

答案 0 :(得分:1)

避免逗号分隔的连接使用现代显式连接

SELECT E.ENAME, E.SAL, S.GRADE 
FROM EMPTBL E join  SALGRADE S
on E.SAL>=S.LOSAL and E.SAL<=S.HISAL

答案 1 :(得分:1)

以逗号分隔的联接与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

也可以写为

=

示例:

清空

ename | sal
------+-----
John  | 1000
Jane  | 1500

盐分

grade | losal | hisal
------+-------+------
low   |     0 |   800
med   |   801 |  1200
high  |  1201 |  2000

结果

ename | sal  | grade
------+------+------
John  | 1000 | med      <-- because 1000 BETWEEN  801 AND 1200
Jane  | 1500 | high     <-- because 1500 BETWEEN 1201 AND 2000

Equi联接与非Equi联接:

顺便说一句,非等额联接的功能与等额联接的功能相同,因此不必了解此词汇表。唯一的区别是,等式联接在<=上联接,非等联接在其他比较中联接,例如self.initial_data