我很难理解这个WHERE
条款,包括在算法过程方面的平等条件。
(我想我无法获得下面的SQL语法,因为我无法像在算法中一样逐步运行WHERE carrier= f.carrier
子句的过程。(就像我看到的结果一样)设置表以及如何按顺序处理))
SELECT id
FROM flights AS f
WHERE distance < ( SELECT AVG(distance)
FROM flights
WHERE carrier = f.carrier);
因此,据我了解,运行carrier=f.carrier
的过程如下:
我对序列过程的理解是否正确?非常感谢您的阅读!
答案 0 :(得分:1)
你的解释是正确的。仅出于教育目的,以下是使用连接执行相同查询的方法:
SELECT t1.id
FROM flights t1
INNER JOIN
(
SELECT carrier, AVG(distanct) AS average_distance
FROM flights
GROUP BY carrier
) t2
ON t1.carrier = t2.carrier
WHERE t1.distance < t2.average_distance
非相关子查询找到每个carrier
的平均距离,然后将这些值连接回原始flights
表。 WHERE
子句将flights
的距离值与同一运营商的平均值进行比较,以确定在结果集中保留哪些记录。
答案 1 :(得分:0)
你的解释是正确的。但是,如果要编写包含多个表的查询,则应养成验证所有列名称的习惯。这对于相关子查询尤为重要,因为错误可能非常微妙:
SELECT f.id
FROM flights f
WHERE f.distance < (SELECT AVG(f2.distance)
FROM flights f2
WHERE f2.carrier = f.carrier
);
答案 2 :(得分:0)
你的解释是正确的。这基本上是它要做的事情,至少在概念上如此。如果数据库擅长一件事,那就是优化。这意味着即使你得到了你期望的结果,它实际上也可能没有你想象的那样。
查看它实际执行的操作的最佳方法是查看查询计划,这是数据库运行查询所采取的实际步骤。大多数数据库提供查看这些的工具。当您的查询运行速度没有您想象的那么快时,这通常是一个好主意。