一、要点回忆
q1:ch03主要讲了哪些内容?
主要讲了视图、谓词两大块内容。接下来依次做简要回顾:
- 视图部分,主要学习了视图的定义、视图与表的练习、视图的创建、删除、修改(ALTER)、更新(UPDATE)
- 谓词,返回值是TRUE/FLASE/UNKNOW,包括like,between,in/not in ,exists, case
- 子查询(嵌套子查询,标量子查询,关联子查询)
q2:视图与表的区别是什么?操作试图要注意哪些?
视图不是表,视图是虚表,视图基于表。
update视图中表的数据时,会同步修改相应表中的数据,应当避免这种操作。
q3:case表达式的语法是怎样的?
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
.
ELSE <表达式> # else null 是默认值,可省略
END
二、课后练习
3.1 创建出满足下述三个条件的视图(视图名称为 ViewPractice5_1)
CREATE VIEW ViewPractice5_1(product_name, sale_price, regist_date)
AS
SELECT product_name, sale_price, regist_data # condition3
FROM productcopy
WHERE sale_price >= '1000' # condition1
AND regist_data = '20090920' # condition 2
ORDER BY sale_price ASC;
SELECT * FROM ViewPractice5_1;
3.2 向视图中插入如下数据会报错,因为列product_type not null
INSERT INTO ViewPractice5_1 VALUES (' 刀子 ', 300, '2009-11-02');
3.3 关联子查询
SELECT product_id,
product_name,
product_type,
sale_price,
(SELECT AVG(sale_price)
FROM product AS p2
WHERE p1.product_type = p2.product_type) AS AvgPriceByType
FROM product AS p1;
3.5 判断
四则运算中含有 NULL 时,运算结果一定会变为NULL。
3.6 谓词in
结果不一样,语句1能够查询出数据,语句2查询结果为空。因为IN、NOT IN 无法选取出NULL数据的,选取NULL数据只能使用 IS NULL、IS NOT NULL。
语句1的结果:
语句2结果为空,因为谓词 NOT IN 不能匹配 NULL。
实验发现,IN 与 IN NULL、IN NOT NULL 查询结果一样,如下所示:
SELECT product_name, purchase_price
FROM product
WHERE purchase_price IN (500, 2800, 5000);
# WHERE purchase_price IN (500, 2800, 5000, NULL);
# WHERE purchase_price IN (500, 2800, 5000, NOT NULL);
3.7 统计低档、中档、高档商品的数量
SELECT COUNT(case WHEN sale_price < 1001
THEN sale_price
ELSE NULL END) AS low_price,
COUNT(case WHEN sale_price BETWEEN 1001 AND 3000 # 闭区间
THEN sale_price
ELSE NULL END) AS mid_price,
COUNT(case WHEN sale_price >= 3001
THEN sale_price END) AS high_price # ELSE NULL 省略
FROM product;