来自航空公司管理方案的 SQL 中的子查询

Subqueries in SQL from airline management scheme

这里f指的是air_flightfp指的是air_flight_details。 因为我是 sql 的初学者,所以我理解这个概念,除了....为什么他们在子查询之后提到 fp 而为什么不是 air_flight_details fp?

SELECT f.flight_id, f.from_location, f.to_location, fp.Month_Name, fp.Average_Price  
FROM air_flight f,
    (
        SELECT flight_id,  MONTHNAME(flight_departure_date) AS Month_Name,  
            AVG(price) as Average_Price
        FROM air_flight_details
        GROUP BY flight_id, MONTHNAME(flight_departure_date)
    ) fp
WHERE f.flight_id = fp.flight_id AND f.airline_name = 'ABC AIRLINES'
ORDER BY f.flight_id, fp.Month_Name

您示例中的子查询有一个名为 fp 别名 ,它允许在外部查询中引用该子查询的结果。例如,查询选择fp.Average_Price,这是子查询中包含的列。此外,WHERE 子句包含条件 f.flight_id = fp.flight_id,它也使用别名 fp.

明确地说,fpair_flight_details 是两个不同的表。

就像第一个 FROM 语句命名 table f 一样,整个子查询的别名是 fp

不同之处在于,在第一个 FROM 语句中,整个 table air_flight 被赋予名称 f,而子查询实质上创建了整个 [= fp 指的是 21=]。

这叫做 derived table:

(
    SELECT flight_id,  MONTHNAME(flight_departure_date) AS Month_Name,  
        AVG(price) as Average_Price
    FROM air_flight_details
    GROUP BY flight_id, MONTHNAME(flight_departure_date)
) fp

派生的 table 的行为类似于 "ordinary" table,只是它们是从子查询构造的。在大多数SQL方言中,包括MySQL,导出的table需要别名,这就是为什么在导出的table之后写fp的原因。

派生的 table 就是 "local view"。同样的查询可以写成 "stored view":

CREATE VIEW air_flight_details_with_average_prices AS         
    SELECT flight_id,  MONTHNAME(flight_departure_date) AS Month_Name,  
        AVG(price) as Average_Price
    FROM air_flight_details
    GROUP BY flight_id, MONTHNAME(flight_departure_date);

然后:

SELECT f.flight_id, f.from_location, f.to_location, fp.Month_Name, fp.Average_Price  
FROM air_flight f, air_flight_details_with_average_prices fp
WHERE f.flight_id = fp.flight_id AND f.airline_name = 'ABC AIRLINES'
ORDER BY f.flight_id, fp.Month_Name