《SQL基础教程》课后习题

第三章

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;

  

原文地址:https://www.cnblogs.com/xingxyx/p/12507798.html