创建出满足下述三个条件的视图(视图名称为 ViewPractice5_1)。使用 product(商品)表作为参照表,假设表中包含初始状态的 8 行数据。
对该视图执行 SELECT 语句的结果如下所示。
SELECT * FROM ViewPractice5_1;
执行结果
product_name | sale_price | regist_date --------------+------------+------------ T恤衫 | 1000 | 2009-09-20 菜刀 | 3000 | 2009-09-20
向习题一中创建的视图 ViewPractice5_1 中插入如下数据,会得到什么样的结果呢?
INSERT INTO ViewPractice5_1 VALUES (' 刀子 ', 300, '2009-11-02');
请根据如下结果编写 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
请根据习题一中的条件编写一条 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
提示:其中的关键是 avg_sale_price 列。与习题三不同,这里需要计算出的 是各商品种类的平均销售单价。这与使用关联子查询所得到的结果相同。 也就是说,该列可以使用关联子查询进行创建。问题就是应该在什么地方使用这个关联子查询。
运算或者函数中含有 NULL 时,结果全都会变为NULL ?(判断题)
对本章中使用的 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);
按照销售单价( sale_price)对练习 6.1 中的 product(商品)表中的商品进行如下分类。
请编写出统计上述商品种类中所包含的商品数量的 SELECT 语句,结果如下所示。
执行结果
TIPS:
CONCAT ,连接null,str1 、str2会显示NULL
mysql中,将 _
下划线匹配任意 1 个字符
使用 _(下划线)来代替 %,与 % 不同的是,它代表了“任意 1 个字符”。
用IN 和 NOT IN 时是无法选取出NULL数据的。
实际结果也是如此,上述两组结果中都不包含进货单价为 NULL 的叉子和圆珠笔。 NULL 只能使用 IS NULL 和 IS NOT NULL 来进行判断。
AN:
1、练习一:
--product sale_price not null
create view ViewPractice5_1 AS SELECT product_name,sale_price,regist_date from product
where sale_price>=1000 and regist_date='2009-09-20' and product_name is not null and regist_name is not null;
2、练习二:
product table中product_id字段非空,viewpractice5_1无默认值,因此在此环境下insert into会报错。
insert into ViewPractice5_1 values('刀子',300,'2009-11-02'); [语句1]: insert into ViewPractice5_1 values('刀子',300,'2009-11-02') Field of view 'mydb.viewpractice5_1' underlying table doesn't have a default value TraceId : 0bc3b4af16263591969808123e3675
3、练习三:
--查询均价 select product_id,product_name,product_type,sale_price,avg(sale_price) as sale_price_all from product group by product_name;
4、练习四:
--创建视图 create view AvgPriceByType as select product_id,product_name,product_type,sale_price,avg(sale_price) as avg_sale_price group by product_name where where sale_price>=1000 and regist_date='2009-09-20' and product_name is not null and regist_name is not null;
5、练习五:
运算或者函数中含有 NULL 时,结果全都会变为NULL ?(判断题)
是的,null返回值也为null
6、3.6
① 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);
sql1中,purchase_price不为500,2800,5000的productt
sql2中,purchase_price不为500,2800,5000,null
可以看到有null时,结果为null
3.7
select count(case when sale_price<1000 then product_name ELSE null END) as low_price, count(case when sale_price BETWEEN 1000 and 3000 then product_name ELSE null END) as mid_price, count(case when sale_price>3001 then product_name ELSE null END ) as high_price from product;