《SQL基础教程》课后习题
第三章
3.1 请指出下述 SELECT 语句中所有的语法错误。
1 2 3 4 5 | 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 倍的商品种类。执行结果如下所示。
答:
1 | 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 子句的内容。
答:
1 | 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 语句向其中插入数据。
1 2 3 4 | 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 先生能得到怎样的查询结果呢?
1 | SELECT * FROM Product; |
答:只有表头,没有提交COMMIT;
4.2 如下所示,有一张包含 3 条记录的 Product 表。
使用如下的 INSERT 语句复制这 3 行数据,应该就能够将表中的数据增加为 6 行。请说出该语句的执行结果
1 | INSERT INTO Product SELECT * FROM Product; |
答:会出现错误,因为主键不允许重复,如果执行成功商品编号会重复,就无法通过商品编号进行唯一查询了
4.3 以练习 4.2 中的 Product 表为基础,再创建另外一张包含利润列的新表ProductMargin (商品利润)
1 2 3 4 5 6 7 8 | -- 商品利润表 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 表中的数据进行计算(销售单价 - 进货单价)得出
答:
1 | 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语句
答:
1 | 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 语句的结果如下所示。
1 | SELECT * FROM ViewPractice5_1; |
答:
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 中插入如下数据,会得到什么样的结果呢?
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 列为全部商品的平均销售单价。
答:
1 | 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节中使用关联子查询所得到的结果相同。也就是说,该列可以使用关联子查询进行创建。问题就是应该在什么地方使用这个关联子查询。
答:
1 2 3 4 5 6 7 | 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 语句,结果如下所示。
答:
1 2 3 4 5 6 7 | 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 语句的结果。
1 2 3 4 5 6 7 8 9 10 | -- 使用本章中的 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 。期望结果如下所示。
1 2 3 4 5 6 7 8 | 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; |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)