参考MICK的SQL基础教程,进行SQL的基础学习。
视图的优势
- 视图无需保存数据,因此可以节省存储设备的容量。
- 可以将频繁使用的
SELECT
语句保存成视图。 - 视图中的数据会随着原表的变化自动更新。
创建视图
CREATE VIEW productsum (product_type, cnt_product) AS SELECT
product_type,
COUNT(*)
FROM
product
GROUP BY
product_type SELECT
*
FROM
productsum
这里的 AS
与定义别名时使用的 AS
并不相同,如果省略就会发生错误。虽然很容易混淆,但是语法就是这么规定的。
注:
- 可以使用多重视图,但是会降低SQL 的性能。
- 定义视图时不要使用
ORDER BY
子句,数据
行都是没有顺序的。
子视图
子查询的特点概括起来就是一张一次性视图
SELECT
product_type,
cnt_product
FROM
(
SELECT
product_type,
COUNT(*) AS cnt_product
FROM
product
GROUP BY
product_type
) AS productsum
由于子查询的层数原则上没有限制,因此可以像“子查询的FROM
句中还可以继续使用子查询,但是,随着子查询嵌套层数的增加,SQL 语句会变得越来越难读懂,性能也会越来越差。
标量子查询
SELECT
product_id,
product_name,
sale_price,
(
SELECT
AVG(sale_price)
FROM
product
) AS AVG_price
FROM
product
WHERE
sale_price > (
SELECT
AVG(sale_price)
FROM
product
);
注:最后我们来介绍一下使用标量子查询时的注意事项,那就是该子查询绝对不能返回多行结果。
关联子查询
SELECT
product_type,
product_name,
sale_price
FROM
product AS p1
WHERE
sale_price > (
SELECT
AVG(sale_price)
FROM
product AS p2
WHERE
p1.product_type = p2.product_type
GROUP BY
product_type
);