这些SQL查询究竟出了什么问题

时间:2016-07-10 14:16:16

标签: mysql sql sql-server join

我在关于SQL-Basics的讲座中遇到了这个问题。 我认为它没有得到很好的解释,我很难在互联网上找到任何好的信息。在我的书中它说:"如果两个元组属性没有通过显式连接谓词链接,那么几乎总是一个错误:" 然后这个例子:

SELECT s.Name, c.Name AS Contact, c.Phone
FROM Suppliers AS s, ContactPersons AS c
WHERE s.Name = 'Shop Rite'
AND c.Phone LIKE '+49 351%'

没有解释显式连接谓词是什么。对我来说这个例子看起来很好。 事先有一个类似的例子:

SELECT s.Name, c.Name AS Contact, c.Phone
FROM Suppliers AS s, ContactPersons AS c
WHERE s.SuppID = c.SuppID

如书中所述,这是一个很好的加入。我真的不明白区别是什么,JOIN-Predicate究竟是什么?

我也很抱歉任何语法错误(我不是母语人士)

提前谢谢!

1 个答案:

答案 0 :(得分:1)

隐式连接语法:

SELECT * 
FROM Table1 , Table2
WHERE Table1.id = Table2.id

显式连接语法:

SELECT * 
FROM Table1 
JOIN Table2
 ON Table1.id = Table2.id

隐式语法很好,它可以工作,但不建议。这是令人困惑的语法,可能会导致许多错误,主要是在处理两个以上的表时以及需要LEFT JOIN时(愚蠢的加号)。你应该习惯只使用正确的连接语法。

以下是一个包​​含6个表LEFT JOIN s:

的表的查询示例
SELECT <columns>
FROM YourTable,AnotherTable,ThirdTable,FourthTable,AnotherTable2,AnotherTable3
WHERE YourTable.id = AnotherTable.id(+) AND
      YourTable.sec_id = AnotherTable.Sec_Id(+) AND
      AnotherTable.id (+) = ThirdTable.id(+) AND
      YourTable.id = FourthTable.id AND
      FourthTable.Date = ...
      .......

正如你所看到的,假设可能存在更多条件并且它看起来像废话,我甚至没有放置一半的条件。