天池龙珠计划-SQL训练营-task03打卡

复杂查询方法-视图、子查询、函数等-天池龙珠计划SQL训练营

1. 视图与表有什么区别

视图不是表,视图是虚表,视图依赖于表

2. 为什么会存在视图

主要有以下几点原因:

2.1 通过定义视图可以将频繁使用的SELECT语句保存以提高效率。
2.2 通过定义视图可以使用户看到的数据更加清晰。
2.3 通过定义视图可以不对外公开数据表全部字段,增强数据的保密性。
2.4 通过定义视图可以降低数据的冗余。

3. 如何创建视图

创建视图语法:

CREATE VIEW <视图名称>(<列名1>,<列名2>,...) AS <SELECT语句>

4. 练习题-第一部分

4.1 创建出满足下述三个条件的视图(视图名称为 ViewPractice5_1)。使用 product(商品)表作为参照表,假设表中包含初始状态的 8 行数据。

条件 1:销售单价大于等于 1000 日元。
条件 2:登记日期是 2009 年 9 月 20 日。
条件 3:包含商品名称、销售单价和登记日期三列。
对该视图执行 SELECT 语句的结果如下所示。

SELECT * FROM ViewPractice5_1;

执行结果

product_name | sale_price | regist_date
--------------+------------+------------
T恤衫         |   1000    | 2009-09-20
菜刀          |    3000    | 2009-09-20

答:

CREATE VIEW 'ViewPractice5_1' 
	('product_name' ,'sale_price' ,'regist_date') 
AS 
SELECT 
	product_name
	,sale_price
	,regist_date
	FROM Product
	WHERE sale_price > 1000
		and regist_date = '2009-09-20';
	

4.2 向习题一中创建的视图 ViewPractice5_1 中插入如下数据,会得到什么样的结果呢?

INSERT INTO ViewPractice5_1 VALUES (' 刀子 ', 300, '2009-11-02');

答:因为插入信息不包含表的主键product_id,所以会插入失败。

4.3 请根据如下结果编写 SELECT 语句,其中 sale_price_all 列为全部商品的平均销售单价。

product_id | product_name | product_type | sale_price | sale_price_all
------------+-------------+--------------+------------+---------------------
0001       | T恤衫         | 衣服         | 1000       | 2097.5000000000000000
0002       | 打孔器        | 办公用品      | 500        | 2097.5000000000000000
0003       | 运动T恤       | 衣服          | 4000      | 2097.5000000000000000
0004       | 菜刀          | 厨房用具      | 3000       | 2097.5000000000000000
0005       | 高压锅        | 厨房用具      | 6800       | 2097.5000000000000000
0006       | 叉子          | 厨房用具      | 500        | 2097.5000000000000000
0007       | 擦菜板        | 厨房用具       | 880       | 2097.5000000000000000
0008       | 圆珠笔        | 办公用品       | 100       | 2097.5000000000000000

答:

SELECT product_id 
	,product_name
	,product_type
	,sale_price,
 (SELECT AVG(sale_price) FROM product) AS sale_price_all
 FROM product;

4.4 请根据习题一中的条件编写一条 SQL 语句,创建一幅包含如下数据的视图(名称为AvgPriceByType)

product_id | product_name | product_type | sale_price | avg_sale_price
------------+-------------+--------------+------------+---------------------
0001       | T恤衫         | 衣服         | 1000       |2500.0000000000000000
0002       | 打孔器         | 办公用品     | 500        | 300.0000000000000000
0003       | 运动T恤        | 衣服        | 4000        |2500.0000000000000000
0004       | 菜刀          | 厨房用具      | 3000        |2795.0000000000000000
0005       | 高压锅         | 厨房用具     | 6800        |2795.0000000000000000
0006       | 叉子          | 厨房用具      | 500         |2795.0000000000000000
0007       | 擦菜板         | 厨房用具     | 880         |2795.0000000000000000
0008       | 圆珠笔         | 办公用品     | 100         | 300.0000000000000000

答:

CREATE VIEW 'AvgPriceByType'(product_id ,product_name ,product_type ,sale_price ,avg_sale_price) AS 
SELECT product_id 
	,product_name
	,product_type
	,sale_price,
 (SELECT AVG(sale_price) FROM product) AS sale_price_all
 FROM product;

5. 练习题-第二部分

5.1 运算或者函数中含有 NULL 时,结果全都会变为NULL ?(判断题)

是的;

5.2 对本章中使用的 product(商品)表执行如下 2 条 SELECT 语句,能够得到什么样的结果呢?

-- 第一题
SELECT product_name, purchase_price
  FROM product
 WHERE purchase_price NOT IN (500, 2800, 5000);
 
-- 第二题
SELECT product_name, purchase_price
  FROM product
 WHERE purchase_price NOT IN (500, 2800, 5000, NULL);

答:
第一题:
返回进货价不含500,2800,5000日元的商品信息

第二题:
返回0条记录,因为谓词⽆法与 NULL 进⾏⽐较

5.3 按照销售单价( sale_price)对练习 6.1 中的 product(商品)表中的商品进行如下分类。

  • 低档商品:销售单价在1000日元以下(T恤衫、办公用品、叉子、擦菜板、 圆珠笔)
  • 中档商品:销售单价在1001日元以上3000日元以下(菜刀)
  • 高档商品:销售单价在3001日元以上(运动T恤、高压锅)

请编写出统计上述商品种类中所包含的商品数量的 SELECT 语句,结果如下所示:

low_price | mid_price | high_price
----------+-----------+------------
        5 |         1 |         2

答:

SELECT 
	COUNT(CASE WHEN sale_price <= 1000 then 1 ELSE 0 END) AS 'low_price'
	,COUNT(CASE WHEN sale_price >= 1001 then 1 ELSE 0 END) AS 'mid_price'
	,COUNT(CASE WHEN sale_price >= 3001 then 1  ELSE 0 END) AS 'high_price'
FROM Product;

猜你喜欢

转载自blog.csdn.net/Keeomg/article/details/114192157