当前位置: 首页 > news >正文

Mysql---多表查询

题目1:浙江大学用户题目回答情况

image

image

image

问题分解:

限定条件:来自浙江大学的用户,学校信息在user_profile表,答题情况在question_practice_detail表,因此需要通过device_id关联两个表的数据;

方法1:join两个表,用inner join,条件是on up.device_id=qpd.device_id and up.university='浙江大学'

    select q.device_id, q.question_id, q.resultfrom question_practice_detail as qjoin user_profile as uon u.device_id=q.device_id where u.university='浙江大学'order by question_id

结合代码进行分析

select 公共的列名需要标注来自哪个表(q.device_id),(后面的question_id和q.result是q表所特有的,可以加表名也可以不加,加上更规范)
from question_practice_detail as q(as后面是question_practice_detail表的别名  为 q)
join user_profile as u  (user_profile的别名是u,默认为inner join)
on u.device_id=q.device_id   (通过 device_id(设备 ID)作为唯一标识,将u表和q表关联起来。也就是on后面加两个表关联的条件)
where u.university='浙江大学'    (在关联的基础上,过滤出用户表中 university 字段等于浙江大学的记录。)
order by question_id   (按照 question_id(题目 ID)进行升序(默认)排列。)

方法2:先从user_profile表找到浙江大学的所有学生id列表where university='浙江大学',再去question_practice_detail表筛选出id在这个列表的记录,用where in

    select device_id, question_id, resultfrom question_practice_detailwhere device_id in (select device_id from user_profilewhere university='浙江大学')order by question_id

题目2:统计每个学校的答过题的用户的平均答题数

image

image

image

问题分解:

(如果某个列名是某个表独有的,不用写成 表名.列名 的形式,当然写了更规范)

  • 根据输出示例确定select的内容:university,生成新的列,列名为avg_answer_cnt(as 表头重命名)

  • 平均答题数量:在每个学校中,总的答题数量除以总人数就可以得到平均答题数量count(question_id) / count(distinct device_id)===》count()是统计总数的函数,distinct是去重关键字

  • 保留四位小数:ROUND(数值/表达式, 保留的小数位数)

  • 表连接:学校信息和答题信息不在同一个表,需要作连接

  • 表连接标识:device_id(两个表所共有的)

  • 每个学校平均答题数量:按照学校分组 group by university

  • 按照university升序排序:order by university(默认升序)

规范代码示例:

    select u.university,round(count(question_id)/count(distinct q.device_id),4) as avg_answer_cntfrom question_practice_detail as qjoin user_profile as uon q.device_id=u.device_idgroup by u.universityorder by u.university

注:

distinct是关键字不是函数 distinct 列名 即可

题目3:统计每个学校各难度的用户平均刷题数(多对多)

image

image

image

image

问题分解:

  • 连接表:将 user_profile 表与 question_practice_detail 表通过 device_id 进行连接,然后将question_practice_detail表 与 question_detail 表通过 question_id 进行连接,以获取每个用户的答题难度信息。(question_practice_detail是中间表)

  • 分组计算:group by university,difficult_level

  • 计算平均答题数量:计算该分组内,答题总量除以答题人数,得到平均答题数量(使用round函数保留四位小数,使用as 进行表名重命名)

规范代码示例:

    select u.university,qd.difficult_level,round(count(qpd.question_id)/count(distinct qpd.device_id),4) as avg_answer_cntfrom user_profile as ujoin question_practice_detail as qpdon u.device_id=qpd.device_idjoin question_detail as qdon qpd.question_id=qd.question_idgroup by u.university,qd.difficult_levelorder by u.university,qd.difficult_level

注:
为什么不能用u.id关联qd.id?

user_profile 存储用户信息,question_detail 存储题目信息,两者没有直接关联,必须通过中间表 question_practice_detail(答题记录)来关联

题目4:统计每个用户的平均刷题数

image
image
image
image

问题分解:

  • 连接表:我们需要将 user_profile 表与 question_practice_detail 表通过 device_id 进行连接,然后再与 question_detail 表通过 question_id 进行连接,以获取每个用户的答题难度信息。

  • 过滤数据:只选择 university 为 "山东大学" 的用户。

  • 分组计算:根据 difficult_level 进行分组,计算每个难度级别的平均答题量。

  • 计算平均值:对于每个分组,计算该组内用户的答题总数,并除以用户数量,得到平均答题量。

  • 格式化输出:将结果保留四位小数。

规范代码示例:

    select u.university,qd.difficult_level,round(count(qd.question_id)/count(distinct u.device_id),4) as avg_answer_cntfrom user_profile as ujoin question_practice_detail as qpdon u.device_id=qpd.device_idjoin question_detail as qdon qpd.question_id=qd.question_idwhere u.university='山东大学'group by u.university,qd.difficult_levelorder by u.university,qd.difficult_level

题目5:查找山东大学或者性别为男生的信息

image
image

问题分解:

  • 限定条件:学校为山东大学或者性别为男性的用户:university='山东大学', gender='male';
  • 分别查看&结果不去重:所以直接使用两个条件的or是不行的,直接用union也不行,要用union all,分别去查满足条件1的和满足条件2的,然后合在一起不去重
  • 不去重:union all

规范代码示例:

    select device_id,gender,age,gpa from user_profile where university='山东大学'union allselect device_id,gender,age,gpa from user_profile where gender='male'

注:
UNION ALL 的作用是:把多个结构相同的 SELECT 语句的结果集 “直接拼接” 在一起,返回所有行(包括重复行)。

  • 核心特点:不去重、不排序,执行效率高;
  • 适用场景:需要合并多个查询结果,且确认无重复行(或允许重复行)时。

UNION ALL的基础语法:

-- 语法结构:多个SELECT语句用UNION ALL连接,字段数/类型必须一致SELECT 字段1, 字段2, ... FROM 表1 WHERE 条件UNION ALLSELECT 字段1, 字段2, ... FROM 表2 WHERE 条件UNION ALLSELECT 字段1, 字段2, ... FROM 表3 WHERE 条件;

关键规则(必须遵守):

  1. 每个 SELECT 语句的字段数量必须完全相同(比如都选 3 个字段);

  2. 对应位置的字段数据类型必须兼容(比如第一个字段都是字符串、第二个都是数值);

  3. 字段名以第一个 SELECT 的字段名为准(后续查询的字段名会被覆盖)。

image

http://www.jsqmd.com/news/434776/

相关文章:

  • 音箱选型指南:从入门到高端,总有一款适配你的听音需求 - 包罗万闻
  • 2026年长沙装饰装修团队优选推荐:美迪装饰 - 2026年企业推荐榜
  • [Flutter-OH]Flutter 3.35 For HarmonyOS | 如何正确地使用第三方库(避免 hvigor srcPath 绝对路径报错)
  • 想体验地道成都味?2025年本地口碑火锅店盘点,美食/火锅/特色美食/烧菜火锅/社区火锅成都火锅品牌排行 - 品牌推荐师
  • 2026年3月防静电实验室家具厂家推荐,聚焦企业综合实力竞争力 - 品牌鉴赏师
  • 知行合一 稳健致远——Java开发者的成长修行之路
  • 分析2026年自清洗过滤器大型厂家,哪个品牌的产品更值得买 - 工业品牌热点
  • PHP 通过 Thrift 操作 Hbase
  • 一台清洁度检测设备如何影响产品良率?苏州西恩士用 “领先” 技术给出标准答案 - 工业设备研究社
  • 题解:蓝桥云课 3419 小郑的蓝桥平衡串
  • 优选供应商的自我修养:苏州西恩士工业如何用 “优质”清洁度分析系统 产品,赢得世界级 “信任”? - 工业设备研究社
  • 微软竟然出了免费的 AI 应用开发课?!我已经学上了
  • 煤矿井下保命装备:方盾半面罩有多重要?
  • 2026年3月异形垫片厂家推荐,精准检测与稳定性能深度解析 - 品牌鉴赏师
  • 题解:蓝桥云课 2109 统计子矩阵
  • 2026年靠谱的皮带输送机 公司推荐:螺旋塔输送机销售厂家推荐 - 品牌宣传支持者
  • 2026 年 3 月上海家电清洗 / 家电维修 / 房屋出租 / 宠物护理优质服务商推荐报告 - 2026年企业推荐榜
  • Go - Multiple-line String
  • 上班族有白发,用什么染发膏好?高效、不伤发、不刺鼻的推荐来了 - 品牌排行榜
  • 说说西安咸阳等地蛋糕咖啡西点培训学校哪家好,为你推荐靠谱品牌 - mypinpai
  • 2026年国内专业的隔油池疏通企业排名,行业内隔油池清理企业永邦环卫发展迅速,实力雄厚 - 品牌推荐师
  • 2026年3月流量清洗游戏盾服务商推荐,精准检测与性能解析 - 品牌鉴赏师
  • AI Max 395 实战记录:从零部署 AgentCPM,一键集成 DeepResearch 能力
  • 从黑马到领军者:苏州西恩士用十六年时间,让 “中国智造” 清洁度设备成为全球 “首选” - 工业设备研究社
  • 口碑好的三维扫描仪厂家有哪些?2026选型清单与工业级避坑指南 - 工业三维扫描仪评测
  • 活动报名网站怎么制作?4种实现方法详解 - Echo8
  • 2026年无锡靠谱的烛式过滤器工厂排名,看看有哪些品牌 - 工业品网
  • 题解:蓝桥云课 2095 九进制转十进制
  • 千亿保健市场红牌成分,NMN备受青睐,W+端粒塔为何只做细胞抗衰 - 速递信息
  • memc - 基于 shell 的交互式清理内存脚本