2012-11-08 92 views
1

有人可以告诉我哪种方法更好,它们都产生相同的结果,但哪个更“正确”?哪个查询是正确的方法?

就我个人而言,我觉得第一个查询更容易阅读,但我似乎在其他地方阅读别名应始终使用。

由于

SELECT Patient.PatientSurname, Doctor.DoctorSurname 
FROM Patient 
JOIN Operation 
ON Operation.PatientCode=Patient.PatientCode 
JOIN Doctor 
ON Doctor.DoctorCode=Operation.DoctorCode 
WHERE Operation.OperationType='Broken Arm' 
GROUP BY Patient.PatientSurname 
HAVING count(Patient.PatientSurname) > 0 


SELECT PatientSurname, DoctorSurname 
FROM Patient as p, Operation as o, Doctor as d 
WHERE o.PatientCode=p.PatientCode 
AND d.DoctorCode=o.DoctorCode 
AND o.OperationType='Broken Arm' 
GROUP BY p.PatientSurname 
HAVING count(p.PatientSurname) > 0 
+1

这是一个主观问题,所以可能不适合SO。不过,我建议阅读[Aaron Bertrand]撰写的这些文章(http:// stackoverflow。com/users/61305/aaron-bertrand) - > [使用类似于a,b,c的表格别名](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to -kick-using-table-aliases-like-abc-or-t1-t2-t3.aspx),[Using Old Style Joins](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08) /bad-habits-to-kick-using-old-style-joins.aspx) – GarethD

回答

11

两个查询之间的差异是JOIN语法:

  • 第一种使用ANSI-92 JOIN语法。
  • 第二个使用旧的ANSI-89 JOIN语法。

哪个更好?

MySQL和SQL Server以及其他RDBMS都支持这两种语法,您不应该期望两者之间有任何性能差异。他们是一样的。

但是,它推荐使用第一个。多种方式更安全。例如,如果你想要做一个INNER JOIN,使用第二语法:

SELECT * 
FROM Table1 t1, Table2 t2 
WHERE t1.id = t2.id2; 

如果您忘记了WHERE t1.id = t2.id,查询不会失败。但它会产生一个交叉连接,很难找出这个错误。但是,使用第一种语法:

SELECT * 
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id2; 

如果您忘记了ON条件,你会得到一个语法错误。即使你打算做一个CROSS JOIN它会更具有可读性其它告诉:

SELECT * 
FROM Table1 t1 CROSS JOIN Table2 t2 

比其他的语法。

通过@Gareth注意到另一益处(参见下面的注释):

另一个海量好处是便于INNER和 OUTER连接之间进行切换,而不必在WHERE子句中处理NULL。

欲了解更多信息,请参阅如下因素:

+0

是的,我发现第一个更清楚你正在做什么。而不是在WHERE子句中混合JOIN条件,它们被组织在它们影响的JOIN中。 –

+0

@MarlinPierce - 是的,它是推荐的方式,它更可读,更安全。看我的编辑。 –

+0

另一个巨大的好处是在'INNER'和'OUTER'连接之间轻松切换,而无需在WHERE子句中处理NULL。 – GarethD

相关问题