哪种查询是正确的方法?

use*_*053 1 mysql sql t-sql 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
Run Code Online (Sandbox Code Playgroud)

Mah*_*mal 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;
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id2;
Run Code Online (Sandbox Code Playgroud)

如果您忘记了这个ON条件,您将收到语法错误.即使你打算这样做CROSS JOIN,其他人也会更容易理解:

SELECT *
FROM Table1 t1 CROSS JOIN Table2 t2 
Run Code Online (Sandbox Code Playgroud)

比其他语法.

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

另一个重要的好处是可以在INNER和OUTER连接之间轻松切换,而无需在WHERE子句中处理NULL.

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