SQL基础教程(第2版)第5章 复杂查询:练习题

Posted 绍耕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL基础教程(第2版)第5章 复杂查询:练习题相关的知识,希望对你有一定的参考价值。

/*
  下面是问题中的SELECT语句
*/
-- 确认视图内容
SELECT * FROM ViewPractice5_1;


/*
  下面是解答示例
*/
-- 创建视图的语句
CREATE VIEW ViewPractice5_1 AS
SELECT product_name, sale_price, regist_date
  FROM Product
 WHERE sale_price >= 1000
   AND regist_date = \'2009-09-20\';
View Code

会发生错误。
>> 解答
对视图的更新归根结底是对视图所对应的表进行更新。

product_id(商品编号)、product_name(商品名称)、product_type(商
品种类) 3 列在表定义时都被赋予了 NOT NULL 约束 A。因此,向 product_id(商
品编号)以及 product_type(商品种类)中插入 NULLINSERT 语句是无法执行的。

并且, INSERT 语句中只对 product_name(商品名称)、 sale_price(销
售单价)、 regist_date(登记日期) 3 列进行了赋值,所以剩余的列都会被自动插
入 NULL,于是就发生了错误。
View Code

SELECT product_id,
       product_name,
       product_type,
       sale_price,
       (SELECT AVG(sale_price) FROM Product) AS sale_price_all
  FROM Product;
View Code

-- 创建视图的语句
CREATE VIEW AvgPriceByType AS
SELECT product_id,
       product_name,
       product_type,
       sale_price,
       (SELECT AVG(sale_price)
          FROM Product P2
         WHERE P1.product_type = P2.product_type
         GROUP BY P1.product_type) AS avg_sale_price
 FROM Product P1;

-- 确认视图内容
SELECT * FROM AvgPriceByType;
在 GROUP BY 子句中可以使用表的别名。
>> 解答
在视图中包含的列中,除了 avg_sale_price 之外的 4 列(product_id、product_name、 product_type、 sale_price) 在 Product 表 中 都 存 在,
因此可以直接读取。但是,最后的 avg_sale_price(平均销售单价)则必须使用关联子查询进行结算。使用标量子查询和关联子查询也可以创建出上述视图。 
View Code

以上是关于SQL基础教程(第2版)第5章 复杂查询:练习题的主要内容,如果未能解决你的问题,请参考以下文章

SQL基础教程(第2版)第5章 复杂查询:5-1 视图和表

SQL基础教程(第2版)第5章 复杂查询:5-3 关联子查询

SQL基础教程(第2版)第4章 数据更新:练习题

SQL基础教程(第2版)第3章 聚合与排序:练习题

SQL基础教程(第2版)第6章 函数谓词CASE表达式:练习题

SQL基础教程(第2版)查询基础 练习题 第二章