where子句平等理解

时间:2017-01-24 03:25:14

标签: sql where

我很难理解这个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的过程如下:

  1. 由于它是一个相关的子查询,因此计算机从外部子查询开始,这意味着它只需要飞行表中的第一行,然后继续查看内部子查询。
  2. 在内部子查询中,它尝试查找外部子查询的第一行数据的相同载体,并找到该特定载体距离的平均值。并将平均值与外子查询的第一行记录进行比较并返回结果。这样做直到完成整个表格。
  3. 我对序列过程的理解是否正确?非常感谢您的阅读!

3 个答案:

答案 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)

你的解释是正确的。这基本上是它要做的事情,至少在概念上如此。如果数据库擅长一件事,那就是优化。这意味着即使你得到了你期望的结果,它实际上也可能没有你想象的那样。

查看它实际执行的操作的最佳方法是查看查询计划,这是数据库运行查询所采取的实际步骤。大多数数据库提供查看这些的工具。当您的查询运行速度没有您想象的那么快时,这通常是一个好主意。