Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql where子句和join的区别_Sql - Fatal编程技术网

Sql where子句和join的区别

Sql where子句和join的区别,sql,Sql,我对SQL非常陌生,目前是我有生以来第一次使用joins。我现在想弄清楚的是,如何区分to和to查询 问题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 ca

我对SQL非常陌生,目前是我有生以来第一次使用joins。我现在想弄清楚的是,如何区分to和to查询

问题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.
但显然不是。谁能帮我解释一下原因吗


编辑:如果有人想知道:查询是基于第二个查询中的问题13的,在第二个查询中,您的嵌套查询从其根查询中获取
actor.id
,并且只计算该查询的结果。在第一个查询中,嵌套查询统计来自所有参与者的结果,而不是仅统计指定的一个参与者的结果。

事实上,真正看起来像“where”语句的部分只在关键字
ON
之后。我们有时会遇到在这个阶段直接执行一些数据过滤的查询,但其实际目的是指定所使用的标准

联接”是一种非常常见的操作,它包括根据通用条件关联两个不同表的行。例如,如果在一侧有一个包含客户机列表的表,其中每个客户机都有一个唯一的客户机编号,而在另一侧有一个订单列表,其中每个订单都包含客户机编号,那么您可能希望将后一个表的编号“解析”为其名称、地址等

在SQL92之前(26年前),实现这一点的唯一方法是编写如下内容:

SELECT client.name,
       client.adress,

       orders.product,
       orders.totalprice

  FROM client,orders
 WHERE orders.clientNumber = client.clientNumber
   AND orders.totalprice > 100.00
从两个(或多个)表中选择某个对象会产生一个“笛卡尔积”,它实际上包括将第一个集合中的每一行与第二个集合中的每一行相关联。这意味着,如果第一个表包含3行,第二个表包含8行,则结果集将为24行宽。除此之外,您使用WHERE子句基本上排除了所有内容,只保留了两边客户机编号相同的行

我们知道,如果不同表的内容超过几行(通常是这样),则过滤前的结果集的大小可能会呈指数增长,如果包含两个以上的表,结果集的大小可能会变得更糟。此外,在程序员方面,它很快变得相当不可读

因此,如果这是您真正想要做的,您现在可以显式地告诉服务器,并首先指定标准,这将避免不必要地增加临时子集,同时仍然允许您在需要时使用WHERE过滤结果

SELECT client.name,
       client.adress,

       orders.product,
       orders.totalprice

  FROM client

  JOIN orders
    ON orders.clientNumber = client.clientNumber

 WHERE orders.totalprice > 100.00

在单个查询中执行多个联接时,尤其是在同时执行内部联接和外部联接时,这一点变得至关重要。

这些查询都很奇怪。在正常情况下,过滤条件出现在
WHERE
子句中。连接表的条件位于
ON
子句中。GROUP BY,但没有聚合函数-为什么?如果名称是table actor中的一列,则可以使用
…count(casting.id)>=30而不是where子句来简化此查询。关于GROUP BY但无聚合:True,我可以使用distinct命令。但遗憾的是,我还是不明白为什么这些查询会给出不同的结果。我是这样想的:使用join命令需要两个表,并基于相似的值连接它们。对于我来说,获取actorid=actori.id的where子句是相同的,用于查找值相同的位置。也许现在有人会意识到我到底想错了什么啊,这是有道理的。但为什么呢?