第三章
3.1 请指出下述 SELECT 语句中所有的语法错误。
SELECT product_id, SUM(product_name) -- 本 SELECT 语句中存在错误。 FROM Product GROUP BY product_type WHERE regist_date > '2009-09-01';
答:① GROUP BY应该在WHERE后面
②SELECT中不能出现GROUP BY中不包含的列
3.2 请编写一条 SELECT 语句,求出销售单价( sale_price 列)合计值是进货单价( purchase_price 列)合计值 1.5 倍的商品种类。执行结果如下所示。
答:
SELECT product_type,SUM(sale_price) AS "售价总和",SUM(purchase_price) AS "进价总和" FROM Productbook GROUP BY product_type HAVING SUM(sale_price)>SUM(purchase_price)*1.5;
3.3 此前我们曾经使用 SELECT 语句选取出了 Product ( 商品 ) 表中的全部记录。当时我们使用了 ORDER BY 子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考 ORDER BY 子句的内容。
答:
SELECT product_id,product_name,product_type,sale_price,purchase_price,regist_date FROM Productbook ORDER BY regist_date DESC,sale_price;
第四章
4.1 A 先生在自己的计算机(电脑)上,使用 CREATE TABLE 语句创建出了一张空的 Product (商品)表,并执行了如下的 SQL 语句向其中插入数据。
BEGIN TRANSACTION; INSERT INTO Product VALUES ('0001', 'T 恤衫 ', ' 衣服 ', 1000, 500, '2008-09-20'); INSERT INTO Product VALUES ('0002', ' 打孔器 ', ' 办公用品 ', 500, 320, '2008-09-11'); INSERT INTO Product VALUES ('0003', ' 运动 T 恤 ', ' 衣服 ', 4000, 2800, NULL);
紧接着,B 先生使用其他的计算机连接上该数据库,执行了如下 SELECT语句。这时 B 先生能得到怎样的查询结果呢?
SELECT * FROM Product;
答:只有表头,没有提交COMMIT;
4.2 如下所示,有一张包含 3 条记录的 Product 表。
使用如下的 INSERT 语句复制这 3 行数据,应该就能够将表中的数据增加为 6 行。请说出该语句的执行结果
INSERT INTO Product SELECT * FROM Product;
答:会出现错误,因为主键不允许重复,如果执行成功商品编号会重复,就无法通过商品编号进行唯一查询了
4.3 以练习 4.2 中的 Product 表为基础,再创建另外一张包含利润列的新表ProductMargin (商品利润)
-- 商品利润表 CREATE TABLE ProductMargin (product_id CHAR(4) NOT NULL, product_name VARCHAR(100) NOT NULL, sale_price INTEGER, purchase_price INTEGER, margin INTEGER, PRIMARY KEY(product_id));
请写出向上述表中插入如下数据的 SQL 语句,其中的利润可以简单地通过对 Product 表中的数据进行计算(销售单价 - 进货单价)得出
答:
INSERT INTO ProductMargin SELECT product_id,product_name,sale_price,purchase_price,sale_price-purchase_price FROM Productbook;
4.4 对练习 4.3 中的 ProductMargin 表的数据进行如下更改。
1. 将运动 T 恤的销售单价从 4000 日元下调至 3000 日元。
2. 根据上述结果再次计算运动 T 恤的利润。
更改后的 ProductMargin 表如下所示。请写出能够实现该变更的SQL语句
答:
UPDATE ProductMargin SET sale_price=3000,margin=sale_price-purchase_price WHERE product_name='运动T恤';
第五章
5.1 创建出满足下述三个条件的视图(视图名称为 ViewPractice5_1 )。使用 Product (商品)表作为参照表,假设表中包含初始状态的 8 行数据。
条件 1: 销售单价大于等于 1000 日元。
条件 2: 登记日期是 2009 年 9 月 20 日。
条件 3: 包含商品名称、销售单价和登记日期三列。
对该视图执行 SELECT 语句的结果如下所示。
SELECT * FROM ViewPractice5_1;
答:
CREATE VIEW ViewPractices5_1(product_name,sale_price,regist_date ) AS SELECT product_name,sale_price,regist_date FROM Productbook WHERE sale_price>=1000 AND regist_date='2009-09-20';
5.2 向习题 5.1 中创建的视图 ViewPractice5_1 中插入如下数据,会得到什么样的结果呢?
INSERT INTO ViewPractice5_1 VALUES (' 刀子 ', 300, '2009-11-02');
答:报错,“错误: 在字段 "product_id" 中空值违反了非空约束;描述: 失败, 行包含(null, 刀子 , null, 300, null, 2009-11-02).”,视图中无法插入数据
5.3 请根据如下结果编写 SELECT 语句,其中 sale_price_all 列为全部商品的平均销售单价。
答:
SELECT product_id,product_name,product_type,sale_price,(SELECT AVG(sale_price) FROM Productbook AS sale_price_all) FROM Productbook;
5.4 请根据习题 5.1 中的条件编写一条 SQL 语句,创建一幅包含如下数据的视图(名称为 AvgPriceByType )。
提示:其中的关键是 avg_sale_price 列。与习题5.3不同,这里需要计算出的是各商品种类的平均销售单价。这与5-3节中使用关联子查询所得到的结果相同。也就是说,该列可以使用关联子查询进行创建。问题就是应该在什么地方使用这个关联子查询。
答:
CREATE VIEW ViewPractice5_4 AS SELECT product_id,product_name,product_type,sale_price, (SELECT AVG(sale_price) FROM Productbook p2 WHERE p2.product_type = p1.product_type GROUP BY p2.product_type) AS avg_sale_price FROM Productbook p1;
第六章
6.1 对本章中使用的 Product (商品)表执行如下 2 条 SELECT 语句,能够得到什么样的结果呢?
答:①选出价格不再是500,2800,5000的商品名称和价格
②选出价格不为500,2800,5000和空的商品名称和价格
6.2 按照销售单价( sale_price )对练习 6.1 中的 Product (商品)表中的商品进行如下分类。
● 低档商品:销售单价在1000日元以下(T恤衫、办公用品、叉子、擦菜板、圆珠笔)
● 中档商品:销售单价在1001日元以上3000日元以下(菜刀)
● 高档商品:销售单价在3001日元以上(运动T恤、高压锅)
请编写出统计上述商品种类中所包含的商品数量的 SELECT 语句,结果如下所示。
答:
SELECT SUM(CASE WHEN sale_price <= 1000 THEN 1 ELSE 0 END) AS low_price, SUM(CASE WHEN sale_price BETWEEN 1001 AND 3000 THEN 1 ELSE 0 END) AS mid_price, SUM(CASE WHEN sale_price >= 3001 THEN 1 ELSE 0 END) AS high_price FROM Product;
第七章
7.1 请说出下述 SELECT 语句的结果。
-- 使用本章中的 Product 表 SELECT * FROM Product UNION SELECT * FROM Product INTERSECT SELECT * FROM Product ORDER BY product_id;
答:Product表的所有数据
7-2 节的代码清单 7-11 中列举的外联结的结果中,高压锅和圆珠笔 2 条记录的商店编号( shop_id )和商店名称( shop_name )都是 NULL 。请使用字符串“不确定”替换其中的 NULL 。期望结果如下所示。
SELECT COALESCE(SP.shop_id, '不确定') AS shop_id, COALESCE(SP.shop_name, '不确定') AS shop_name, P.product_id, P.product_name, P.sale_price FROM ShopProduct SP RIGHT OUTER JOIN Product P ON SP.product_id = P.product_id ORDER BY shop_id;