复杂一点的查询,就是增加了视图查询和子查询,这二者也是数据库操作中比较基础的内容了。sql自带各种函数,只需用到时查询一下即可。谓词,主要掌握几个关键字:LIKE,BETWEEN,IS NULL,IS NOT NULL,IN,EXIST即可。关于CASE表达式,应用场景很多,应当在项目中进行实战练习。总之,熟能生巧。

第一部分

练习题4.1

创建出满足下述三个条件的视图(视图名称为 ViewPractice5_1)。使用 product(商品)表作为参照表,假设表中包含初始状态的 8 行数据。
• 条件 1:销售单价大于等于 1000 日元。
• 条件 2:登记日期是 2009 年 9 月 20 日。
• 条件 3:包含商品名称、销售单价和登记日期三列。
对该视图执行 SELECT 语句的结果如下所示。
image.png
解答:
CREATE VIEW ViewPractice5_1 As
SELECT product_name,sale_price,regist_date
FROM product
WHERE sale_price>= 1000
AND regist_date = '2009-9-20';
SELECT * FROM ViewPractice5_1;

练习题4.2

向习题一中创建的视图 ViewPractice5_1 中插入如下数据,会得到什么样的结果呢?
INSERT INTO ViewPractice5_1 VALUES (’刀子’, 300, ’2009-11-02’);
解答:
会报错:1423 - Field of view 'shop.viewpractice5_1' underlying table doesn't have a default value
面向百度编程找到了报错原因是:当向视图中插入数据时,同时也会向原表插入数据插入数据 ,而原表(product)中存在多个字段不允许为空,所以无法插入,将这些不允许为空的字段修改为允许为空即可。

练习题4.3

请根据如下结果编写 SELECT 语句,其中 sale_price_avg 列为全部商品的平均销售单价。
image.png
解答:
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)。
image.png
提示:其中的关键是 sale_price_avg_type 列。与习题三不同,这里需要计算出的是各商品种类的平均销售单价。这与使用关联子查询所得到的结果相同。也就是说,该列可以使用关联子查询进行创建。问题就是应该在什么地方使用这个关联子查询。
解答:
关键点就在根据商品种类得出均价,语句如下:
CREATE VIEW AvgPriceByType AS
SELECT product_id,product_name,product_type,sale_price,
(SELECT AVG(sale_price) FROM product p1
WHERE p2.product_type=p1.product_type) AS sale_price_all
FROM product p2;
SELECT * FROM AvgPriceByType;

第二部分

练习题4.5

运算或者函数中含有 NULL 时,结果全都会变为 NULL ?(判断题)
解答:
正确。
当运算中含NULL时,比如SELECT * FROM product WHERE purchase_price=NULL;
当函数中含NULL时,比如常见的SUM(NULL).

练习题4.6

对本章中使用的 product(商品)表执行如下 2 条 SELECT 语句,能够得到什么样的结果呢?
image.png
解答:
第一条语句:
image.png
第二条语句:
image.png
返回结果为空,由于运算或函数中含有NULL,结果都会变为NULL,如果硬要筛选NULL对应行,谨记一定要用IS NULL或者IS NOT NULL。

练习题4.7

按照销售单价(sale_price)对练习 6.1 中的 product(商品)表中的商品进行如下分类。
• 低档商品:销售单价在 1000 日元以下(T 恤衫、办公用品、叉子、擦菜板、圆珠笔)
• 中档商品:销售单价在 1001 日元以上 3000 日元以下(菜刀)
• 高档商品:销售单价在 3001 日元以上(运动 T 恤、高压锅)
请编写出统计上述商品种类中所包含的商品数量的 SELECT 语句,结果如下所示。
执行结果:
image.png
解答:
SELECT SUM(CASE WHEN sale_price <= 1000 THEN 1 ELSE 0 END) AS low_price,
SUM(CASE WHEN sale_price > 1000 AND sale_price <= 3000 THEN 1 ELSE 0 END) AS mid_price,
SUM(CASE WHEN sale_price > 3000 THEN 1 ELSE 0 END) AS high_price
FROM product;

小结:

1,关于子查询:

A,子查询需要用括号括起来。子查询中也可以再包含子查询,嵌套可以多至32层;
B,子查询不能够检索数据类型为varchar(max)、nvarchar(max) 和varbinary(max)的列;
C,子查询使用order by时,只能在外层使用,不能在内层使用;

  1. <br />