栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据库系统原理与应用教程(075)—— MySQL 练习题:操作题 151-159(十九):综合练习

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据库系统原理与应用教程(075)—— MySQL 练习题:操作题 151-159(十九):综合练习

数据库系统原理与应用教程(075)—— MySQL 练习题:操作题 151-159(十九):综合练习

151、分组查询与统计(1)

该题目使用的表和数据如下:

 

成绩表:grade,表中数据如下:

mysql> select * from grade;
+----+------+-------+
| id | job  | score |
+----+------+-------+
|  1 | C++  | 11001 |
|  2 | C++  | 10000 |
|  3 | C++  |  9000 |
|  4 | Java | 12000 |
|  5 | Java | 13000 |
|  6 | JS   | 12000 |
|  7 | JS   | 11000 |
|  8 | JS   |  9999 |
+----+------+-------+
8 rows in set (0.02 sec)

【问题】请编写一个 SQL 语句,查询各个岗位分数的平均数,按照分数降序排序,结果保留小数点后面3位(3位之后四舍五入),查询结果如下:

jobavg
Java12500.000
JS10999.667
C++10000.333

解答:

mysql> select job, round(avg(score), 3) avg
    -> from grade
    -> group by job
    -> order by avg desc;
+------+-----------+
| job  | avg       |
+------+-----------+
| Java | 12500.000 |
| JS   | 10999.667 |
| C++  | 10000.333 |
+------+-----------+
3 rows in set (0.02 sec)

152、分组查询与统计(2)

该题目使用的表和数据如下:

 

成绩表:grade,表中数据如下:

mysql> select * from grade;
+----+------+-------+
| id | job  | score |
+----+------+-------+
|  1 | C++  | 11001 |
|  2 | C++  | 10000 |
|  3 | C++  |  9000 |
|  4 | Java | 12000 |
|  5 | Java | 13000 |
|  6 | JS   | 12000 |
|  7 | JS   | 11000 |
|  8 | JS   |  9999 |
|  9 | Java | 12500 |
+----+------+-------+
9 rows in set (0.00 sec)

【问题】请编写一个 SQL 语句,查询用户分数大于其所在工作(job)分数的平均分的所有 grade 属性,以 id 升序排序,查询结果如下:

idjobscore
1C++11001
5Java13000
6JS12000
7JS11000

解答:

mysql> select g.*
    -> from grade g join 
    ->      (select job, avg(score) avg from grade group by job) a
    ->      on g.job = a.job
    -> where g.score > a.avg;
+----+------+-------+
| id | job  | score |
+----+------+-------+
|  1 | C++  | 11001 |
|  5 | Java | 13000 |
|  6 | JS   | 12000 |
|  7 | JS   | 11000 |
+----+------+-------+
4 rows in set (0.00 sec)

153、分组查询与统计(3)

该题目使用的表和数据如下:

 

分数表:grade,表中数据如下:

mysql> select * from grade;
+----+-------------+-------+
| id | language_id | score |
+----+-------------+-------+
|  1 |           1 | 12000 |
|  2 |           1 | 13000 |
|  3 |           2 | 11000 |
|  4 |           2 | 10000 |
|  5 |           3 | 11000 |
|  6 |           1 | 11000 |
|  7 |           2 | 11000 |
+----+-------------+-------+
7 rows in set (0.00 sec)

语言岗位表:language,表中数据如下:

mysql> select * from language;
+----+--------+
| id | name   |
+----+--------+
|  1 | C++    |
|  2 | JAVA   |
|  3 | Python |
+----+--------+
3 rows in set (0.00 sec)

【问题】查询每个岗位分数排名前 2 名的用户,查询结果先按照 language 的 name 升序排序,再按照积分降序排序,最后按照 grade 的 id 升序排序,查询结果如下:

idnamescore
2C++13000
1C++12000
3JAVA11000
7JAVA11000
4JAVA10000
5Python11000

解答:

mysql> select a.id, l.name, a.score
    -> from language l join grade a on l.id = a.language_id
    ->      left join grade b on a.language_id = b.language_id and a.score < b.score
    -> group by a.id, l.name, a.score
    -> having count(distinct b.score)  < 2
    -> order by l.name, score desc, a.id;
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  2 | C++    | 13000 |
|  1 | C++    | 12000 |
|  3 | JAVA   | 11000 |
|  7 | JAVA   | 11000 |
|  4 | JAVA   | 10000 |
|  5 | Python | 11000 |
+----+--------+-------+
6 rows in set (0.00 sec)

154、构造复杂查询条件

该题目使用的表和数据如下:

 

订单信息表:order_info,表中数据如下:

mysql> select * from order_info;
+----+-----------+--------------+--------------+-----------+------------+
| id | user_id   | product_name | status       | client_id | date       |
+----+-----------+--------------+--------------+-----------+------------+
|  1 |    557336 | C++          | no_completed |         1 | 2025-10-10 |
|  2 | 230173543 | Python       | completed    |         2 | 2025-10-12 |
|  3 |        57 | JS           | completed    |         3 | 2025-10-23 |
|  4 |        57 | C++          | completed    |         3 | 2025-10-23 |
|  5 |    557336 | Java         | completed    |         1 | 2025-10-23 |
|  6 |    557336 | Python       | no_completed |         1 | 2025-10-24 |
+----+-----------+--------------+--------------+-----------+------------+
6 rows in set (0.00 sec)

【问题】请编写一个 SQL 语句,查询在 2025-10-15 以后状态为购买成功的 C++ 课程或者 Java 课程或者 Python 的订单,并且按照 id 升序排序,查询结果如下:

iduser_idproduct_namestatusclient_iddate
457C++completed32025-10-23
5557336Javacompleted12025-10-23

解答:

mysql> select * 
    -> from order_info
    -> where date > '2025-10-15' and status = 'completed' and 
    ->       product_name in ('C++', 'Java', 'Python')
    -> order by id;
+----+---------+--------------+-----------+-----------+------------+
| id | user_id | product_name | status    | client_id | date       |
+----+---------+--------------+-----------+-----------+------------+
|  4 |      57 | C++          | completed |         3 | 2025-10-23 |
|  5 |  557336 | Java         | completed |         1 | 2025-10-23 |
+----+---------+--------------+-----------+-----------+------------+
2 rows in set (0.03 sec)

155、分组查询

该题目使用的表和数据如下:

 

订单信息表:order_info,表中数据如下:

mysql> select * from order_info;
+----+-----------+--------------+--------------+-----------+------------+
| id | user_id   | product_name | status       | client_id | date       |
+----+-----------+--------------+--------------+-----------+------------+
|  1 |    557336 | C++          | no_completed |         1 | 2025-10-10 |
|  2 | 230173543 | Python       | completed    |         2 | 2025-10-12 |
|  3 |        57 | JS           | completed    |         3 | 2025-10-23 |
|  4 |        57 | C++          | completed    |         3 | 2025-10-23 |
|  5 |    557336 | Java         | completed    |         1 | 2025-10-23 |
|  6 |        57 | Java         | completed    |         1 | 2025-10-24 |
|  7 |    557336 | C++          | completed    |         1 | 2025-10-25 |
+----+-----------+--------------+--------------+-----------+------------+
7 rows in set (0.00 sec)

【问题】请编写一个 SQL 语句,查询在 2025-10-15 以后,同一个用户下单 2 个以及 2 个以上,状态为购买成功的 C++ 课程或 Java 课程或 Python 课程的 user_id,并且按照 user_id 升序排序,查询结果如下:

user_id
57
557336

解答:

mysql> select user_id
    -> from order_info
    -> where date > '2025-10-15' and status = 'completed' and 
    ->       product_name in ('C++', 'Java', 'Python')
    -> group by user_id
    -> having count(*) >= 2
    -> order by user_id;
+---------+
| user_id |
+---------+
|      57 |
|  557336 |
+---------+
2 rows in set (0.00 sec)

156、构造复杂查询条件

该题目使用的表和数据如下:

 

订单信息表:order_info,表中数据如下:

mysql> select * from order_info;
+----+-----------+--------------+--------------+-----------+------------+
| id | user_id   | product_name | status       | client_id | date       |
+----+-----------+--------------+--------------+-----------+------------+
|  1 |    557336 | C++          | no_completed |         1 | 2025-10-10 |
|  2 | 230173543 | Python       | completed    |         2 | 2025-10-12 |
|  3 |        57 | JS           | completed    |         3 | 2025-10-23 |
|  4 |        57 | C++          | completed    |         3 | 2025-10-23 |
|  5 |    557336 | Java         | completed    |         1 | 2025-10-23 |
|  6 |        57 | Java         | completed    |         1 | 2025-10-24 |
|  7 |    557336 | C++          | completed    |         1 | 2025-10-25 |
+----+-----------+--------------+--------------+-----------+------------+
7 rows in set (0.01 sec)

【问题】请编写一个 SQL 语句,查询在 2025-10-15 以后,同一个用户下单 2 个以及 2 个以上,状态为购买成功的 C++ 课程或 Java 课程或 Python 课程的订单信息,按照 id 升序排序,查询结果如下:

iduser_idproduct_namestatusclient_iddate
457C++completed32025-10-23
5557336Javacompleted12025-10-23
657Javacompleted12025-10-24
7557336C++completed12025-10-25

解答:

mysql> select * from order_info
    -> where user_id in
    ->     (select user_id from order_info
    ->      where date > '2025-10-15' and status = 'completed' and 
    ->            product_name in ('C++', 'Java', 'Python')
    ->      group by user_id having count(*) >= 2) and
    ->      date > '2025-10-15' and status = 'completed' and 
    ->      product_name in ('C++', 'Java', 'Python')
    -> order by id;
+----+---------+--------------+-----------+-----------+------------+
| id | user_id | product_name | status    | client_id | date       |
+----+---------+--------------+-----------+-----------+------------+
|  4 |      57 | C++          | completed |         3 | 2025-10-23 |
|  5 |  557336 | Java         | completed |         1 | 2025-10-23 |
|  6 |      57 | Java         | completed |         1 | 2025-10-24 |
|  7 |  557336 | C++          | completed |         1 | 2025-10-25 |
+----+---------+--------------+-----------+-----------+------------+
4 rows in set (0.00 sec)

157、构造复杂查询条件

该题目使用的表和数据如下:

 

订单信息表:order_info,表中数据如下:

mysql> select * from order_info;
+----+-----------+--------------+--------------+-----------+------------+--------------+
| id | user_id   | product_name | status       | client_id | date       | is_group_buy |
+----+-----------+--------------+--------------+-----------+------------+--------------+
|  1 |    557336 | C++          | no_completed |         1 | 2025-10-10 | No           |
|  2 | 230173543 | Python       | completed    |         2 | 2025-10-12 | No           |
|  3 |        57 | JS           | completed    |         0 | 2025-10-23 | Yes          |
|  4 |        57 | C++          | completed    |         3 | 2025-10-23 | No           |
|  5 |    557336 | Java         | completed    |         0 | 2025-10-23 | Yes          |
|  6 |        57 | Java         | completed    |         1 | 2025-10-24 | No           |
|  7 |    557336 | C++          | completed    |         0 | 2025-10-25 | Yes          |
+----+-----------+--------------+--------------+-----------+------------+--------------+
7 rows in set (0.00 sec)

客户端表:client,表中数据如下:

mysql> select * from client;
+----+---------+
| id | name    |
+----+---------+
|  1 | PC      |
|  2 | Android |
|  3 | IOS     |
|  4 | H5      |
+----+---------+
4 rows in set (0.00 sec)

000

【问题】请编写一个 SQL 语句,查询在 2025-10-15 以后,同一个用户下单 2 个以及 2 个以上,状态为购买成功的 C++ 课程或 Java 课程或 Python 课程的订单 id,是否拼团以及客户端名字信息,并且按照 order_info 的 id 升序排序,查询结果如下:

idis_group_buyclient_name
4NoIOS
5YesNULL
6NoPC
7YesNULL

解答:

mysql> select oi.id, oi.is_group_buy, c.name client_name 
    -> from order_info oi left join client c on oi.client_id = c.id
    ->      join (select user_id from order_info
    ->           where date > '2025-10-15' and status = 'completed' and 
    ->           product_name in ('C++', 'Java', 'Python')
    ->           group by user_id having count(*) >= 2) a
    ->     on oi.user_id = a.user_id
    -> where date > '2025-10-15' and status = 'completed' and 
    ->           product_name in ('C++', 'Java', 'Python')
    -> order by oi.id;
+----+--------------+-------------+
| id | is_group_buy | client_name |
+----+--------------+-------------+
|  4 | No           | IOS         |
|  5 | Yes          | NULL        |
|  6 | No           | PC          |
|  7 | Yes          | NULL        |
+----+--------------+-------------+
4 rows in set (0.00 sec)

158、联合查询(union)

该题目使用的表和数据如下:

 

订单信息表:order_info,表中数据如下:

mysql> select * from order_info;
+----+-----------+--------------+--------------+-----------+------------+--------------+
| id | user_id   | product_name | status       | client_id | date       | is_group_buy |
+----+-----------+--------------+--------------+-----------+------------+--------------+
|  1 |    557336 | C++          | no_completed |         1 | 2025-10-10 | No           |
|  2 | 230173543 | Python       | completed    |         2 | 2025-10-12 | No           |
|  3 |        57 | JS           | completed    |         0 | 2025-10-23 | Yes          |
|  4 |        57 | C++          | completed    |         3 | 2025-10-23 | No           |
|  5 |    557336 | Java         | completed    |         0 | 2025-10-23 | Yes          |
|  6 |        57 | Java         | completed    |         1 | 2025-10-24 | No           |
|  7 |    557336 | C++          | completed    |         0 | 2025-10-25 | Yes          |
+----+-----------+--------------+--------------+-----------+------------+--------------+
7 rows in set (0.01 sec)

客户端表:client,表中数据如下:

mysql> select * from client;
+----+---------+
| id | name    |
+----+---------+
|  1 | PC      |
|  2 | Android |
|  3 | IOS     |
|  4 | H5      |
+----+---------+
4 rows in set (0.00 sec)

【问题】请编写一个 SQL 语句,查询在 2025-10-15 以后,同一个用户下单 2 个以及 2 个以上、状态为购买成功的 C++ 课程或 Java 课程或 Python 课程的来源信息,第一列显示的是客户端名字,如果是拼团订单则显示 GroupBuy,第二列显示这个客户端(或者是拼团订单)有多少订单,最后结果按照第一列(source)升序排序,查询结果如下:

sourcecnt
GroupBuy2
IOS1
PC1

解答:

mysql> select 'GroupBuy' source, count(*) cnt 
    -> from order_info
    -> where user_id in (select user_id from order_info
    ->                   where date > '2025-10-15' and status = 'completed' and 
    ->                         product_name in ('C++', 'Java', 'Python')
    ->                   group by user_id having count(*) >= 2 ) and
    ->                   date > '2025-10-15' and status = 'completed' and 
    ->                         product_name in ('C++', 'Java', 'Python') and 
    ->                   is_group_buy = 'YES'
    -> union
    -> select c.name source, count(*) cnt 
    -> from order_info oi join client c on oi.client_id = c.id
    -> where oi.user_id in (select user_id from order_info
    ->                   where date > '2025-10-15' and status = 'completed' and 
    ->                         product_name in ('C++', 'Java', 'Python')
    ->                   group by user_id having count(*) >= 2 ) and
    ->                   date > '2025-10-15' and status = 'completed' and 
    ->                         product_name in ('C++', 'Java', 'Python') and 
    ->                   is_group_buy = 'NO'
    -> group by c.name
    -> order by source;
+----------+-----+
| source   | cnt |
+----------+-----+
| GroupBuy |   2 |
| IOS      |   1 |
| PC       |   1 |
+----------+-----+
3 rows in set (0.12 sec)

159、名次问题

该题目使用的表和数据如下:

 

班级成绩表:class_grade,表中数据如下:

说明:每个人的综合成绩用 A、B、C、D、E表示,假设每个名次最多 1 个人,比如有 2 个A,那么必定有 1 个A是第 1 名,有 1 个A是第 2 名。

mysql> select * from class_grade;
+-------+--------+
| grade | number |
+-------+--------+
| A     |      2 |
| D     |      1 |
| C     |      2 |
| B     |      2 |
+-------+--------+
4 rows in set (0.00 sec)

【问题】请编写一个 SQL 查询,如果一个学生知道了自己综合成绩以后,最差是排第几名? 结果按照 grade 升序排序,查询结果如下:

gradet_rank
A2
B4
C6
D7

解答:

mysql> select grade, (select @sum := @sum + number) t_rank
    -> from class_grade, (select @sum := 0) a
    -> order by grade;
+-------+--------+
| grade | t_rank |
+-------+--------+
| A     |      2 |
| B     |      4 |
| C     |      6 |
| D     |      7 |
+-------+--------+
4 rows in set (0.01 sec)


mysql> select  a.grade, sum(b.number) t_rank
    -> from class_grade a join class_grade b on a.grade >= b.grade
    -> group by a.grade
    -> order by a.grade;
+-------+--------+
| grade | t_rank |
+-------+--------+
| A     |      2 |
| B     |      4 |
| C     |      6 |
| D     |      7 |
+-------+--------+
4 rows in set (0.00 sec)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034552.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号