2012-11-08 152 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

相關問題