加入甲骨文

时间:2019-06-06 19:48:30

标签: sql oracle

如果我只写此查询-

 SELECT * FROM AA,BB WHERE AA.ID = BB.ID 

那么它将是什么样的联接。如果我们应用任何类型的联接,则需要指定内部联接,外部联接,交叉联接。那是什么样的联接?

内部联接和交叉联接之​​间的实际区别是什么?

3 个答案:

答案 0 :(得分:1)

您的查询代表内部联接。例如,在Scott的示例架构中,它将联接EMP(这是常见列)上DEPTDEPTNO表中的行:

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密集资源