where子句和join的区别

时间:2018-06-07 12:44:08

标签: sql

我对SQL非常陌生,目前在我生命中第一次使用加入。我现在想弄清楚的是试图区分查询。

查询1:

SELECT name
FROM actor
JOIN casting ON id = actorid 
where (SELECT COUNT(ord) FROM casting join actor on actorid = actor.id AND ord=1) >= 30
GROUP BY name

查询2:

SELECT name
FROM actor
JOIN casting ON id = actorid 
AND (SELECT COUNT(ord) FROM casting WHERE actorid = actor.id AND ord=1)>=30)
GROUP BY name

所以我认为这样做

FROM casting join actor on actorid = actor.id 
子查询中的

相同
FROM casting WHERE actorid = actor.id.

但显然事实并非如此。任何人都可以帮我解释原因吗?

编辑:如果有人想知道:查询基于http://sqlzoo.net/wiki/More_JOIN_operations

中的问题13

2 个答案:

答案 0 :(得分:0)

在第二个查询中,嵌套查询从其根查询中获取actor.id,并仅计算结果。在第一个查询中,嵌套查询计算所有actor的结果,而不是仅计算指定的结果。

答案 1 :(得分:0)

实际上,真正看起来像是"其中"声明只是关键字ON之后的内容。我们有时会在此阶段直接执行某些数据过滤,但其实际目的是指定使用的标准

A" 加入"是一种非常常见的操作,包括根据通用标准关联两个不同表的行。例如,如果您在一侧有一个包含客户列表的表,其中每个客户列表都有唯一的客户编号,而在另一侧有一个订单列表,其中每个订单都包含客户编号,然后你可能想要解决"后一个表的名称,地址等等。

在SQL92(26年前)之前,实现这一目标的唯一方法是写下这样的东西:

SELECT client.name,
       client.adress,
       order.product,
       order.totalprice

  FROM client,order
 WHERE order.clientNumber = client.clientNumber
   AND order.totalprice > 100.00

从两个(或更多)表中选择一些东西会产生一个"笛卡尔产品"实际上,它包括将第一组中的每一行与第二组中的每一行相关联。这意味着如果您的第一个表包含3行而第二个表包含8行,则结果集将为24行宽。除此之外,您使用WHERE子句基本上排除所有内容并仅保留客户端编号在两端都相同的行。

我们知道,如果不同表的内容超过几行(总是如此),则过滤前生成的集的大小会呈指数级增长,如果暗示超过两个表,则会变得更糟。此外,在程序员的一面,它很快变得相当难以理解。

因此,如果您真正想要这样做,那么您现在可以明确地告诉服务器它,并首先指定条件,这将避免不必要的增长临时子集,同时仍然允许您使用WHERE过滤结果需要的。

SELECT client.name,
       client.adress,
       order.product,
       order.totalprice

  FROM client

  JOIN order
    ON order.clientNumber = client.clientNumber

 WHERE order.totalprice > 100.00

在单个查询中执行多个JOIN时变得至关重要,尤其是在执行INNER和OUTER连接时。

相关问题