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
4

1 回答 1

11

这两个查询的区别在于JOIN语法:

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

哪个更好?

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。

有关更多信息,请参阅以下内容:

于 2012-11-08T13:19:18.557 回答