JOIN 或 WHERE 子句中的相等性?效率与风格

Awa*_*ias 1 postgresql join sql-standard

下面的两个查询中,哪个对 postgresql 来说最有效?并且在可读性等方面具有更好的风格。

区别在于语句的位置doctor.type != 'surgeon'

在 WHERE 子句中:

SELECT practice.name, doctor.name 
FROM doctor 
JOIN practice ON (doctor_code = code) 
WHERE doctor.name LIKE '%son' 
AND (doctor.type != 'surgeon');
Run Code Online (Sandbox Code Playgroud)

或者在 JOIN 子句中:

SELECT practice.name, doctor.name
FROM doctor
JOIN practice ON (doctor_code = code AND doctor.type != 'surgeon')
WHERE doctor.name LIKE '%son';
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 5

说到风格,你可以在几个地方进行改进:

除了克雷格已经写过的内容之外。

  • 如果一个条件只涉及子句doctor中的表JOIN,而另一个条件则在WHERE子句中,这是不一致的。保持一致,要么两者都一致,要么都没有。最好将它们放入WHERE子句中,而链接两个表的条​​件放入JOIN子句中 - 可能会使用 进行简化USING。见下文。

  • doctor.name对某些列 ( 、 )进行表限定doctor.type,但对其他列 ( code) 进行表限定也是不一致的。在较大的查询中,最好始终对所有列进行表限定,以避免命名冲突并使代码清晰。

  • “名字”不是一个好名字。你应该很少使用它。使用有意义的标识符,不要在每个表中重复。一旦你连接了几个表(这就是你在 SQL 中一直做的事情),你最终会得到多个名为“name”的列,并且必须处理列别名才能使用它。“id”或“code”同样是糟糕的选择。
    按照下面的建议使用描述性标识符。

  • doctor.code这是使用and的反模式practice.doctor_code。一些不太聪明的 ORM 习惯于使用这个 - 这并不是一个好主意。除了“代码”是一个不好的标识符之外,最好的做法是对具有相同数据的列使用相同的名称。两个地方都用。或者更确切地说:因为它可能是一个“标识符”而不是“代码”(错误的术语)。这种命名约定还允许在 join 中使用方便的构造。doctor_codedoctor_idUSING

  • 使用 SQL 标准<>而不是(也支持)!=.

  • 使用表别名可以缩短代码并保持可读性。

所有的东西放在一起,可能看起来像这样:

SELECT p.practice, d.name  -- for a person, "name" is halfway sensible
FROM   doctor d
JOIN   practice p USING (doctor_id)
WHERE  d.name LIKE '%son'
AND    d.doc_type <> 'surgeon';
Run Code Online (Sandbox Code Playgroud)