如果我只写此查询-
SELECT * FROM AA,BB WHERE AA.ID = BB.ID
那么它将是什么样的联接。如果我们应用任何类型的联接,则需要指定内部联接,外部联接,交叉联接。那是什么样的联接?
内部联接和交叉联接之间的实际区别是什么?
答案 0 :(得分:1)
您的查询代表内部联接。例如,在Scott的示例架构中,它将联接EMP
(这是常见列)上DEPT
和DEPTNO
表中的行:
SQL> select count(*)
2 from emp e inner join dept d on e.deptno = d.deptno;
COUNT(*)
----------
14
SQL>
(您可以省略inner
关键字)。
您问内部联接和交叉联接有什么区别;交叉联接表示笛卡尔乘积,这意味着结果将是第一个表中的所有行对与第二个表中的所有行对:
SQL> select count(*)
2 from emp e cross join dept d;
COUNT(*)
----------
56
SQL>
使用“您的” 旧语法,即没有WHERE
子句的联接:
SQL> select count(*)
2 from emp e, dept d;
COUNT(*)
----------
56
SQL>
外部联接将采用另一个表中没有“成对”的行。在斯科特的模式中,由于没有员工在DEPT表中位于部门40中,所以:
SQL> select count(*)
2 from emp e right outer join dept d on e.deptno = d.deptno;
COUNT(*)
----------
15
SQL>
您可能仍然会在旧的Oracle外部联接运算符((+)
)上看到
SQL> select count(*)
2 from emp e, dept d
3 where e.deptno (+) = d.deptno;
COUNT(*)
----------
15
SQL>
基本上,您应该切换到现代联接。有关连接的文档的更多信息,请访问:https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries006.htm#SQLRF52331(11g版本;找到与您的数据库版本相关的版本,尽管在最新版本中不应该有 revolutionary )。
答案 1 :(得分:1)
您问: 如果我只写此查询-
SELECT * FROM AA,BB WHERE AA.ID = BB.ID
那么它将是什么样的联接?
这是使用ANSI-92以前的语法的INNER JOIN。
如果应用任何类型的联接,则需要指定内部联接,外部联接,交叉联接。
仅当使用当前的ANSI连接语法(应在2019年使用)时。
那是什么样的联接?
真的,这是一个交叉联接,它根据where子句消除了记录,使其表现得像内部联接。消除where子句,即可将AA中的每条记录获取到BB中的每条记录。
“内部联接”和“交叉联接”之间的实际区别是什么? >
- 内部联接仅返回在两个表中都存在并相关的记录
- 交叉连接将一个表中的每个记录与另一个表中的每个记录相关。
- 以两个表(A,B,C)(A,B,D)为例
- INNER JOIN将返回集合{A.A,B.B}(2)
- 交叉连接将返回{A.A,A.B,A.D,B.A,B.B,B.D,C.A,C.B,C.D}(9)
答案 2 :(得分:0)
您似乎不太了解各种类型的联接。总体而言,共有5种不同的联接类型:INNER,LEFT OUTER,RIGHT OUTER,FULL OUTER,CROSS。我将使用这两个表为您展示所有5个示例 表AA和BB仅具有字段ID。表AA将具有“ A”和“ B”作为ID值。表BB的ID值将为“ B”,“ C”和“ D”。
对于INNER JOIN,仅包括具有匹配值的那些行。因此,AA和BB的INNER联合将是: 'B','B'
对于LEFT OUTER JOIN,返回左表中的每一行,对于右表中没有匹配值的行,返回NULL。这样我们得到: 'A',NULL 'B','B'
对于RIGHT OUTER JOIN,将返回右表中的每一行,对于左表中没有匹配值的行,将返回NULL。这样我们得到: 'B','B' NULL,'C' NULL,'D'
对于FULL OUTER JOIN,返回两个表中的每一行。并且两个表中的缺失值均为NULL。这样我们得到: 'A',NULL 'B','B' NULL,'C' NULL,'D'
最后,对于CROSS JOIN,将返回每个表中的每一行以及另一个表中的每一行。这样我们得到: 'A','B' 'A','C' '广告' 'B','B' '公元前' 'B','D'
对于您给出的示例SQL语句,您将返回一个INNER JOIN。至于INNER JOIN和CROSS JOIN之间的区别,上面的示例应该说明了这些区别,但是对于INNER JOIN,您正在检查最小的行数;对于CROSS JOIN,您正在检查最大的行数。行。通常,如果您检查SQL查询计划并发现计划中使用了CROSS JOIN,那么您的SQL就会出错,因为交叉联接往往会占用大量处理器和I / O密集资源