top
Loading...
13.2.8.8.FROM子句中的子查詢
13.2.8.8. FROM子句中的子查詢

SELECT語句的FROM子句中,子查詢是合法的。實際的語法是:

SELECT ... FROM (subquery) [AS] name ...

[AS] name子句是強制性的,因為FROM子句中的每個表必須有一個名稱。在子查詢選擇列表中的任何列都必須有唯一的名稱。您可以在本手冊中的其它地方找到對本語法的說明。在該處,所用的詞語是“導出表”。

為了進行詳細說明,假設您有如下一個表:

CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);

下面使用了示例表,解釋了在FROM子句中如何使用子查詢:

INSERT INTO t1 VALUES (1,'1',1.0);
INSERT INTO t1 VALUES (2,'2',2.0);
SELECT sb1,sb2,sb3
FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb
WHERE sb1 > 1;

結果:2, '2', 4.0

下面是另一個例子:假設您想了解一個分類后的表的一組和的平均值。采用如下操作:

SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1;

不過,本查詢提供所需的信息:

SELECT AVG(sum_column1)
FROM (SELECT SUM(column1) AS sum_column1
FROM t1 GROUP BY column1) AS t1;

注意,在子查詢中使用的列名稱(sum_column1)被整理到外部查詢中。

FROM子句中的子查詢可以返回標量、列、行或表。FROM子句中的子查詢不能為有關聯的子查詢。

即使對EXPLAIN語句(即建立臨時導出表),FROM子句中的子查詢也會被執行。這是因為在優化過程中,上一級的查詢需要有關所有表的信息。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html
北斗有巢氏 有巢氏北斗