数据库系统原理与应用教程(080)—— MySQL 练习题:操作题 186-193(二十四):综合练习

本篇博客详细介绍了MySQL数据库操作的相关练习题,包括连接查询与分组统计。首先,通过案例展示了如何统计每个科目的转化率,接着分析了不同日期的日人均回答量,最后探讨了回答过教育类问题的用户中回答过职场类问题的人数。这些练习题涵盖了数据统计与分析的关键技巧,有助于提升数据库操作能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库系统原理与应用教程(080)—— MySQL 练习题:操作题 186-193(二十四):综合练习

186、连接查询与分组统计(1)

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

/*
drop table if exists course_tb;
CREATE TABLE course_tb(
course_id int(10) NOT NULL, 
course_name char(10) NOT NULL,
course_datetime char(30) NOT NULL);

INSERT INTO course_tb VALUES(1, 'Python', '2021-12-1 19:00-21:00');
INSERT INTO course_tb VALUES(2, 'SQL', '2021-12-2 19:00-21:00');
INSERT INTO course_tb VALUES(3, 'R', '2021-12-3 19:00-21:00');

drop table if exists behavior_tb;
CREATE TABLE behavior_tb(
user_id int(10) NOT NULL, 
if_vw int(10) NOT NULL,
if_fav int(10) NOT NULL,
if_sign int(10) NOT NULL,
course_id int(10) NOT NULL);

INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 3);
INSERT INTO behavior_tb VALUES(101, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(101, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(101, 1, 0, 0, 3);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 3);
INSERT INTO behavior_tb VALUES(103, 1, 1, 0, 1);
INSERT INTO behavior_tb VALUES(103, 1, 0, 0, 2);
INSERT INTO behavior_tb VALUES(103, 1, 0, 0, 3);
INSERT INTO behavior_tb VALUES(104, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(104, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(104, 1, 1, 0, 3);
INSERT INTO behavior_tb VALUES(105, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(106, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(107, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(107, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(108, 1, 1, 1, 3);
*/

课程表:course_tb(course_id:课程编号,course_name:课程名称,course_datetime:上课时间),表中数据如下:

mysql> select * from course_tb;
+-----------+-------------+-----------------------+
| course_id | course_name | course_datetime       |
+-----------+-------------+-----------------------+
|         1 | Python      | 2021-12-1 19:00-21:00 |
|         2 | SQL         | 2021-12-2 19:00-21:00 |
|         3 | R           | 2021-12-3 19:00-21:00 |
+-----------+-------------+-----------------------+
3 rows in set (0.03 sec)

用户行为表:behavior_tb(user_id:用户编号,if_vw:是否浏览,if_fav:是否收藏,if_sign:是否报名,course_id:课程编号),表中数据如下:

mysql> select * from behavior_tb;
+---------+-------+--------+---------+-----------+
| user_id | if_vw | if_fav | if_sign | course_id |
+---------+-------+--------+---------+-----------+
|     100 |     1 |      1 |       1 |         1 |
|     100 |     1 |      1 |       1 |         2 |
|     100 |     1 |      1 |       1 |         3 |
|     101 |     1 |      1 |       1 |         1 |
|     101 |     1 |      1 |       1 |         2 |
|     101 |     1 |      0 |       0 |         3 |
|     102 |     1 |      1 |       1 |         1 |
|     102 |     1 |      1 |       1 |         2 |
|     102 |     1 |      1 |       1 |         3 |
|     103 |     1 |      1 |       0 |         1 |
|     103 |     1 |      0 |       0 |         2 |
|     103 |     1 |      0 |       0 |         3 |
|     104 |     1 |      1 |       1 |         1 |
|     104 |     1 |      1 |       1 |         2 |
|     104 |     1 |      1 |       0 |         3 |
|     105 |     1 |      0 |       0 |         1 |
|     106 |     1 |      0 |       0 |         1 |
|     107 |     1 |      0 |       0 |         1 |
|     107 |     1 |      1 |       1 |         2 |
|     108 |     1 |      1 |       1 |         3 |
+---------+-------+--------+---------+-----------+
20 rows in set (0.00 sec)

【问题】请统计每个科目的转换率(sign_rate(%),转化率 = 报名人数/浏览人数,结果保留两位小数),按照 course_id升序排序,查询结果如下:

course_idcourse_namesign_rate(%)
1Python50.00
2SQL83.33
3R50.00

解答:

/*
select c.course_id, c.course_name,
       round(sum(if_sign) / sum(if_vw) * 100 , 2) `sign_rate(%)`
from course_tb c join behavior_tb b 
on c.course_id = b.course_id
group by c.course_id, c.course_name;
*/
mysql> select c.course_id, c.course_name,
    ->        round(sum(if_sign) / sum(if_vw) * 100 , 2) `sign_rate(%)`
    -> from course_tb c join behavior_tb b 
    -> on c.course_id = b.course_id
    -> group by c.course_id, c.course_name;
+-----------+-------------+--------------+
| course_id | course_name | sign_rate(%) |
+-----------+-------------+--------------+
|         1 | Python      |        50.00 |
|         2 | SQL         |        83.33 |
|         3 | R           |        50.00 |
+-----------+-------------+--------------+
3 rows in set (0.00 sec)

187、连接查询与分组统计(2)

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

/*
drop table if exists course_tb;
CREATE TABLE course_tb(
course_id int(10) NOT NULL, 
course_name char(10) NOT NULL,
course_datetime char(30) NOT NULL);
INSERT INTO course_tb VALUES(1, 'Python', '2021-12-1 19:00-21:00');
INSERT INTO course_tb VALUES(2, 'SQL', '2021-12-2 19:00-21:00');
INSERT INTO course_tb VALUES(3, 'R', '2021-12-3 19:00-21:00');

drop table if attend_tb;
CREATE TABLE attend_tb(
user_id int(10) NOT NULL, 
course_id int(10) NOT NULL,
in_datetime datetime NOT NULL,
out_datetime datetime NOT NULL
);
INSERT INTO attend_tb VALUES(100, 1, '2021-12-1 19:00:00', '2021-12-1 19:28:00');
INSERT INTO attend_tb VALUES(100, 1, '2021-12-1 19:30:00', '2021-12-1 19:53:00');
INSERT INTO attend_tb VALUES(101, 1, '2021-12-1 19:00:00', '2021-12-1 20:55:00');
INSERT INTO attend_tb VALUES(102, 1, '2021-12-1 19:00:00', '2021-12-1 19:05:00');
INSERT INTO attend_tb VALUES(104, 1, '2021-12-1 19:00:00', '2021-12-1 20:59:00');
INSERT INTO attend_tb VALUES(101, 2, '2021-12-2 19:05:00', '2021-12-2 20:58:00');
INSERT INTO attend_tb VALUES(102, 2, '2021-12-2 18:55:00', '2021-12-2 21:00:00');
INSERT INTO attend_tb VALUES(104, 2, '2021-12-2 18:57:00', '2021-12-2 20:56:00');
INSERT INTO attend_tb VALUES(107, 2, '2021-12-2 19:10:00', '2021-12-2 19:18:00');
INSERT INTO attend_tb VALUES(100, 3, '2021-12-3 19:01:00', '2021-12-3 21:00:00');
INSERT INTO attend_tb VALUES(102, 3, '2021-12-3 18:58:00', '2021-12-3 19:05:00');
INSERT INTO attend_tb VALUES(108, 3, '2021-12-3 19:01:00', '2021-12-3 19:56:00');
*/

课程表:course_tb(course_id:课程编号,course_name:课程名称,course_datetime:上课时间),表中数据如下:

mysql> select * from course_tb;
+-----------+-------------+-----------------------+
| course_id | course_name | course_datetime       |
+-----------+-------------+-----------------------+
|         1 | Python      | 2021-12-1 19:00-21:00 |
|         2 | SQL         | 2021-12-2 19:00-21:00 |
|         3 | R           | 2021-12-3 19:00-21:00 |
+-----------+-------------+-----------------------+
3 rows in set (0.00 sec)

上课情况表:attend_tb(user_id:用户编号,course_id:课程编号,in_datetime:进入直播间的时间,out_datetime:离开直播间的时间),表中数据如下:

mysql> select * from attend_tb;
+---------+-----------+---------------------+---------------------+
| user_id | course_id | in_datetime         | out_datetime        |
+---------+-----------+---------------------+---------------------+
|     100 |         1 | 2021-12-01 19:00:00 | 2021-12-01 19:28:00 |
|     100 |         1 | 2021-12-01 19:30:00 | 2021-12-01 19:53:00 |
|     101 |         1 | 2021-12-01 19:00:00 | 2021-12-01 20:55:00 |
|     102 |         1 | 2021-12-01 19:00:00 | 2021-12-01 19:05:00 |
|     104 |         1 | 2021-12-01 19:00:00 | 2021-12-01 20:59:00 |
|     101 |         2 | 2021-12-02 19:05:00 | 2021-12-02 20:58:00 |
|     102 |         2 | 2021-12-02 18:55:00 | 2021-12-02 21:00:00 |
|     104 |         2 | 2021-12-02 18:57:00 | 2021-12-02 20:56:00 |
|     107 |         2 | 2021-12-02 19:10:00 | 2021-12-02 19:18:00 |
|     100 |         3 | 2021-12-03 19:01:00 | 2021-12-03 21:00:00 |
|     102 |         3 | 2021-12-03 18:58:00 | 2021-12-03 19:05:00 |
|     108 |         3 | 2021-12-03 19:01:00 | 2021-12-03 19:56:00 |
|     100 |         1 | 2021-12-01 19:00:00 | 2021-12-01 19:28:00 |
|     100 |         1 | 2021-12-01 19:30:00 | 2021-12-01 19:53:00 |
|     101 |         1 | 2021-12-01 19:00:00 | 2021-12-01 20:55:00 |
|     102 |         1 | 2021-12-01 19:00:00 | 2021-12-01 19:05:00 |
|     104 |         1 | 2021-12-01 19:00:00 | 2021-12-01 20:59:00 |
|     101 |         2 | 2021-12-02 19:05:00 | 2021-12-02 20:58:00 |
|     102 |         2 | 2021-12-02 18:55:00 | 2021-12-02 21:00:00 |
|     104 |         2 | 2021-12-02 18:57:00 | 2021-12-02 20:56:00 |
|     107 |         2 | 2021-12-02 19:10:00 | 2021-12-02 19:18:00 |
|     100 |         3 | 2021-12-03 19:01:00 | 2021-12-03 21:00:00 |
|     102 |         3 | 2021-12-03 18:58:00 | 2021-12-03 19:05:00 |
|     108 |         3 | 2021-12-03 19:01:00 | 2021-12-03 19:56:00 |
+---------+-----------+---------------------+---------------------+
24 rows in set (0.03 sec)

【问题】请统计直播开始时(19:00),各科目的在线人数(按照 course_id 升序排序),表中数据如下:

course_idcourse_nameonline_num
1Python8
2SQL4
3R2

解答:

/*
select c.course_id, c.course_name,
       count(*) online_num
from course_tb c join attend_tb a
on c.course_id = a.course_id
where time(in_datetime) <= '19:00:00' and time(out_datetime) >= '19:00:00'
group by c.course_id, c.course_name
order by c.course_id;
*/
mysql> SELECT course_tb.course_id, course_name, COUNT(1) AS online_num
    -> FROM course_tb JOIN attend_tb ON course_tb.course_id = attend_tb.course_id
    -> WHERE TIME(in_datetime) <= '19:00:00' AND TIME(out_datetime) >= '19:00:00'
    -> GROUP BY course_tb.course_id, course_name
    -> ORDER BY course_tb.course_id;
+-----------+-------------+------------+
| course_id | course_name | online_num |
+-----------+-------------+------------+
|         1 | Python      |          8 |
|         2 | SQL         |          4 |
|         3 | R           |          2 |
+-----------+-------------+------------+
3 rows in set (0.03 sec)

188、连接查询与分组统计(3)

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

/*
drop table if exists course_tb;
CREATE TABLE course_tb(
course_id int(10) NOT NULL, 
course_name char(10) NOT NULL,
course_datetime char(30) NOT NULL);

INSERT INTO course_tb VALUES(1, 'Python', '2021-12-1 19:00-21:00');
INSERT INTO course_tb VALUES(2, 'SQL', '2021-12-2 19:00-21:00');
INSERT INTO course_tb VALUES(3, 'R', '2021-12-3 19:00-21:00');

drop table if exists attend_tb;
CREATE TABLE attend_tb(
user_id int(10) NOT NULL, 
course_id int(10) NOT NULL,
in_datetime datetime NOT NULL,
out_datetime datetime NOT NULL
);
INSERT INTO attend_tb VALUES(100, 1, '2021-12-1 19:00:00', '2021-12-1 19:28:00');
INSERT INTO attend_tb VALUES(100, 1, '2021-12-1 19:30:00', '2021-12-1 19:53:00');
INSERT INTO attend_tb VALUES(101, 1, '2021-12-1 19:00:00', '2021-12-1 20:55:00');
INSERT INTO attend_tb VALUES(102, 1, '2021-12-1 19:00:00', '2021-12-1 19:05:00');
INSERT INTO attend_tb VALUES(104, 1, '2021-12-1 19:00:00', '2021-12-1 20:59:00');
INSERT INTO attend_tb VALUES(101, 2, '2021-12-2 19:05:00', '2021-12-2 20:58:00');
INSERT INTO attend_tb VALUES(102, 2, '2021-12-2 18:55:00', '2021-12-2 21:00:00');
INSERT INTO attend_tb VALUES(104, 2, '2021-12-2 18:57:00', '2021-12-2 20:56:00');
INSERT INTO attend_tb VALUES(107, 2, '2021-12-2 19:10:00', '2021-12-2 19:18:00');
INSERT INTO attend_tb VALUES(100, 3, '2021-12-3 19:01:00', '2021-12-3 21:00:00');
INSERT INTO attend_tb VALUES(102, 3, '2021-12-3 18:58:00', '2021-12-3 19:05:00');
INSERT INTO attend_tb VALUES(108, 3, '2021-12-3 19:01:00', '2021-12-3 19:56:00');
*/

课程表:course_tb(course_id:课程编号,course_name:课程名称,course_datetime:上课时间),表中数据如下:

mysql> select * from course_tb;
+-----------+-------------+-----------------------+
| course_id | course_name | course_datetime       |
+-----------+-------------+-----------------------+
|         1 | Python      | 2021-12-1 19:00-21:00 |
|         2 | SQL         | 2021-12-2 19:00-21:00 |
|         3 | R           | 2021-12-3 19:00-21:00 |
+-----------+-------------+-----------------------+
3 rows in set (0.00 sec)

上课情况表:attend_tb(user_id:用户编号,course_id:课程编号,in_datetime:进入直播间的时间,out_datetime:离开直播间的时间),表中数据如下:

mysql> select * from attend_tb;
+---------+-----------+---------------------+---------------------+
| user_id | course_id | in_datetime         | out_datetime        |
+---------+-----------+---------------------+---------------------+
|     100 |         1 | 2021-12-01 19:00:00 | 2021-12-01 19:28:00 |
|     100 |         1 | 2021-12-01 19:30:00 | 2021-12-01 19:53:00 |
|     101 |         1 | 2021-12-01 19:00:00 | 2021-12-01 20:55:00 |
|     102 |         1 | 2021-12-01 19:00:00 | 2021-12-01 19:05:00 |
|     104 |         1 | 2021-12-01 19:00:00 | 2021-12-01 20:59:00 |
|     101 |         2 | 2021-12-02 19:05:00 | 2021-12-02 20:58:00 |
|     102 |         2 | 2021-12-02 18:55:00 | 2021-12-02 21:00:00 |
|     104 |         2 | 2021-12-02 18:57:00 | 2021-12-02 20:56:00 |
|     107 |         2 | 2021-12-02 19:10:00 | 2021-12-02 19:18:00 |
|     100 |         3 | 2021-12-03 19:01:00 | 2021-12-03 21:00:00 |
|     102 |         3 | 2021-12-03 18:58:00 | 2021-12-03 19:05:00 |
|     108 |         3 | 2021-12-03 19:01:00 | 2021-12-03 19:56:00 |
+---------+-----------+---------------------+---------------------+
12 rows in set (0.00 sec)

【问题】请统计每个科目的平均观看时长(观看时长定义为离开直播间的时间与进入直播间的时间之差,单位是分钟),输出结果按平均观看时长降序排序,结果保留两位小数。查询结果如下:

course_nameavg_Len
SQL91.25
R60.33
Python58.00

解答:

/*
select c.course_name,
       round(avg(timestampdiff(second, a.in_datetime, a.out_datetime)/60), 2) avg_Len
from course_tb c join attend_tb a
on c.course_id = a.course_id
group by c.course_name
order by avg_Len desc;
*/
mysql> select c.course_name,
    ->        round(avg(timestampdiff(second, a.in_datetime, a.out_datetime)/60), 2) avg_Len
    -> from course_tb c join attend_tb a
    -> on c.course_id = a.course_id
    -> group by c.course_name
    -> order by avg_Len desc;
+-------------+---------+
| course_name | avg_Len |
+-------------+---------+
| SQL         |   91.25 |
| R           |   60.33 |
| Python      |   58.00 |
+-------------+---------+
3 rows in set (0.00 sec)

189、连接查询与分组统计(4)

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

/*
drop table if exists course_tb;
CREATE TABLE course_tb(
course_id int(10) NOT NULL, 
course_name char(10) NOT NULL,
course_datetime char(30) NOT NULL);

INSERT INTO course_tb VALUES(1, 'Python', '2021-12-1 19:00-21:00');
INSERT INTO course_tb VALUES(2, 'SQL', '2021-12-2 19:00-21:00');
INSERT INTO course_tb VALUES(3, 'R', '2021-12-3 19:00-21:00');

drop table if exists behavior_tb;
CREATE TABLE behavior_tb(
user_id int(10) NOT NULL, 
if_vw int(10) NOT NULL,
if_fav int(10) NOT NULL,
if_sign int(10) NOT NULL,
course_id int(10) NOT NULL);

INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 3);
INSERT INTO behavior_tb VALUES(101, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(101, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(101, 1, 0, 0, 3);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 3);
INSERT INTO behavior_tb VALUES(103, 1, 1, 0, 1);
INSERT INTO behavior_tb VALUES(103, 1, 0, 0, 2);
INSERT INTO behavior_tb VALUES(103, 1, 0, 0, 3);
INSERT INTO behavior_tb VALUES(104, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(104, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(104, 1, 1, 0, 3);
INSERT INTO behavior_tb VALUES(105, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(106, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(107, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(107, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(108, 1, 1, 1, 3);

drop table if exists attend_tb;
CREATE TABLE attend_tb(
user_id int(10) NOT NULL, 
course_id int(10) NOT NULL,
in_datetime datetime NOT NULL,
out_datetime datetime NOT NULL
);
INSERT INTO attend_tb VALUES(100, 1, '2021-12-1 19:00:00', '2021-12-1 19:28:00');
INSERT INTO attend_tb VALUES(100, 1, '2021-12-1 19:30:00', '2021-12-1 19:53:00');
INSERT INTO attend_tb VALUES(101, 1, '2021-12-1 19:00:00', '2021-12-1 20:55:00');
INSERT INTO attend_tb VALUES(102, 1, '2021-12-1 19:00:00', '2021-12-1 19:05:00');
INSERT INTO attend_tb VALUES(104, 1, '2021-12-1 19:00:00', '2021-12-1 20:59:00');
INSERT INTO attend_tb VALUES(101, 2, '2021-12-2 19:05:00', '2021-12-2 20:58:00');
INSERT INTO attend_tb VALUES(102, 2, '2021-12-2 18:55:00', '2021-12-2 21:00:00');
INSERT INTO attend_tb VALUES(104, 2, '2021-12-2 18:57:00', '2021-12-2 20:56:00');
INSERT INTO attend_tb VALUES(107, 2, '2021-12-2 19:10:00', '2021-12-2 19:18:00');
INSERT INTO attend_tb VALUES(100, 3, '2021-12-3 19:01:00', '2021-12-3 21:00:00');
INSERT INTO attend_tb VALUES(102, 3, '2021-12-3 18:58:00', '2021-12-3 19:05:00');
INSERT INTO attend_tb VALUES(108, 3, '2021-12-3 19:01:00', '2021-12-3 19:56:00');
*/

课程表:course_tb(course_id:课程编号,course_name:课程名称,course_datetime:上课时间),表中数据如下:

mysql> select * from course_tb;
+-----------+-------------+-----------------------+
| course_id | course_name | course_datetime       |
+-----------+-------------+-----------------------+
|         1 | Python      | 2021-12-1 19:00-21:00 |
|         2 | SQL         | 2021-12-2 19:00-21:00 |
|         3 | R           | 2021-12-3 19:00-21:00 |
+-----------+-------------+-----------------------+
3 rows in set (0.00 sec)

用户行为表:behavior_tb(user_id:用户编号,if_vw:是否浏览,if_fav:是否收藏,if_sign:是否报名,course_id:课程编号),表中数据如下:

mysql> select * from behavior_tb;
+---------+-------+--------+---------+-----------+
| user_id | if_vw | if_fav | if_sign | course_id |
+---------+-------+--------+---------+-----------+
|     100 |     1 |      1 |       1 |         1 |
|     100 |     1 |      1 |       1 |         2 |
|     100 |     1 |      1 |       1 |         3 |
|     101 |     1 |      1 |       1 |         1 |
|     101 |     1 |      1 |       1 |         2 |
|     101 |     1 |      0 |       0 |         3 |
|     102 |     1 |      1 |       1 |         1 |
|     102 |     1 |      1 |       1 |         2 |
|     102 |     1 |      1 |       1 |         3 |
|     103 |     1 |      1 |       0 |         1 |
|     103 |     1 |      0 |       0 |         2 |
|     103 |     1 |      0 |       0 |         3 |
|     104 |     1 |      1 |       1 |         1 |
|     104 |     1 |      1 |       1 |         2 |
|     104 |     1 |      1 |       0 |         3 |
|     105 |     1 |      0 |       0 |         1 |
|     106 |     1 |      0 |       0 |         1 |
|     107 |     1 |      0 |       0 |         1 |
|     107 |     1 |      1 |       1 |         2 |
|     108 |     1 |      1 |       1 |         3 |
+---------+-------+--------+---------+-----------+
20 rows in set (0.00 sec)

上课情况表:attend_tb(user_id:用户编号,course_id:课程编号,in_datetime:进入直播间的时间,out_datetime:离开直播间的时间),表中数据如下:

mysql> select * from attend_tb;
+---------+-----------+---------------------+---------------------+
| user_id | course_id | in_datetime         | out_datetime        |
+---------+-----------+---------------------+---------------------+
|     100 |         1 | 2021-12-01 19:00:00 | 2021-12-01 19:28:00 |
|     100 |         1 | 2021-12-01 19:30:00 | 2021-12-01 19:53:00 |
|     101 |         1 | 2021-12-01 19:00:00 | 2021-12-01 20:55:00 |
|     102 |         1 | 2021-12-01 19:00:00 | 2021-12-01 19:05:00 |
|     104 |         1 | 2021-12-01 19:00:00 | 2021-12-01 20:59:00 |
|     101 |         2 | 2021-12-02 19:05:00 | 2021-12-02 20:58:00 |
|     102 |         2 | 2021-12-02 18:55:00 | 2021-12-02 21:00:00 |
|     104 |         2 | 2021-12-02 18:57:00 | 2021-12-02 20:56:00 |
|     107 |         2 | 2021-12-02 19:10:00 | 2021-12-02 19:18:00 |
|     100 |         3 | 2021-12-03 19:01:00 | 2021-12-03 21:00:00 |
|     102 |         3 | 2021-12-03 18:58:00 | 2021-12-03 19:05:00 |
|     108 |         3 | 2021-12-03 19:01:00 | 2021-12-03 19:56:00 |
+---------+-----------+---------------------+---------------------+
12 rows in set (0.00 sec)

【问题】请统计每个科目的出勤率(attend_rate(%),结果保留两位小数),出勤率 = 出勤(在线时长10分钟及以上)人数 / 报名人数,输出结果按 course_id 升序排序,以上数据的输出结果如下:

course_idcourse_nameattend_rate(%)
1Python75.00
2SQL60.00
3R66.67

解答:

/*
select aa.course_id, aa.course_name,
       round(aa.attend_cnt / bb.cnt * 100, 2) `attend_rate(%)`
from
(select c.course_id, c.course_name,count(distinct a.user_id) attend_cnt
from course_tb c join attend_tb a
on c.course_id = a.course_id
where timestampdiff(second, a.in_datetime, a.out_datetime)/60 >= 10
group by c.course_id, c.course_name) aa
join 
(select c.course_id, c.course_name, sum(if_sign) cnt
from course_tb c join behavior_tb b
on c.course_id = b.course_id
group by c.course_id, c.course_name) bb
on aa.course_id = bb.course_id;
*/
mysql> select aa.course_id, aa.course_name,
    ->        round(aa.attend_cnt / bb.cnt * 100, 2) `attend_rate(%)`
    -> from
    -> (select c.course_id, c.course_name,count(distinct a.user_id) attend_cnt
    -> from course_tb c join attend_tb a
    -> on c.course_id = a.course_id
    -> where timestampdiff(second, a.in_datetime, a.out_datetime)/60 >= 10
    -> group by c.course_id, c.course_name) aa
    -> join 
    -> (select c.course_id, c.course_name, sum(if_sign) cnt
    -> from course_tb c join behavior_tb b
    -> on c.course_id = b.course_id
    -> group by c.course_id, c.course_name) bb
    -> on aa.course_id = bb.course_id;
+-----------+-------------+----------------+
| course_id | course_name | attend_rate(%) |
+-----------+-------------+----------------+
|         1 | Python      |          75.00 |
|         2 | SQL         |          60.00 |
|         3 | R           |          66.67 |
+-----------+-------------+----------------+
3 rows in set (0.04 sec)

190、分组统计(1)

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

/*
drop table if exists answer_tb;
CREATE TABLE answer_tb(
answer_date date NOT NULL, 
author_id int(10) NOT NULL,
issue_id char(10) NOT NULL,
char_len int(10) NOT NULL);
INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E001' ,150);
INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E002', 200);
INSERT INTO answer_tb VALUES('2021-11-1',102, 'C003' ,50);
INSERT INTO answer_tb VALUES('2021-11-1' ,103, 'P001', 35);
INSERT INTO answer_tb VALUES('2021-11-1', 104, 'C003', 120);
INSERT INTO answer_tb VALUES('2021-11-1' ,105, 'P001', 125);
INSERT INTO answer_tb VALUES('2021-11-1' , 102, 'P002', 105);
INSERT INTO answer_tb VALUES('2021-11-2',  101, 'P001' ,201);
INSERT INTO answer_tb VALUES('2021-11-2',  110, 'C002', 200);
INSERT INTO answer_tb VALUES('2021-11-2',  110, 'C001', 225);
INSERT INTO answer_tb VALUES('2021-11-2' , 110, 'C002', 220);
INSERT INTO answer_tb VALUES('2021-11-3', 101, 'C002', 180);
INSERT INTO answer_tb VALUES('2021-11-4' ,109, 'E003', 130);
INSERT INTO answer_tb VALUES('2021-11-4', 109, 'E001',123);
INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C001',160);
INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C002', 120);
INSERT INTO answer_tb VALUES('2021-11-5', 110, 'P001', 180);
INSERT INTO answer_tb VALUES('2021-11-5' , 106, 'P002' , 45);
INSERT INTO answer_tb VALUES('2021-11-5' , 107, 'E003', 56);
*/

回答情况表:answer_tb(answer_date:创作日期,author_id:创作者编号,issue_id:问题id,char_len:回答字数),表中数据如下:

mysql> select * from answer_tb;
+-------------+-----------+----------+----------+
| answer_date | author_id | issue_id | char_len |
+-------------+-----------+----------+----------+
| 2021-11-01  |       101 | E001     |      150 |
| 2021-11-01  |       101 | E002     |      200 |
| 2021-11-01  |       102 | C003     |       50 |
| 2021-11-01  |       103 | P001     |       35 |
| 2021-11-01  |       104 | C003     |      120 |
| 2021-11-01  |       105 | P001     |      125 |
| 2021-11-01  |       102 | P002     |      105 |
| 2021-11-02  |       101 | P001     |      201 |
| 2021-11-02  |       110 | C002     |      200 |
| 2021-11-02  |       110 | C001     |      225 |
| 2021-11-02  |       110 | C002     |      220 |
| 2021-11-03  |       101 | C002     |      180 |
| 2021-11-04  |       109 | E003     |      130 |
| 2021-11-04  |       109 | E001     |      123 |
| 2021-11-05  |       108 | C001     |      160 |
| 2021-11-05  |       108 | C002     |      120 |
| 2021-11-05  |       110 | P001     |      180 |
| 2021-11-05  |       106 | P002     |       45 |
| 2021-11-05  |       107 | E003     |       56 |
+-------------+-----------+----------+----------+
19 rows in set (0.03 sec)

【问题】请统计 11 月份日人均回答量(回答问题数量/答题人数),按回答日期排序,结果保留两位小数,查询结果如下:

answer_dateper_num
2021-11-011.40
2021-11-022.00
2021-11-031.00
2021-11-042.00
2021-11-051.25
/*
select answer_date, 
       round(count(*)/count(distinct author_id), 2) per_num
from answer_tb
group by answer_date
order by answer_date;
*/
mysql> select answer_date, 
    ->        round(count(*)/count(distinct author_id), 2) per_num
    -> from answer_tb
    -> group by answer_date
    -> order by answer_date;
+-------------+---------+
| answer_date | per_num |
+-------------+---------+
| 2021-11-01  |    1.40 |
| 2021-11-02  |    2.00 |
| 2021-11-03  |    1.00 |
| 2021-11-04  |    2.00 |
| 2021-11-05  |    1.25 |
+-------------+---------+
5 rows in set (0.00 sec)

191、分组统计(2)

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

/*
drop table if exists author_tb;
CREATE TABLE author_tb(
author_id int(10) NOT NULL, 
author_level int(10) NOT NULL,
sex char(10) NOT NULL);
INSERT INTO author_tb VALUES(101 , 6, 'm');
INSERT INTO author_tb VALUES(102 , 1, 'f');
INSERT INTO author_tb VALUES(103 , 1, 'm');
INSERT INTO author_tb VALUES(104 , 3, 'm');
INSERT INTO author_tb VALUES(105 , 4, 'f');
INSERT INTO author_tb VALUES(106 , 2, 'f');
INSERT INTO author_tb VALUES(107 , 2, 'm');
INSERT INTO author_tb VALUES(108 , 5, 'f');
INSERT INTO author_tb VALUES(109 , 6, 'f');
INSERT INTO author_tb VALUES(110 , 5, 'm');

drop table if exists answer_tb;
CREATE TABLE answer_tb(
answer_date date NOT NULL, 
author_id int(10) NOT NULL,
issue_id char(10) NOT NULL,
char_len int(10) NOT NULL);
INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E001' ,150);
INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E002', 200);
INSERT INTO answer_tb VALUES('2021-11-1',102, 'C003' ,50);
INSERT INTO answer_tb VALUES('2021-11-1' ,103, 'P001', 35);
INSERT INTO answer_tb VALUES('2021-11-1', 104, 'C003', 120);
INSERT INTO answer_tb VALUES('2021-11-1' ,105, 'P001', 125);
INSERT INTO answer_tb VALUES('2021-11-1' , 102, 'P002', 105);
INSERT INTO answer_tb VALUES('2021-11-2',  101, 'P001' ,201);
INSERT INTO answer_tb VALUES('2021-11-2',  110, 'C002', 200);
INSERT INTO answer_tb VALUES('2021-11-2',  110, 'C001', 225);
INSERT INTO answer_tb VALUES('2021-11-2' , 110, 'C002', 220);
INSERT INTO answer_tb VALUES('2021-11-3', 101, 'C002', 180);
INSERT INTO answer_tb VALUES('2021-11-4' ,109, 'E003', 130);
INSERT INTO answer_tb VALUES('2021-11-4', 109, 'E001',123);
INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C001',160);
INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C002', 120);
INSERT INTO answer_tb VALUES('2021-11-5', 110, 'P001', 180);
INSERT INTO answer_tb VALUES('2021-11-5' , 106, 'P002' , 45);
INSERT INTO answer_tb VALUES('2021-11-5' , 107, 'E003', 56);
*/

创作者信息表:author_tb(author_id:创作者编号,author_level:创作者级别,共 1-6 六个级别,sex:创作者性别),表中数据如下:

mysql> select * from author_tb;
+-----------+--------------+-----+
| author_id | author_level | sex |
+-----------+--------------+-----+
|       101 |            6 | m   |
|       102 |            1 | f   |
|       103 |            1 | m   |
|       104 |            3 | m   |
|       105 |            4 | f   |
|       106 |            2 | f   |
|       107 |            2 | m   |
|       108 |            5 | f   |
|       109 |            6 | f   |
|       110 |            5 | m   |
+-----------+--------------+-----+
10 rows in set (0.00 sec)

创作者回答情况表:answer_tb(answer_date:创作日期,author_id:创作者编号,issue_id:问题编号,char_len:回答字数),表中数据如下:

mysql> select * from answer_tb;
+-------------+-----------+----------+----------+
| answer_date | author_id | issue_id | char_len |
+-------------+-----------+----------+----------+
| 2021-11-01  |       101 | E001     |      150 |
| 2021-11-01  |       101 | E002     |      200 |
| 2021-11-01  |       102 | C003     |       50 |
| 2021-11-01  |       103 | P001     |       35 |
| 2021-11-01  |       104 | C003     |      120 |
| 2021-11-01  |       105 | P001     |      125 |
| 2021-11-01  |       102 | P002     |      105 |
| 2021-11-02  |       101 | P001     |      201 |
| 2021-11-02  |       110 | C002     |      200 |
| 2021-11-02  |       110 | C001     |      225 |
| 2021-11-02  |       110 | C002     |      220 |
| 2021-11-03  |       101 | C002     |      180 |
| 2021-11-04  |       109 | E003     |      130 |
| 2021-11-04  |       109 | E001     |      123 |
| 2021-11-05  |       108 | C001     |      160 |
| 2021-11-05  |       108 | C002     |      120 |
| 2021-11-05  |       110 | P001     |      180 |
| 2021-11-05  |       106 | P002     |       45 |
| 2021-11-05  |       107 | E003     |       56 |
+-------------+-----------+----------+----------+
19 rows in set (0.00 sec)

【问题】请统计高质量回答(回答字数大于等于 100 字的认为是高质量回答)中用户属于 1-2 级、3-4 级、5-6 级的数量分别是多少,按数量降序排列,查询结果如下:

level_cutnum
5-6 级12
3-4 级2
1-2 级1

解答:

/*
select (case when au.author_level in (1, 2) then '1-2级'
             when au.author_level in (3, 4) then '3-4级'
             when au.author_level in (5, 6) then '5-6级'
       end) level_cut, 
       count(*) num
from author_tb au join answer_tb an
on au.author_id = an.author_id
where char_len >= 100
group by level_cut
order by num desc;
*/
mysql> select (case when au.author_level in (1, 2) then '1-2级'
    ->              when au.author_level in (3, 4) then '3-4级'
    ->              when au.author_level in (5, 6) then '5-6级'
    ->        end) level_cut, 
    ->        count(*) num
    -> from author_tb au join answer_tb an
    -> on au.author_id = an.author_id
    -> where char_len >= 100
    -> group by level_cut
    -> order by num desc;
+-----------+-----+
| level_cut | num |
+-----------+-----+
| 5-6|  12 |
| 3-4|   2 |
| 1-2|   1 |
+-----------+-----+
3 rows in set (0.04 sec)

192、分组统计(3)

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

/*
drop table if exists answer_tb;
CREATE TABLE answer_tb(
answer_date date NOT NULL, 
author_id int(10) NOT NULL,
issue_id char(10) NOT NULL,
char_len int(10) NOT NULL);
INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E001' ,150);
INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E002', 200);
INSERT INTO answer_tb VALUES('2021-11-1',102, 'C003' ,50);
INSERT INTO answer_tb VALUES('2021-11-1' ,103, 'P001', 35);
INSERT INTO answer_tb VALUES('2021-11-1', 104, 'C003', 120);
INSERT INTO answer_tb VALUES('2021-11-1' ,105, 'P001', 125);
INSERT INTO answer_tb VALUES('2021-11-1' , 102, 'P002', 105);
INSERT INTO answer_tb VALUES('2021-11-2',  101, 'P001' ,201);
INSERT INTO answer_tb VALUES('2021-11-2',  110, 'C002', 200);
INSERT INTO answer_tb VALUES('2021-11-2',  110, 'C001', 225);
INSERT INTO answer_tb VALUES('2021-11-2' , 110, 'C002', 220);
INSERT INTO answer_tb VALUES('2021-11-3', 101, 'C002', 180);
INSERT INTO answer_tb VALUES('2021-11-4' ,109, 'E003', 130);
INSERT INTO answer_tb VALUES('2021-11-4', 109, 'E001',123);
INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C001',160);
INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C002', 120);
INSERT INTO answer_tb VALUES('2021-11-5', 110, 'P001', 180);
INSERT INTO answer_tb VALUES('2021-11-5' , 106, 'P002' , 45);
INSERT INTO answer_tb VALUES('2021-11-5' , 107, 'E003', 56);
*/

创作者回答情况表:answer_tb(answer_date:创作日期,author_id:创作者编号,issue_id:问题编号,char_len:回答字数),表中数据如下:

mysql> select * from answer_tb;
+-------------+-----------+----------+----------+
| answer_date | author_id | issue_id | char_len |
+-------------+-----------+----------+----------+
| 2021-11-01  |       101 | E001     |      150 |
| 2021-11-01  |       101 | E002     |      200 |
| 2021-11-01  |       102 | C003     |       50 |
| 2021-11-01  |       103 | P001     |       35 |
| 2021-11-01  |       104 | C003     |      120 |
| 2021-11-01  |       105 | P001     |      125 |
| 2021-11-01  |       102 | P002     |      105 |
| 2021-11-02  |       101 | P001     |      201 |
| 2021-11-02  |       110 | C002     |      200 |
| 2021-11-02  |       110 | C001     |      225 |
| 2021-11-02  |       110 | C002     |      220 |
| 2021-11-03  |       101 | C002     |      180 |
| 2021-11-04  |       109 | E003     |      130 |
| 2021-11-04  |       109 | E001     |      123 |
| 2021-11-05  |       108 | C001     |      160 |
| 2021-11-05  |       108 | C002     |      120 |
| 2021-11-05  |       110 | P001     |      180 |
| 2021-11-05  |       106 | P002     |       45 |
| 2021-11-05  |       107 | E003     |       56 |
+-------------+-----------+----------+----------+
19 rows in set (0.00 sec)

【问题】请统计 11 月份单日回答问题数大于等于 3 个的所有用户信息(author_date:回答日期,author_id:创作者id,answer_cnt:回答问题个数),若有多条数据符合条件,按 answer_date、author_id 升序排序。查询结果如下:

answer_dateauthor_idanswer_cnt
2021-11-021103

解答:

/*
select answer_date, author_id,  
       count(*) answer_cnt
from answer_tb
where answer_date between '2021-11-01' and '2021-11-30'
group by answer_date, author_id
having answer_cnt >= 3
order by answer_date, author_id;
*/
mysql> select answer_date, author_id,  
    ->        count(*) answer_cnt
    -> from answer_tb
    -> where answer_date between '2021-11-01' and '2021-11-30'
    -> group by answer_date, author_id
    -> having answer_cnt >= 3
    -> order by answer_date, author_id;
+-------------+-----------+------------+
| answer_date | author_id | answer_cnt |
+-------------+-----------+------------+
| 2021-11-02  |       110 |          3 |
+-------------+-----------+------------+
1 row in set (0.04 sec)

193、分组统计(4)

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

/*
drop table if exists issue_tb;
CREATE TABLE issue_tb(
issue_id char(10) NOT NULL, 
issue_type char(10) NOT NULL);
INSERT INTO issue_tb VALUES('E001' ,'Education');
INSERT INTO issue_tb VALUES('E002' ,'Education');
INSERT INTO issue_tb VALUES('E003' ,'Education');
INSERT INTO issue_tb VALUES('C001', 'Career');
INSERT INTO issue_tb VALUES('C002', 'Career');
INSERT INTO issue_tb VALUES('C003', 'Career');
INSERT INTO issue_tb VALUES('C004', 'Career');
INSERT INTO issue_tb VALUES('P001' ,'Psychology');
INSERT INTO issue_tb VALUES('P002' ,'Psychology');

drop table if exists answer_tb;
CREATE TABLE answer_tb(
answer_date date NOT NULL, 
author_id int(10) NOT NULL,
issue_id char(10) NOT NULL,
char_len int(10) NOT NULL);
INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E001' ,150);
INSERT INTO answer_tb VALUES('2021-11-1', 101, 'E002', 200);
INSERT INTO answer_tb VALUES('2021-11-1',102, 'C003' ,50);
INSERT INTO answer_tb VALUES('2021-11-1' ,103, 'P001', 35);
INSERT INTO answer_tb VALUES('2021-11-1', 104, 'C003', 120);
INSERT INTO answer_tb VALUES('2021-11-1' ,105, 'P001', 125);
INSERT INTO answer_tb VALUES('2021-11-1' , 102, 'P002', 105);
INSERT INTO answer_tb VALUES('2021-11-2',  101, 'P001' ,201);
INSERT INTO answer_tb VALUES('2021-11-2',  110, 'C002', 200);
INSERT INTO answer_tb VALUES('2021-11-2',  110, 'C001', 225);
INSERT INTO answer_tb VALUES('2021-11-2' , 110, 'C002', 220);
INSERT INTO answer_tb VALUES('2021-11-3', 101, 'C002', 180);
INSERT INTO answer_tb VALUES('2021-11-4' ,109, 'E003', 130);
INSERT INTO answer_tb VALUES('2021-11-4', 109, 'E001',123);
INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C001',160);
INSERT INTO answer_tb VALUES('2021-11-5', 108, 'C002', 120);
INSERT INTO answer_tb VALUES('2021-11-5', 110, 'P001', 180);
INSERT INTO answer_tb VALUES('2021-11-5' , 106, 'P002' , 45);
INSERT INTO answer_tb VALUES('2021-11-5' , 107, 'E003', 56);
*/

问答题目信息表:issue_tb(issue_id:问题编号,issue_type:问题类型),表中数据如下:

mysql> select * from issue_tb;
+----------+------------+
| issue_id | issue_type |
+----------+------------+
| E001     | Education  |
| E002     | Education  |
| E003     | Education  |
| C001     | Career     |
| C002     | Career     |
| C003     | Career     |
| C004     | Career     |
| P001     | Psychology |
| P002     | Psychology |
+----------+------------+
9 rows in set (0.01 sec)

创作者回答情况表:answer_tb(answer_date:创作日期,author_id:创作者编号,issue_id:回答问题编号,char_len:回答字数),表中数据如下:

mysql> select * from answer_tb;
+-------------+-----------+----------+----------+
| answer_date | author_id | issue_id | char_len |
+-------------+-----------+----------+----------+
| 2021-11-01  |       101 | E001     |      150 |
| 2021-11-01  |       101 | E002     |      200 |
| 2021-11-01  |       102 | C003     |       50 |
| 2021-11-01  |       103 | P001     |       35 |
| 2021-11-01  |       104 | C003     |      120 |
| 2021-11-01  |       105 | P001     |      125 |
| 2021-11-01  |       102 | P002     |      105 |
| 2021-11-02  |       101 | P001     |      201 |
| 2021-11-02  |       110 | C002     |      200 |
| 2021-11-02  |       110 | C001     |      225 |
| 2021-11-02  |       110 | C002     |      220 |
| 2021-11-03  |       101 | C002     |      180 |
| 2021-11-04  |       109 | E003     |      130 |
| 2021-11-04  |       109 | E001     |      123 |
| 2021-11-05  |       108 | C001     |      160 |
| 2021-11-05  |       108 | C002     |      120 |
| 2021-11-05  |       110 | P001     |      180 |
| 2021-11-05  |       106 | P002     |       45 |
| 2021-11-05  |       107 | E003     |       56 |
+-------------+-----------+----------+----------+
19 rows in set (0.00 sec)

【问题】请统计回答过教育类问题的用户里有多少用户回答过职场类问题,查询结果如下:

num
1

解答:

/*
select count(*) num
from answer_tb
where author_id in
      (select author_id from answer_tb where issue_id in
       (select issue_id from issue_tb where issue_type = 'Education'))
      and issue_id in
       (select issue_id from issue_tb where issue_type = 'Career');
*/
mysql> select count(*) num
    -> from answer_tb
    -> where author_id in
    ->       (select author_id from answer_tb where issue_id in
    ->        (select issue_id from issue_tb where issue_type = 'Education'))
    ->       and issue_id in
    ->        (select issue_id from issue_tb where issue_type = 'Career');
+-----+
| num |
+-----+
|   1 |
+-----+
1 row in set (0.00 sec)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睿思达DBA_WGX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值