这两个查询的差异
Differences in these 2 query
这两个查询是否不同?我在 Oracle SQL 中得到不同的结果,你能解释一下差异吗?
***First Query***
SELECT *
FROM
TABLE1,
TABLE2
WHERE TABLE1.COL_ID = TABLE2.COL_ID
AND TABLE1.COL1 = 'ABC'
AND TABLE2.COL1 = 'ABC'
AND TABLE1.COL2 = 2015
AND TABLE1.COL3 = 'X';
***Second Query***
SELECT *
FROM
TABLE1,
TABLE2,
TABLE3
WHERE TABLE1.COL_ID = TABLE2.COL_ID
AND TABLE1.COL1 = 'ABC'
AND TABLE2.COL1 = 'ABC'
AND TABLE1.COL2 = 2015
AND TABLE1.COL3 = 'X';
是的,SQL 处理器假定您暗示 JOIN
所有三个 table:table1,table2,table3
您不需要明确说明 join
子句,如果您不这样做,SQL 引擎会处理它。
当您使用逗号分隔两个(或更多)table 名称时,您想要的是笛卡尔积。 'left' table 的每一行将 'matched' 与右侧 table.
的每一行 'matched' (连接)
现在,如果您在 where 子句中写一些东西,就像在此 'concatenation' 上设置一个条件,告诉 'concatenate' 哪些行与哪些行。
这实际上是 "joining" 行 :),因此 join 关键字有助于提供更易读的语法,并且更容易理解您 'indeed' 想要加入一些共同的价值。
假设您进行以下查询:
Select * from
myTable1 ,myTable2
您将得到(myTable1 行数)x(myTable2 行数),因为如果没有连接条件,您会将第一个 table 中的每一行与第二个 table 中的每一行组合起来,这称为笛卡尔产品,连接是 cross join.
在您的情况下,第一个查询包含 inner join,因为使用了 WHERE TABLE1.COL_ID = TABLE2.COL_ID
,在第二个查询中,第一个连接的结果与 table TABLE3
.
这两个查询是否不同?我在 Oracle SQL 中得到不同的结果,你能解释一下差异吗?
***First Query***
SELECT *
FROM
TABLE1,
TABLE2
WHERE TABLE1.COL_ID = TABLE2.COL_ID
AND TABLE1.COL1 = 'ABC'
AND TABLE2.COL1 = 'ABC'
AND TABLE1.COL2 = 2015
AND TABLE1.COL3 = 'X';
***Second Query***
SELECT *
FROM
TABLE1,
TABLE2,
TABLE3
WHERE TABLE1.COL_ID = TABLE2.COL_ID
AND TABLE1.COL1 = 'ABC'
AND TABLE2.COL1 = 'ABC'
AND TABLE1.COL2 = 2015
AND TABLE1.COL3 = 'X';
是的,SQL 处理器假定您暗示 JOIN
所有三个 table:table1,table2,table3
您不需要明确说明 join
子句,如果您不这样做,SQL 引擎会处理它。
当您使用逗号分隔两个(或更多)table 名称时,您想要的是笛卡尔积。 'left' table 的每一行将 'matched' 与右侧 table.
的每一行 'matched' (连接)现在,如果您在 where 子句中写一些东西,就像在此 'concatenation' 上设置一个条件,告诉 'concatenate' 哪些行与哪些行。
这实际上是 "joining" 行 :),因此 join 关键字有助于提供更易读的语法,并且更容易理解您 'indeed' 想要加入一些共同的价值。
假设您进行以下查询:
Select * from
myTable1 ,myTable2
您将得到(myTable1 行数)x(myTable2 行数),因为如果没有连接条件,您会将第一个 table 中的每一行与第二个 table 中的每一行组合起来,这称为笛卡尔产品,连接是 cross join.
在您的情况下,第一个查询包含 inner join,因为使用了 WHERE TABLE1.COL_ID = TABLE2.COL_ID
,在第二个查询中,第一个连接的结果与 table TABLE3
.