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

在MySQL查询中,为什么要使用join而不是在哪里?

魏成济
2023-03-14
问题内容

似乎要合并两个或多个表,我们可以使用join或where。一个相对于另一个的优点是什么?


问题答案:

任何涉及多个表的查询都需要某种形式的关联,以将结果从表“ A”链接到表“ B”。传统的(ANSI-89)方法是:

  1. 在FROM子句中列出逗号分隔列表中涉及的表
  2. 在WHERE子句中编写表之间的关联
    SELECT *
    

    FROM TABLE_A a,
    TABLE_B b
    WHERE a.id = b.id

这是使用ANSI-92 JOIN语法重写的查询:

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

从性能角度来看:

在受支持的地方(Oracle 9i +,PostgreSQL 7.2 +,MySQL 3.23 +,SQL Server
2000+),使用两种语法都不会对性能产生任何好处。优化器将它们视为相同的查询。但是更复杂的查询可以从使用ANSI-92语法中受益:

  • 控制JOIN顺序的能力-扫描表的顺序
  • 能够在加入表格之前在表格上应用过滤条件

从维护角度:

在ANSI-89上使用ANSI-92 JOIN语法的原因有很多:

  • 更具可读性,因为JOIN标准与WHERE子句分开
  • 不太可能错过JOIN标准
  • 对除INNER之外的JOIN类型的一致语法支持,使查询易于在其他数据库上使用
  • WHERE子句仅用作连接表的笛卡尔积的过滤

从设计角度来看:

ANSI-92 JOIN语法是模式,而不是反模式:

  • 查询的目的更加明显;应用程序使用的列很清楚
  • 它遵循关于尽可能使用严​​格类型的模块化规则。显式普遍更好。

结论

缺乏熟悉度和/或舒适度,我认为继续使用ANSI-89 WHERE子句代替ANSI-92
JOIN语法没有任何好处。有人可能会抱怨ANSI-92语法更冗长,但这就是它的明确之处。越明确,就越容易理解和维护。



 类似资料:
  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。

  • 问题内容: 我试图弄清楚为什么我的查询之一变慢以及如何解决它,但是我对结果有些困惑。 我有一个约80列和775179行的表,并且正在执行以下请求: 在4.5秒内返回38行 删除时,我得到了很好的改进: 0.30秒内38行 但是,如果在不触摸的情况下删除,我会得到更好的结果: 0.10s(??)中的38行 为什么我的LIMIT这么饿? 继续前进 在尝试发送答案之前,我尝试了一些尝试,并注意到我有一个

  • 我碰巧知道,在下面的表达式中,使用将导致无限流,将始终为0。我之所以困惑是因为我认为返回的值没有被使用,即便如此,它也不应该中断之后的增量。

  • 问题内容: 目前使用jQuery,当我需要在发生点击时做一些事情时,我会像这样… 我正在看别人在项目上有的代码,他们这样做是… 请注意,就我所知,它似乎在做相同的事情,除了它们使用的是live()函数(现在已弃用并且jQuery文档说要使用live()函数),但是无论哪种方式,为什么要使用live / on()而不是我的第一个示例? 问题答案: 因为您可能具有动态生成的元素(例如,来自AJAX调用

  • 问题内容: 在selenium.webdriver.common.by中使用By代替常规的find_element_by _…方法的目的和好处是什么?例如: vs: 问题答案: 据documentatio ñ 似乎是一种“ 私人 所使用的”法的方法和还可以使用页面对象 因此,使用Page Object模式是您可能需要+ 而不是的原因。 例如,您有一些包含元素值的变量 然后用它来定位元素为 如果由于

  • 本文向大家介绍在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 相关面试题,主要包含被问及在Java中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 时的应答技巧和注意事项,需要的朋友参考一下 纳米时间不是“实时”时间,它只是一个计数器,在发生某些未指定的事件(可能是计算机已启动)时,将从某个未指定的数字开始递增。