《SQL必知必会》习题练习答案

  • 第二课 检索数据
  • 第三课 排序检索数据
  • 第四课 过滤数据
  • 第五课 高级数据过滤
  • 第六课 用通配符进行固定
  • 第七课 创建计算字段
  • 第八课 使用函数处理数据
  • 第九课 汇总数据
  • 第十课 分组依据
  • 第十一课 使用子查询

使用的都是MySQL语句,自己留存做笔记用的,不一定对(不过自己测试没问题才会粘过来_(:з」∠)_)

最近更新0923:第十课 分组依据

第二课 检索数据

1.编写SQL语句,从Customers表中检索所有的ID(cust_id)

SELECT cust_id FROM `customers`;

2.OrderItems表包含了所有已订购的产品(有些已被订购多次)。编写SQL语句,检索并列出已订购产品(prod_id)的清单(不用列每个订单,只列出不同产品的清单)。提示:最终应该显示7行。

SELECT DISTINCT prod_id FROM `orderitems`;

3.编写SQL语句,检索Customers表中所有的列,再编写另外的SELECT语句,仅检索顾客的ID。使用注释,注释掉一条SELECT语句,以便运行另一条SELECT语句。(当然,要测试这两个语句。)

/*select * from customers;*/
SELECT cust_id FROM customers;

第三课 排序检索数据

1.编写SQL语句,从Customers中检索所有的顾客名称(cust_names),并按从Z到A的顺序显示结果。

SELECT cust_name FROM customers
ORDER BY `cust_name` DESC;

2.编写SQL语句,从Orders表中检索顾客ID(cust_id)和订单号(order_num),并先按顾客ID对结果进行排序,再按订单日期倒序排列。

SELECT cust_id,order_num
FROM orders
ORDER BY 1,order_date DESC;

3.显然,我们的虚拟商店更喜欢出售比较贵的物品,而且这类物品有很多。编写SQL语句,显示OrderItems表中的数量和价格(item_price),并按数量由多到少、价格由高到低排序。

SELECT `quantity`,`item_price`
FROM`orderitems`
ORDER BY quantity DESC,item_price DESC;

4.下面的SQL语句有问题吗?(尝试在不运行的情况下指出。)

会报错
①order后面缺了个by
vend_name后面没有逗号

第四课 过滤数据

1.编写SQL语句,从Products表中检索产品ID(prod_id)和产品名称(prod_name),只返回价格为9.49美元的产品。

SELECT prod_id,prod_name FROM products
WHERE `prod_price` = 9.49;

2.编写SQL语句,从Products表中检索产品ID(prod_id)和产品名称(prod_name),只返回价格为9美元或更高的产品。

SELECT prod_id,prod_name FROM products
WHERE `prod_price` >= 9;

3.结合第3课和第4课编写SQL语句,从OrderItems表中检索出所有不同订单号(order_num),其中包含100个或更多的产品。

SELECT DISTINCT order_num FROM `orderitems`
WHERE `quantity` >= 100;

4.编写SQL语句,返回Products表中所有价格在3美元到6美元之间的产品的名称(prod_name)和价格(prod_price),然后按价格对结果进行排序。(本题有多种解决方案,我们在下一课再讨论,不过你可以使用目前已学的知识来解决它。)

#①使用and操作符进行连接
SELECT prod_name,prod_price
FROM products
WHERE prod_price >= 3 AND prod_price <= 6
ORDER BY prod_price;
#②使用between-and
SELECT prod_name, prod_price
FROM products
WHERE prod_price BETWEEN 3 AND 6
ORDER BY prod_price;

第五课 高级数据过滤

1.编写SQL语句,从Vendors表中检索供应商名称(vend_name),仅返回加利福尼亚州的供应商(这需要按国家[USA]和州[CA]进行过滤,没准其他国家也存在一个加利福尼亚州)。提示:过滤器需要匹配字符串。

SELECT  vend_name FROM  vendors
WHERE `vend_country` = 'USA' AND `vend_state` = 'CA';

2.编写SQL语句,查找所有至少订购了总量100个的BR01、BR02或BR03的订单。你需要返回OrderItems表的订单号(order_num)、产品ID(prod_id)和数量,并按产品ID和数量进行过滤。提示:根据编写过滤器的方式,可能需要特别注意求值顺序。

#①使用IN操作符
SELECT order_num,prod_id,quantity
FROM orderitems
WHERE quantity >= 100
AND prod_id IN('BR01','BR02','BR03');
#②只使用and/or操作符
SELECT order_num,prod_id,quantity
FROM orderitems
WHERE quantity >= 100
AND (prod_id ='BR01' OR prod_id ='BR02' OR prod_id ='BR03');

3.现在,我们回顾上一课的挑战题。编写SQL语句,返回所有价格在3美元到6美元之间的产品的名称(prod_name)和价格(prod_price)。使用AND,然后按价格对结果进行排序。

SELECT  prod_name,prod_price
FROM products
WHERE prod_price >= 3 AND prod_price <= 6
ORDER BY prod_price;

4.下面的SQL语句有问题吗?(尝试在不运行的情况下指出。)

有问题,order by应该在where子句的后面

第六课 用通配符进行固定

1.编写SQL语句,从Products表中检索产品名称(prod_name)和描述(prod_desc),仅返回描述中包含toy一词的产品。

SELECT prod_name,prod_desc
FROM products
WHERE prod_name LIKE '%toy%';

2.反过来再来一次。编写SQL语句,从Products表中检索产品名称(prod_name)和描述(prod_desc),仅返回描述中未出现toy一词的产品。这次,按产品名称对结果进行排序。

SELECT prod_name,prod_desc
FROM products
WHERE prod_name NOT LIKE '%toy%'
order by prod_name;

where not prod_name like '%toy%'也是正确的语法

3.编写SQL语句,从Products表中检索产品名称(prod_name)和描述(prod_desc),仅返回描述中同时出现toy和carrots的产品。有好几种方法可以执行此操作,但对于这个挑战题,请使用AND和两个LIKE比较。

SELECT prod_name,prod_desc
FROM products
WHERE prod_desc LIKE '%toy%'
AND prod_desc LIKE '%carrots%';

4.来个比较棘手的。我没有特别向你展示这个语法,而是想看看你根据目前已学的知识是否可以找到答案。编写SQL语句,从Products表中检索产品名称(prod_name)和描述(prod_desc),仅返回在描述中以先后顺序同时出现toy和carrots的产品。提示:只需要用带有三个%符号的LIKE即可。

SELECT prod_name,prod_desc
FROM products
WHERE prod_desc LIKE '%toy%carrots%';

第七课 创建计算字段

1.别名的常见用法是在检索出的结果中重命名表的列字段(为了符合特定的报表要求或客户需求)。编写SQL语句,从Vendors表中检索vend_id、vend_name、vend_address和vend_city,将vend_name重命名为vname,将vend_city重命名为vcity,将vend_address重命名为vaddress。按供应商名称对结果进行排序(可以使用原始名称或新的名称)。

SELECT vend_id,vend_name vname,vend_city vcity,vend_address vaddress
FROM `vendors`
ORDER BY vname;

2.我们的示例商店正在进行打折促销,所有产品均降价10%。编写SQL语句,从Products表中返回prod_id、prod_price和sale_price。sale_price是一个包含促销价格的计算字段。提示:可以乘以0.9,得到原价的90%(即10%的折扣)。

SELECT prod_id,prod_price,prod_price * 0.9 AS sale_price
FROM products;

第八课 使用函数处理数据

1.我们的商店已经上线了,正在创建顾客账户。所有用户都需要登录名,默认登录名是其名称和所在城市的组合。编写SQL语句,返回顾客ID(cust_id)、顾客名称(customer_name)和登录名(user_login),其中登录名全部为大写字母,并由顾客联系人的前两个字符(cust_contact)和其所在城市的前三个字符(cust_city)组成。例如,我的登录名是BEOAK(Ben Forta,居住在OakPark)。提示:需要使用函数、拼接和别名。

SELECT cust_id,cust_name,
UPPER(CONCAT(SUBSTR(`cust_contact`,1,2),SUBSTR(`cust_city`,1,3))) AS user_login
FROM `customers`;

ps:使用left函数更方便一点

2.编写SQL语句,返回2020年1月的所有订单的订单号(order_num)和订单日期(order_date),并按订单日期排序。你应该能够根据目前已学的知识来解决此问题,但也可以开卷查阅DBMS文档。

SELECT order_num,order_date
FROM `orders`
WHERE YEAR(order_date) = 2020 AND MONTH(order_date) = 01
ORDER BY order_date;

ps:月份可以写成01也可以写成1,不用加引号。

第九课 汇总数据

1.编写SQL语句,确定已售出产品的总数(使用OrderItems中的quantity列)。

SELECT SUM(quantity)
FROM `orderitems`;

2.修改刚刚创建的语句,确定已售出产品项(prod_item)BR01的总数。

SELECT SUM(quantity)
FROM `orderitems`
WHERE prod_id = 'br01';

3.编写SQL语句,确定Products表中价格不超过10美元的最贵产品的价格(prod_price)。将计算所得的字段命名为max_price。

SELECT MAX(prod_price) AS max_price
FROM products
WHERE prod_price <= 10;

第十课 分组依据

1.OrderItems表包含每个订单的每个产品。编写SQL语句,返回每个订单号(order_num)各有多少行数(order_lines),并按order_lines对结果进行排序。

SELECT order_num,COUNT(order_num) AS order_lines
FROM orderitems
GROUP BY order_num
ORDER BY order_lines;

count后面使用*也行,因为前面select的字段即为要计算的字段

2.编写SQL语句,返回名为cheapest_item的字段,该字段包含每个供应商成本最低的产品(使用Products表中的prod_price),然后从最低成本到最高成本对结果进行排序。

SELECT vend_id,MIN(prod_price) AS cheapest_item
FROM products
GROUP BY vend_id
ORDER BY prod_price;

最后的分组也可以直接少用别称cheapest_item

3.确定最佳顾客非常重要,请编写SQL语句,返回至少含100项的所有订单的订单号(OrderItems表中的order_num)。

SELECT order_num FROM orderitems
GROUP BY order_num
HAVING SUM(quantity) >= 100;

4.确定最佳顾客的另一种方式是看他们花了多少钱。编写SQL语句,返回总价至少为1000的所有订单的订单号(OrderItems表中的order_num)。提示:需要计算总和(item_price乘以quantity)。按订单号对结果进行排序。

SELECT order_num,SUM(item_price*quantity) AS 总价
FROM orderitems
GROUP BY order_num
HAVING SUM(item_price*quantity) >= 1000;

5.下面的SQL语句有问题吗?(尝试在不运行的情况下指出。)

应该是group by order_num
group by 后面需要是实际的列或表达式列,不是用聚集函数计算以后的列。

第十一课 使用子查询

1.使用子查询,返回购买价格为10美元或以上产品的顾客列表。你需要使用OrderItems表查找匹配的订单号(order_num),然后使用Order表检索这些匹配订单的顾客ID(cust_id)。

#刚开始没看见orders表里就有cust_id字段,多嵌套了一层
SELECT  cu.cust_id,cust_name
FROM customers cu
WHERE cu.cust_id IN(SELECT cust_id FROM ordersWHERE order_num IN(SELECT order_num FROM orderitemsWHERE item_price>= 10 ));
#更改如下
SELECT  cust_id
FROM orders
WHERE order_num IN(SELECT order_num FROM orderitemsWHERE item_price>= 10 );

2.你想知道订购BR01产品的日期。编写SQL语句,使用子查询来确定哪些订单(在OrderItems中)购买了prod_id为BR01的产品,然后从Orders表中返回每个产品对应的顾客ID(cust_id)和订单日期(order_date)。按订购日期对结果进行排序。

SELECT cust_id,order_date
FROM orders
WHERE order_num IN(SELECT order_num FROM orderitemsWHERE prod_id = 'br01')
ORDER BY order_date;

3.现在我们让它更具挑战性。在上一个挑战题,返回购买prod_id为BR01的产品的所有顾客的电子邮件(Customers表中的cust_email)。提示:这涉及SELECT语句,最内层的从OrderItems表返回order_num,中间的从Customers表返回cust_id。

SELECT cust_email
FROM customers
WHERE cust_id IN(SELECT cust_idFROM ordersWHERE order_num IN(SELECT order_num FROM orderitemsWHERE prod_id = 'br01')ORDER BY order_date);

4.我们需要一个顾客ID列表,其中包含他们已订购的总金额。编写SQL语句,返回顾客ID(Orders表中的cust_id),并使用子查询返回total_ordered以便返回每个顾客的订单总数。将结果按金额从大到小排序。提示:你之前已经使用SUM()计算订单总数。

SELECT cust_id,(SELECT SUM(item_price*quantity) FROM orderitems WHERE orderitems.`order_num`=orders.`order_num`)  AS price
FROM orders
order by price;

也可以使用连接查询

SELECT cust_id,SUM(item_price*quantity) AS price
FROM orders
INNER JOIN orderitems
ON orders.`order_num`=orderitems.`order_num`
GROUP BY orders.order_num
ORDER BY price;

5.再来。编写SQL语句,从Products表中检索所有的产品名称(prod_name),以及名为quant_sold的计算列,其中包含所售产品的总数(在OrderItems表上使用子查询和SUM(quantity)检索)。

SELECT prod_name,(SELECT SUM(quantity) FROM orderitemsWHERE products.prod_id = orderitems.`prod_id`) AS quant_sold
FROM products;

也可以使用连接查询

SELECT prod_name,SUM(quantity)
FROM products
LEFT JOIN orderitems
ON products.`prod_id` = orderitems.`prod_id`
GROUP BY products.`prod_id`;

SQL必知必会习题练习相关推荐

  1. 《MySQL必知必会》所有SQL语句图表集合(可作为查询表使用)---已完结

    本篇文章是对<MySQL必知必会>所有语句知识点的图表集合,适合快速查询遗忘的SQL语句. 本文的脉络结构,首先先给出<MySQL必知必会>的目录和本书中用到的数据表的UML图 ...

  2. asp sql ip地址排序_SQL必知必会读书笔记,30分钟入门SQL!

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 来源:https://segmentfault.com/p/1210000011760 ...

  3. GitHub#SQL#:SQL必知必会

    https://github.com/CyC2018/Interview-Notebook 一.基础 二.创建表 三.修改表 四.插入 五.更新 六.删除 七.查询 八.排序 九.过滤 十.通配符 十 ...

  4. sql必知必会的数据初始化

    之前已经配置好mysql的工作环境,但是还缺少可以进行操作的文件,即缺少对应的一个数据库和其中的5个表. 下载相关代码 在网址http://www.forta.com/books/0672325675 ...

  5. mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)

    站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...

  6. 《MySQL必知必会》SQL文件

    <MySQL必知必会>SQL文件: 表的创建和外键绑定: # 在Mysql中取消外键约束 SET FOREIGN_KEY_CHECKS=0; DROP TABLE customers; D ...

  7. SQL Server必知必会

    SQL Server必知必会 2009-10-27-17:57:57 Structure     Query     Language:SQL 结构化       查询      语言 数据库产品: ...

  8. 【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作

    上个笔记主要介绍了利用SELECT语句检索单个/多个/所有列,并利用DISTINCT关键字检索具有唯一性的值.利用LIMIT/OFFSET子句限制结果:以及利用ORDER BY子句排序检索出的数据,主 ...

  9. SQL必知必会(一)SQL基础篇

    SQL基础 1.SQL语言 2.SQL开发规范 3.DB.DBS 和 DBMS 的区别是什么 4.SQL执行顺序 1.oracle中执行顺序 2.MYSQL执行顺序 3.sql关键字执行顺序 5. I ...

  10. sql 数据库前两列值乘_SQL | SQL 必知必会笔记 (一 )

    原文:SQL | SQL 必知必会笔记 (一 ) 作者: PyStaData 基本概念 一些规则 多条 SQL 语句必须以分号分隔. SQL 不区分大小写,但一般习惯关键字用大写,列名和表名使用小写. ...

最新文章

  1. kotlin集合操作符——生产操作符
  2. 自然场景下的文字检测:从多方向迈向任意形状
  3. [BZOJ3566][SHOI2014]概率充电器
  4. python中reload作用_import reload __import__在python中的区别
  5. 北大计算机科学与技术怎么样,国内高校计算机科学与技术学科排名,浙大表现亮眼,北大荣登榜首...
  6. js 对象及空对象或数组及空数组的判断与比较
  7. 从Android界面开发谈起
  8. 外边距的典型应用-让块级盒子水平居中(HTML、CSS)
  9. C#的表达式,类型和变量
  10. python对于设计师有什么用-《学习PYTHON—做个有编程能力的设计师》
  11. HTML1.0 - html 环境搭建 开发工具
  12. JavaScript学习——JavaScript 循环
  13. 大白话vue——slot的作用与使用
  14. linux下类everthing搜索工具
  15. c++语言杨辉三角,杨辉三角 (C++代码)
  16. java poi Excel加密文件导出和下载
  17. 《C语言详解》_by_Hanly.学习笔记(1)
  18. 如何对一个水杯进行测试?(详细)
  19. ug编程内公差和外公差是什么_ug编程内外公差是什么
  20. Taro下拉刷新,上拉加载更多

热门文章

  1. No controller found
  2. 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)
  3. Linux系统GCC常用命令和GCC编译过程描述
  4. zoj 3261 逆向并查集+离线处理
  5. group by调优的一些测试
  6. FZU《C语言程序综合设计》
  7. Android开发汇总帖子
  8. ID与Class的区别(#与。的区别)CSS
  9. css木马式自动轮播,基于jQuery实现自动轮播旋转木马特效_jquery
  10. android图片底部居中对齐,Android 解决图文混排,图片和文字居中对齐问题(ImageSpan)...