来自航空公司管理方案的 SQL 中的子查询
Subqueries in SQL from airline management scheme
这里f
指的是air_flight
,fp
指的是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
.
明确地说,fp
和 air_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
这里f
指的是air_flight
,fp
指的是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
.
明确地说,fp
和 air_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