当前位置:网站首页>数据库系统原理与应用教程(065)—— MySQL 练习题:操作题 62-70(九):分组查询与子查询
数据库系统原理与应用教程(065)—— MySQL 练习题:操作题 62-70(九):分组查询与子查询
2022-07-30 17:26:00 【睿思达DBA_WGX】
数据库系统原理与应用教程(065)—— MySQL 练习题:操作题 62-70(九):分组查询与子查询
62、分组查询(1)
数据表:OrderItems,表中数据如下:
| order_num |
|---|
| a002 |
| a002 |
| a002 |
| a004 |
| a007 |
【问题】编写 SQL 语句,返回每个订单号(order_num)各有多少行数(order_lines),并按 order_lines 对结果进行升序排序。查询结果如下:
| order_num | order_lines |
|---|---|
| a004 | 1 |
| a007 | 1 |
| a002 | 3 |
表结构及数据如下:
/* DROP TABLE IF EXISTS `OrderItems`; CREATE TABLE IF NOT EXISTS `OrderItems`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号' ); INSERT `OrderItems` VALUES ('a002'),('a002'),('a002'),('a004'),('a007'); */
解答:
/* select order_num, count(*) order_lines from OrderItems group by order_num order by order_lines; */
mysql> select order_num, count(*) order_lines
-> from OrderItems
-> group by order_num order by order_lines;
+-----------+-------------+
| order_num | order_lines |
+-----------+-------------+
| a004 | 1 |
| a007 | 1 |
| a002 | 3 |
+-----------+-------------+
3 rows in set (0.00 sec)
63、分组查询(2)
有数据表:Products,表中数据如下:
| vend_id | prod_price |
|---|---|
| a0011 | 100 |
| a0019 | 0.1 |
| b0019 | 1000 |
| b0019 | 6980 |
| b0019 | 20 |
【问题】编写 SQL 语句,返回名为 cheapest_item 的字段,该字段包含每个供应商成本最低的产品(使用 Products 表中的 prod_price),然后从最低成本到最高成本对结果进行升序排序。查询结果如下:
| vend_id | cheapest_item |
|---|---|
| a0019 | 0.1 |
| b0019 | 20 |
| a0011 | 100 |
表结构及数据如下:
/* DROP TABLE IF EXISTS `Products`; CREATE TABLE IF NOT EXISTS `Products` ( `vend_id` VARCHAR(255) NOT NULL COMMENT '供应商ID', `prod_price` DOUBLE NOT NULL COMMENT '产品价格' ); INSERT INTO `Products` VALUES ('a0011',100), ('a0019',0.1), ('b0019',1000), ('b0019',6980), ('b0019',20); */
解答:
/* select vend_id, min(prod_price) cheapest_item from Products group by vend_id order by cheapest_item; */
mysql> select vend_id, min(prod_price) cheapest_item
-> from Products
-> group by vend_id
-> order by cheapest_item;
+---------+---------------+
| vend_id | cheapest_item |
+---------+---------------+
| a0019 | 0.1 |
| b0019 | 20 |
| a0011 | 100 |
+---------+---------------+
3 rows in set (0.00 sec)
64、分组查询(3)
数据表:OrderItems,表中数据如下:
| order_num | quantity |
|---|---|
| a1 | 105 |
| a2 | 1100 |
| a2 | 200 |
| a4 | 1121 |
| a5 | 10 |
| a2 | 19 |
| a7 | 5 |
【问题】编写 SQL 语句,返回订单数量总和不小于 100 的所有订单号,最后结果按照订单号升序排序。查询结果如下:
| order_num |
|---|
| a1 |
| a2 |
| a4 |
表结构及数据如下:
/* DROP TABLE IF EXISTS `OrderItems`; CREATE TABLE IF NOT EXISTS `OrderItems`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号', quantity INT(255) NOT NULL COMMENT '商品数量' ); INSERT `OrderItems` VALUES ('a1',105),('a2',200),('a4',1121),('a5',10),('a7',5); */
解答:
/* select order_num from OrderItems group by order_num having sum(quantity) >= 100 order by order_num; */
mysql> select order_num from OrderItems
-> group by order_num having sum(quantity) >= 100
-> order by order_num;
+-----------+
| order_num |
+-----------+
| a1 |
| a2 |
| a4 |
+-----------+
3 rows in set (0.00 sec)
65、分组查询(4)
数据表:OrderItems,表中数据如下:
| order_num | item_price | quantity |
|---|---|---|
| a1 | 10 | 105 |
| a2 | 1 | 1100 |
| a2 | 1 | 200 |
| a4 | 2 | 1121 |
| a5 | 5 | 10 |
| a2 | 1 | 19 |
| a7 | 7 | 5 |
【问题】编写 SQL 语句,返回订单总价不小于 1000 的所有订单号,最后的结果按订单号进行升序排序(订单总价 = item_price * quantity)。查询结果如下:
| order_num | total_price |
|---|---|
| a1 | 1050 |
| a2 | 1319 |
| a4 | 2242 |
表结构及数据如下:
/* DROP TABLE IF EXISTS `OrderItems`; CREATE TABLE IF NOT EXISTS `OrderItems`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号', item_price INT(16) NOT NULL COMMENT '售出价格', quantity INT(16) NOT NULL COMMENT '商品数量' ); INSERT `OrderItems` VALUES ('a1',10,105),('a2',1,1100),('a2',1,200),('a4',2,1121),('a5',5,10),('a2',1,19),('a7',7,5); */
解答:
/* select order_num, sum(item_price * quantity) total_price from OrderItems group by order_num having total_price >= 1000 order by order_num; */
mysql> select order_num, sum(item_price * quantity) total_price
-> from OrderItems
-> group by order_num having total_price >= 1000
-> order by order_num;
+-----------+-------------+
| order_num | total_price |
+-----------+-------------+
| a1 | 1050 |
| a2 | 1319 |
| a4 | 2242 |
+-----------+-------------+
3 rows in set (0.01 sec)
66、子查询(1)
数据表:OrderItems,表中数据如下:
| order_num | item_price |
|---|---|
| a1 | 10 |
| a2 | 1 |
| a2 | 1 |
| a4 | 2 |
| a5 | 5 |
| a2 | 1 |
| a7 | 7 |
数据表:Orders,表中数据如下:
| order_num | cust_id |
|---|---|
| a1 | cust10 |
| a2 | cust1 |
| a2 | cust1 |
| a4 | cust2 |
| a5 | cust5 |
| a2 | cust1 |
| a7 | cust7 |
【问题】使用子查询,查询购买价格为 10 元或以上产品的顾客列表。查询结果如下:
| cust_id |
|---|
| cust10 |
表结构及数据如下:
/* DROP TABLE IF EXISTS `OrderItems`; DROP TABLE IF EXISTS `Orders`; CREATE TABLE IF NOT EXISTS `OrderItems`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号', item_price INT(16) NOT NULL COMMENT '售出价格' ); CREATE TABLE IF NOT EXISTS `Orders`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号', cust_id VARCHAR(255) NOT NULL COMMENT '顾客id' ); INSERT `OrderItems` VALUES ('a1',10),('a2',1),('a2',1),('a4',2),('a5',5),('a2',1),('a7',7); INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a2','cust1'),('a4','cust2'),('a5','cust5'),('a2','cust1'),('a7','cust7'); */
解答:
/* select cust_id from Orders where order_num in (select order_num from OrderItems where item_price >= 10); */
mysql> select cust_id from Orders
-> where order_num in
-> (select order_num from OrderItems where item_price >= 10);
+---------+
| cust_id |
+---------+
| cust10 |
+---------+
1 row in set (0.00 sec)
67、子查询(2)
数据表:OrderItems,表中数据如下:
| prod_id | order_num |
|---|---|
| BR01 | a0001 |
| BR01 | a0002 |
| BR02 | a0003 |
| BR02 | a0013 |
数据表:Orders,表中数据如下:
| order_num | cust_id | order_date |
|---|---|---|
| a0001 | cust10 | 2022-01-01 00:00:00 |
| a0002 | cust1 | 2022-01-01 00:01:00 |
| a0003 | cust1 | 2022-01-02 00:00:00 |
| a0013 | cust2 | 2022-01-01 00:20:00 |
【问题】编写 SQL 语句,查询哪些订单(在 OrderItems 中)购买了 prod_id 为 “BR01” 的产品,返回每个产品对应的顾客 ID(cust_id)和订单日期(order_date),按订购日期对结果进行升序排序。查询结果如下:
| cust_id | order_date |
|---|---|
| cust10 | 2022-01-01 00:00:00 |
| cust1 | 2022-01-01 00:01:00 |
表结构及数据如下:
/* DROP TABLE IF EXISTS `OrderItems`; DROP TABLE IF EXISTS `Orders`; CREATE TABLE IF NOT EXISTS `OrderItems`( prod_id VARCHAR(255) NOT NULL COMMENT '产品id', order_num VARCHAR(255) NOT NULL COMMENT '商品订单号' ); CREATE TABLE IF NOT EXISTS `Orders`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号', cust_id VARCHAR(255) NOT NULL COMMENT '顾客id', order_date TIMESTAMP NOT NULL COMMENT '下单时间' ); INSERT `OrderItems` VALUES ('BR01','a0001'),('BR01','a0002'),('BR02','a0003'),('BR02','a0013'); INSERT `Orders` VALUES ('a0001','cust10','2022-01-01 00:00:00'),('a0002','cust1','2022-01-01 00:01:00'),('a0003','cust1','2022-01-02 00:00:00'),('a0013','cust2','2022-01-01 00:20:00'); */
解答:
/* select cust_id, order_date from Orders where order_num in (select order_num from OrderItems where prod_id = 'BR01') order by order_date; */
mysql> select cust_id, order_date from Orders
-> where order_num in (select order_num from OrderItems where prod_id = 'BR01')
-> order by order_date;
+---------+---------------------+
| cust_id | order_date |
+---------+---------------------+
| cust10 | 2022-01-01 00:00:00 |
| cust1 | 2022-01-01 00:01:00 |
+---------+---------------------+
2 rows in set (0.00 sec)
68、子查询(3)
数据表:OrderItems,表中数据如下:
| prod_id | order_num |
|---|---|
| BR01 | a0001 |
| BR01 | a0002 |
| BR02 | a0003 |
| BR02 | a0013 |
数据表:Orders,表中数据如下:
| order_num | cust_id | order_date |
|---|---|---|
| a0001 | cust10 | 2022-01-01 00:00:00 |
| a0002 | cust1 | 2022-01-01 00:01:00 |
| a0003 | cust1 | 2022-01-02 00:00:00 |
| a0013 | cust2 | 2022-01-01 00:20:00 |
数据表:Customers,表中数据如下:
| cust_id | cust_email |
|---|---|
| cust10 | [email protected] |
| cust1 | [email protected] |
| cust2 | [email protected] |
【问题】查询购买 prod_id 为 BR01 的产品的所有顾客的电子邮件。查询结果如下:
| cust_email |
|---|
| [email protected] |
| [email protected] |
表结构及数据如下:
/* DROP TABLE IF EXISTS `OrderItems`; CREATE TABLE IF NOT EXISTS `OrderItems`( prod_id VARCHAR(255) NOT NULL COMMENT '产品id', order_num VARCHAR(255) NOT NULL COMMENT '商品订单号' ); INSERT `OrderItems` VALUES ('BR01','a0001'),('BR01','a0002'),('BR02','a0003'),('BR02','a0013'); DROP TABLE IF EXISTS `Orders`; CREATE TABLE IF NOT EXISTS `Orders`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号', cust_id VARCHAR(255) NOT NULL COMMENT '顾客id', order_date TIMESTAMP NOT NULL COMMENT '下单时间' ); INSERT `Orders` VALUES ('a0001','cust10','2022-01-01 00:00:00'),('a0002','cust1','2022-01-01 00:01:00'),('a0003','cust1','2022-01-02 00:00:00'),('a0013','cust2','2022-01-01 00:20:00'); DROP TABLE IF EXISTS `Customers`; CREATE TABLE IF NOT EXISTS `Customers`( cust_id VARCHAR(255) NOT NULL COMMENT '顾客id', cust_email VARCHAR(255) NOT NULL COMMENT '顾客email' ); INSERT `Customers` VALUES ('cust10','[email protected]'),('cust1','[email protected]'),('cust2','[email protected]'); */
解答:
/* select cust_email from Customers where cust_id in (select cust_id from Orders where order_num in (select order_num from OrderItems where prod_id = 'BR01') ); */
mysql> select cust_email from Customers where cust_id in
-> (select cust_id from Orders where order_num in
-> (select order_num from OrderItems where prod_id = 'BR01')
-> );
+-----------------+
| cust_email |
+-----------------+
| cust10@cust.com |
| cust1@cust.com |
+-----------------+
2 rows in set (0.00 sec)
69、子查询(4)
数据表:OrderItems(订单信息),表中有订单号:order_num,商品售出价格:item_price,商品数量:quantity。表中的数据如下:
| order_num | item_price | quantity |
|---|---|---|
| a0001 | 10 | 105 |
| a0002 | 1 | 1100 |
| a0002 | 1 | 200 |
| a0013 | 2 | 1121 |
| a0003 | 5 | 10 |
| a0003 | 1 | 19 |
| a0003 | 7 | 5 |
数据表:Orders(订单表),表中有订单号:order_num,客户号:cust_id,表中数据如下:
| order_num | cust_id |
|---|---|
| a0001 | cust10 |
| a0002 | cust1 |
| a0003 | cust1 |
| a0013 | cust2 |
【问题】编写 SQL语句,查询顾客 ID(Orders 表中的 cust_id)以及每个顾客的订单总数(total_ordered),将结果按金额从大到小排序。查询结果如下:
| cust_id | total_ordered |
|---|---|
| cust2 | 2242 |
| cust1 | 1404 |
| cust10 | 1050 |
表结构及数据如下:
/* DROP TABLE IF EXISTS `OrderItems`; CREATE TABLE IF NOT EXISTS `OrderItems`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号', item_price INT(16) NOT NULL COMMENT '售出价格', quantity INT(16) NOT NULL COMMENT '商品数量' ); INSERT `OrderItems` VALUES ('a0001',10,105),('a0002',1,1100),('a0002',1,200),('a0013',2,1121),('a0003',5,10),('a0003',1,19),('a0003',7,5); DROP TABLE IF EXISTS `Orders`; CREATE TABLE IF NOT EXISTS `Orders`( order_num VARCHAR(255) NOT NULL COMMENT '商品订单号', cust_id VARCHAR(255) NOT NULL COMMENT '顾客id' ); INSERT `Orders` VALUES ('a0001','cust10'),('a0002', 'cust1'),('a0003','cust1'),('a0013','cust2'); */
解答:
/* select o.cust_id, sum(item_price * quantity) total_ordered from OrderItems oi join Orders o on oi.order_num = o.order_num group by o.cust_id order by total_ordered desc; */
mysql> select o.cust_id, sum(item_price * quantity) total_ordered
-> from OrderItems oi join Orders o on oi.order_num = o.order_num
-> group by o.cust_id
-> order by total_ordered desc;
+---------+---------------+
| cust_id | total_ordered |
+---------+---------------+
| cust2 | 2242 |
| cust1 | 1404 |
| cust10 | 1050 |
+---------+---------------+
3 rows in set (0.00 sec)
70、子查询(5)
数据表:Products,包含产品名称:prod_name、产品 id:prod_id,表中数据如下:
| prod_id | prod_name |
|---|---|
| a0001 | egg |
| a0002 | sockets |
| a0013 | coffee |
| a0003 | cola |
数据表:OrderItems(订单商品表),包含产品 id:prod_id、售出数量:quantity,表中数据如下:
| prod_id | quantity |
|---|---|
| a0001 | 105 |
| a0002 | 1100 |
| a0002 | 200 |
| a0013 | 1121 |
| a0003 | 10 |
| a0003 | 19 |
| a0003 | 5 |
【问题】
【问题】编写 SQL 语句,从 Products 表中检索所有的产品名称(prod_name),以及名为 quant_sold(产品售出数量总和)的计算列。查询结果如下:
| prod_name | quant_sold |
|---|---|
| egg | 105 |
| sockets | 1300 |
| coffee | 1121 |
| cola | 34 |
表结构及数据如下:
/* DROP TABLE IF EXISTS `Products`; CREATE TABLE IF NOT EXISTS `Products` ( `prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID', `prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称' ); INSERT INTO `Products` VALUES ('a0001','egg'), ('a0002','sockets'), ('a0013','coffee'), ('a0003','cola'); DROP TABLE IF EXISTS `OrderItems`; CREATE TABLE IF NOT EXISTS `OrderItems`( prod_id VARCHAR(255) NOT NULL COMMENT '产品id', quantity INT(16) NOT NULL COMMENT '商品数量' ); INSERT `OrderItems` VALUES ('a0001',105),('a0002',1100),('a0002',200),('a0013',1121),('a0003',10),('a0003',19),('a0003',5); */
解答:
/* select p.prod_name, sum(quantity) quant_sold from OrderItems o join Products p on o.prod_id = p.prod_id group by p.prod_name; */
mysql> select p.prod_name, sum(quantity) quant_sold
-> from OrderItems o join Products p on o.prod_id = p.prod_id
-> group by p.prod_name;
+-----------+------------+
| prod_name | quant_sold |
+-----------+------------+
| coffee | 1121 |
| cola | 34 |
| egg | 105 |
| sockets | 1300 |
+-----------+------------+
4 rows in set (0.00 sec)
边栏推荐
- Error occurred while trying to proxy request The project suddenly can't get up
- 习题:变量、常量和基本数据类型
- 首发!阿里技术大牛最新耗时半个月整理出最全MySQL性能优化和高可用架构技术宝典,直接封神!
- Analysis and Simulation of Short Circuit Fault in Power System Based on MATLAB
- Tensorflow模型量化(Quantization)原理及其实现方法
- Oracle动态监听与静态监听详解
- KDD 2020 | 深入浅出优势特征蒸馏在淘宝推荐中的应用
- 代码越写越乱?那是因为你没用责任链
- 华为云数据治理生产线DataArts,让“数据‘慧’说话”
- 万华化学精细化工创新产品大会
猜你喜欢

Error occurred while trying to proxy request The project suddenly can't get up

Error EPERM operation not permitted, mkdir 'Dsoftwarenodejsnode_cache_cacach Two solutions

首发!阿里技术大牛最新耗时半个月整理出最全MySQL性能优化和高可用架构技术宝典,直接封神!

华为无线设备配置Mesh业务

游戏化产品搭建思路的拆解与探究

LeetCode318: Maximum product of word lengths

C语言向MySQL插入数据

Summary of String Copy, Concatenation, Comparison and Split Functions (1)

592. Fraction Addition and Subtraction

理解实现搜索二叉树
随机推荐
C陷阱与缺陷 第6章 预处理器 6.4 宏并不是类型定义
FastJson反序列化漏洞(复现)
升级 MDK 5.37 后的问题处理: AC6编译选项, printf, 重启失效等
OpenCV形状检测
Test Management and Specification
顺通海关查验预约综合管理系统
牛客网刷题——运算符问题
链表Oj练习题 纯C语言
每日一题:两数之和
微信小程序picker滚动选择器使用详解
图注意力机制
【AAAI2020】阿里DMR:融合Matching思想的深度排序模型
DLCM - 基于列表上下文信息的重排序模型
基于模糊PID的液压舵机伺服系统
windwons 下GPU环境和pytorch安装
Error EPERM operation not permitted, mkdir ‘Dsoftwarenodejsnode_cache_cacach两种解决办法
阿里巴巴中国站获得1688商品分类 API
Weka 3.8.6安装与Weka 3.8.6功能介绍
腾讯专家献上技术干货,带你一览腾讯广告召回系统的演进
华为云数据治理生产线DataArts,让“数据‘慧’说话”