我的办公室正在按照sql join中连接列的顺序进行大讨论。我发现很难解释它,所以我只提出两个sql语句。哪一个更好地考虑到sql最佳实践?
SELECT a.Au_id
FROM AUTHORS a
INNER JOIN TITLEAUTHOR ta
ON a.Au_id = ta.Au_id
INNER JOIN TITLES t
ON ta.Title_id = t.Title_id
WHERE t.Title LIKE ‘%Computer%’
OR
SELECT a.Au_id
FROM AUTHORS a
INNER JOIN TITLEAUTHOR ta
ON ta.Au_id = a.Au_id
INNER JOIN TITLES t
ON t.Title_id = ta.Title_id
WHERE t.Title LIKE ‘%Computer%’
因此,在联接中,在ON部分,是否写A.x = B.y or B.y = A.x
是否重要?
答案 0 :(得分:2)
这里的最佳做法是选择一个并坚持在团队中。就个人而言,我更喜欢FROM a JOIN b ON b.col = a.col
,因为它对我来说似乎更清晰。
答案 1 :(得分:2)
SQL被设计为像通常的英文文本一样可读。在通常的文本中,当我们要指定任何提及的对象时,我们说的是“一个对象。该对象类似于该对象,该对象与该对象相关,并且该对象具有那些属性”。我们不会说“该对象就像该对象,对于与该对象相关的那个对象,并且那些属性具有该对象”。
因此,当我们将TableB的记录添加到TableA的查询中时,我们需要指定必须具有TableB的记录才能满足TableA的当前记录的内容。因此我们必须说,我们需要来自TableB的记录,该记录的ID等于TableA.ID。 FROM TableA a JOIN TableB b ON b.col = a.col
。我们必须严格按此顺序编写,以方便阅读和理解这种关系。
我非常难过,几乎所有的SQL文档都没有提供任何推理来解决这个问题,但是有很多示例错误地按表的顺序编写方程式参数在查询中。
答案 2 :(得分:1)
我一直使用选项1,这也是orcale在SQL和PL / SQL课程中教授它的方式。
关于最佳实践的主题,
你曾经使用的那个oracle还教的是1或2个字母表别名..虽然这在当时看起来像个好主意但它使得编写语句/过程/函数分配更容易(当时)可能很难再回来看看以后的同一段代码。
e.g。 我们有许多PL / SQL函数正在查看/从数十个表中提取数据,虽然别名在你的脑海中很新鲜,但很好,但是在几年内回到相同的代码并且它会变得很粘。
我并不是说不要使用表别名,但我总是尽量避免分配地方/人教的1或2个字母。
(不仅仅是关于联接的主题,而是关于最佳实践的主题)
答案 3 :(得分:0)
无论如何,数据库查询优化器将决定执行查询的最佳方式,无论您如何订购连接条件,甚至是where子句。
http://docs.oracle.com/cd/B10501_01/server.920/a96533/optimops.htm#39473详细解释了oracle优化器处理连接的方式。
答案 4 :(得分:0)
请参阅以下链接,其中结论是ON子句中的顺序不会影响结果。 数据库优化器将决定执行查询的最佳方式和计划。
http://weblogs.sqlteam.com/joew/archive/2008/02/29/60542.aspx