哪种查询是正确的方法?

时间:2012-11-08 13:03:13

标签: mysql sql tsql join

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

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

由于

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 个答案:

答案 0 :(得分: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 ,其他人也会更容易理解:

{{1}}

比其他语法。

@Gareth提到的另一个好处(见下面的评论):

  

另一个重要的好处是易于在INNER和。之间切换   OUTER连接而不必在WHERE子句中处理NULL。

有关详细信息,请参阅以下内容: