当前位置: 首页 > 面试题库 >

在多个表上的SQL INNER JOIN等于WHERE语法

澹台成龙
2023-03-14
问题内容

我有两个连接多个表的PostgreSQL查询:

第一的:

SELECT iradio.id, iradio.name, iradio.url, iradio.bandwidth, genre_trans.name 
 FROM  
 service_iradio_table AS iradio, 
 genre_table AS genre, 
 genre_name_table AS genre_name, 
 genre_name_translation_table AS genre_trans,
 genre_mapping_table AS genre_mapping,
 language_code_table AS code
WHERE
 iradio.id=genre_mapping.s_id AND genre_mapping.g_id=genre.id AND genre.id=genre_name.g_id 
 AND genre_name.t_id=genre_trans.id AND genre_trans.code_id=code.id AND iradio.name='MyRadio' AND code.language_iso_code='ger'

第二:

SELECT iradio.id, iradio.name, iradio.url, iradio.bandwidth, genre_trans.name 
 FROM 
  service_iradio_table AS iradio INNER JOIN genre_mapping_table AS genre_mapping ON iradio.id=genre_mapping.s_id
  INNER JOIN genre_table AS genre ON genre_mapping.g_id=genre.id 
  INNER JOIN genre_name_table AS genre_name ON genre.id=genre_name.g_id
  INNER JOIN genre_name_translation_table AS genre_trans ON genre_name.t_id=genre_trans.id
  INNER JOIN language_code_table AS code ON genre_trans.code_id=code.id
WHERE iradio.name='MyRadio' AND code.language_iso_code='ger'

因此,来自MySQL我认为,由于交叉引用每个表,因此第一个查询的速度必须慢于第二个查询的速度。

似乎在postgreSQL中,这两个查询在内部是相同的。对于两个查询,使用关键字“ EXPLAIN”时,输出是相同的。

问题

这些查询是否真的是“相等的”?完全以这种方式联接表是goog设计吗?

最后,这种性能调整尝试也与“ EXPLAIN”运行到相同的输出中:

SELECT iradio.id, iradio.name, iradio.url, iradio.bandwidth, genre_trans.name 
 FROM 
 service_iradio_table AS iradio INNER JOIN genre_mapping_table AS genre_mapping ON iradio.id=genre_mapping.s_id AND iradio.name='MyRadio',
 genre_table AS genre, 
 genre_name_table AS genre_name, 
 genre_name_translation_table AS genre_trans,
 language_code_table AS code
WHERE
  genre_mapping.g_id=genre.id AND genre.id=genre_name.g_id 
 AND genre_name.t_id=genre_trans.id AND genre_trans.code_id=code.id AND code.language_iso_code='ger'

所有查询均在2ms内处理完毕。


问题答案:

当试图优化连接顺序时,查询计划者将(几乎)以相同的方式考虑所有WHEREJOIN谓词。获得相同的性能也就不足为奇了。每个文档:

显式内部联接语法(INNER JOINCROSS JOIN或unadorned
JOIN)在语义上与列出中的输入关系相同FROM,因此它不限制联接顺序。

唯一的区别是:当表的总数大于的设置时,显式联接语法指示给定的联接顺序join_collapse_limit

显式JOINs绑定在FROM列表中的逗号之前,这与允许的语法有关。例子。

无论如何,FROM子句中 逗号分隔的表列表 绝不被弃用 。这是一种 很好的形式, 并且使用显式联接语法 更具可读性

还要注意,OUTER联接的行为有所不同,因为逻辑上的影响,查询计划人员无法随意重新排列联接。



 类似资料:
  • 问题内容: 案件: 如何从相等的地方更新数据? 问题: 当我运行以下更新语句时,它将更新中的所有记录(即使中的字段不存在)。 我如何使用的多个更新表的语法,在仅更新记录只有在存在于和平等的吗? 提前致谢。 问题答案: 这是with join in 的正确语法 SQLFiddle演示

  • 我正在尝试从技能作业表中删除一行 以下是我的疑问 但它抛出以下错误; 致命错误:未捕获的异常'异常'消息'您有一个错误在您的SQL语法;检查手册,对应于您的MySQL服务器版本的正确的语法使用附近'skj内连接作业j上<--plhd--0/<--#############################################################################

  • 问题内容: 在为我的sql动态生成子句时,我喜欢将代码硬编码到sql中,因此不必跟踪是否在每个后面的子句之前添加前缀。这在很多地方都有很好的文档证明,例如stackoverflow问题。 是否存在用于动态生成语句子句的等效模式?我宁愿跟踪是否需要加逗号。如果没有通用的解决方案,这将用于通过jdbc与oracle数据库进行交互。 编辑对于我的特定用例,我将需要动态地更改要设置的列。因此,任何需要查询

  • 问题内容: 所以我想做的是:- 相当奇怪的查询,我知道!但是我正在尝试在EntityFramework / Linq中复制此代码- 查看所有示例,当联接使用AND(使用匿名类型)但对OR联接存在相同的结果时,我可以看到一种非常简单的方法? 问题答案: 只需使用where子句进行交叉连接 令人怀疑的是,连接条件或连接条件是否会比此条件更有效,但是可能会导致相同的执行计划。除了性能,它还会产生相同的结

  • 问题内容: 我可以在C#中做到这一点: 例如在Java中 我如何查询这样的ArrayList?谢谢。 问题答案: Java 8引入了Stream API ,该API允许与Linq中的构造类似的构造。 例如,您的查询可以表示为: 如果存在默认值,您显然需要锻炼,在这种情况下,这似乎很奇怪,但是我已经展示了它,因为这就是您问题中的代码所做的。

  • 问题内容: 假设有人来找您,并说我们将通过用equals替换equals来减少我们编写的SQL数量。既可以用于单个标量值,也可以用于数字列表。 或者 这些语句等于优化器产生的内容吗? 从表面上看,这看起来确实很简单,但是由于两个原因,它导致了简化:1.不需要复制大型SQL块;并且2.我们不会过度使用动态SQL。 这是一个人为的示例,但请考虑以下内容。 …对于不止一种情况,同样如此 (这甚至不是一个