我对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答案 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连接时。