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

WHERE子句或ON子句中的INNER JOIN条件?

益和雅
2023-03-14
问题内容

我今天输入了错误的查询,但它仍然有效,并给出了预期的结果。我的意思是运行此查询:

SELECT e.id FROM employees e JOIN users u ON u.email=e.email WHERE u.id='139840'

但是我不小心跑了这个查询

SELECT e.id FROM employees e JOIN users u ON u.email=e.email AND u.id='139840'

(请注意,AND而不是WHERE最后一个子句中的)

并且都从用户ID返回了正确的员工ID。

这两个查询有什么区别?第二种形式是否仅联接满足条件的2个表的成员,而第一种形式将联接整个表,然后运行查询?一个效率比另一个效率高吗?还有其他我想念的东西吗?

谢谢!


问题答案:

对于这样的内部联接,它们在逻辑上是等效的。但是,您可能会遇到join子句中的条件与where子句中的条件含义不同的情况。

举一个简单的例子,假设您像这样进行左连接;

select x.id
from x
       left join y
         on x.id = y.id
;

在这里,我们将获取x中的所有行,而不管y中是否有匹配的id。现在说我们的加入条件增加了-
我们不仅在基于id的y中寻找匹配项,而且还在基于id_type的中寻找匹配项。

html" target="_blank">select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

同样,这将给出x中的所有行,而不管y中是否存在匹配的(id,id_type)。

但是,这是非常不同的:

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

在这种情况下,我们将选择x的所有行,并尝试匹配y的行。现在,对于y中不匹配的行,y.id_type将为null。因此,不满足y.id_type =’some
type’的要求,因此将那些不匹配的行丢弃,从而有效地将其转换为内部联接。

长话短说:对于内部联接来说,条件在哪里都无关紧要,对于外部联接则可以。



 类似资料:
  • 问题内容: 有什么区别,每个应该有什么区别? 如果我正确理解该理论,则查询优化器应该可以互换使用。 问题答案: 它们不是同一件事。 考虑以下查询: 和 第一个将返回订单及其订单号的行(如果有)。第二个将返回所有订单,但只有订单将具有与之关联的任何行。 使用,子句 实际上是 等效的。但是,仅仅因为它们在功能上相同而产生相同的结果,并不意味着这两种子句具有相同的语义。

  • 问题内容: 假设我想要一个JasperReport,它可以让用户根据需要过滤日期。SQL如下: 现在,如果他们没有传递日期,我不想按某个日期进行过滤。我发现了人们使用的以下错误信息: 并使用以下默认值定义参数: 这无法正常工作,因为不会以我的SQL Server可以理解的格式输出日期。我想让条件条件仍然与jdbc驱动程序一起使用一条准备好的语句,并将参数扔进去,我只希望准备好的语句依赖于该参数是否

  • 问题内容: 我有一个执行查询的SQL Server 2005存储过程。该存储过程采用三个参数。参数如下: @StateID为int, @ CountyID为int, @ CityID为int 这些参数用于查询客户列表。如果参数值不为null,我基本上想做一个“ AND”。但是,我目前无法执行if- else。如果参数值不为null,如何添加这些子句。换一种说法: 问题答案: 加上一些OR语句: 对

  • 问题内容: 我目前有一个查询,它将根据我想使用的任何条件从数据库中提取一堆信息。 如果参数=’‘,我希望能够删除注释部分并仅显示所有行 例如,如果我使用它,它将按该参数搜索,如果我使用它,将按该参数搜索。 我已经尝试使用以下方法和其他一些尝试,但是进展并不很快。 问题答案: 您可能需要考虑构建查询。

  • 问题内容: 为简单起见,假设所有相关字段均为。 你可以做: 要不然: 这两个工作方式是否相同? 问题答案: 是您应该使用的ANSI语法。 通常认为它更具可读性,尤其是当您连接许多表时。 只要有需要,也可以轻松地将其替换为。 该语法更关系模型为主。 两个表ed的结果是表的笛卡尔积,将对其应用过滤器,该过滤器仅选择连接列匹配的那些行。 使用语法更容易看到这一点。 以您的示例为例,在MySQL(通常在S