MySQL聚合查询分组查询联合查询

#对应代码练习

-- 创建考试成绩表
DROP TABLE IF EXISTS exam;
CREATE TABLE exam (
    id bigint,
    name VARCHAR(20),
    chinese DECIMAL(3,1),
    math DECIMAL(3,1),
    english DECIMAL(3,1)
);
-- 插入测试数据
INSERT INTO exam (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);

1.聚合函数

函数说明
count()返回查到数据的数量
sum()返回查到数据的总和
avg()返回查到数据的平均值
max()返回查到数据的最大值
min()返回查到数据的最小值

注释:不是数字没有意义,聚合函数只能对数字型进行运算

1.1count函数:统计所有的行

select count(*) from  表名;

select count(1) from 表名;

select count(指定列) from 表名;

注释:在日常工作中,推荐大家使用count(*),这种写法是sql中规定

NULL 值不参与统计

1.2sum函数:求和

把查询结果中所有行中的指定列进行相加

注意:列的数据必须是数值型,不能是字符型,日期型等等,如果对非数值型计算,会报警告!

select sum(指定列) from 表名;

示例:所有学生语文成绩的总和 

NULL值不参与运算

1.3avg函数:求平均值

select avg(指定列/表达式) as 别名 from 表名;

示例:所有学生语文成绩的总和 的平均值

示例:所有语文,英语,数学三门成绩总和的平均分

1.4max函数,min函数:求最大值,最小值

select max(指定列) as 别名,min(指定列) as 别名 from 表名;

示例:语文最高分,英语最低分

 

 注释:同一列可以用不同的聚合函数

2.分组查询:group by子句

select 中使用group by子句可以对指定列进行分组查询。需要满足:使用group by子句进行分组长训时,select 指定的字段必须是“分组依据字段(需要分组的列)”,其他列想出现,必须包含在聚合函数中

#相关代码练习

create table emp (
    id bigint primary key auto_increment,
    name varchar(20) not null,
    role varchar(20) not null,
    salary decimal(10, 2) not null
);

insert into emp values (null, '马云', '老板', 1500000.00);
insert into emp values (null, '马化腾', '老板', 1800000.00);
insert into emp values (null, 'a哥', '讲师', 10000.00);
insert into emp values (null, 'b哥', '讲师', 12000.00);
insert into emp values (null, 'c姐', '学管', 9000.00);
insert into emp values (null, 'd姐', '学管', 8000.00);
insert into emp values (null, '猪悟能', '游戏角色', 700.5);
insert into emp values (null, '沙和尚', '游戏角色', 333.3);
 

语法:select 分组的列名,聚合函数(指定列),... from 表名 group by 分组的列;

示例:计算不同角色工资的平均值

 

注意:round(数值,小数点位数)

示例:round(avg(salary),2)

注意:group by之后可以跟order by子句

3.having 关键字

 group by子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用where语句,而是用having语句

where是对表每一行的真实数据进行过滤,where在from之后

having是对分组后,计算出来的结果进行过滤的,having在group by之后

示例:每种角色的平均工资大于1万小于10万

 

 4.联合查询(MySQL中重点内容)

#相关代码练习

CREATE TABLE `class`  (
  `class_id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`class_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES (1, '计算机系2019级1班');
INSERT INTO `class` VALUES (2, '中文系2019级3班');
INSERT INTO `class` VALUES (3, '自动化2019级5班');

-- ----------------------------
-- Table structure for course
-- ----------------------------

CREATE TABLE `course`  (
  `course_id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`course_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, 'Java');
INSERT INTO `course` VALUES (2, '中国传统文化');
INSERT INTO `course` VALUES (3, '计算机原理');
INSERT INTO `course` VALUES (4, '语文');
INSERT INTO `course` VALUES (5, '高阶数学');
INSERT INTO `course` VALUES (6, '英文');

-- ----------------------------
-- Table structure for student
-- ----------------------------

CREATE TABLE `student`  (
  `student_id` bigint NOT NULL AUTO_INCREMENT,
  `sn` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `mail` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `class_id` bigint NULL DEFAULT NULL,
  PRIMARY KEY (`student_id`) USING BTREE,
  UNIQUE INDEX `sn`(`sn` ASC) USING BTREE,
  INDEX `class_id`(`class_id` ASC) USING BTREE,
  CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`class_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '09982', '黑旋风李逵', 'xuanfeng@qq.com', 1);
INSERT INTO `student` VALUES (2, '00835', '菩提老祖', NULL, 1);
INSERT INTO `student` VALUES (3, '00391', '白素贞', NULL, 1);
INSERT INTO `student` VALUES (4, '00031', '许仙', 'xuxian@qq.com', 1);
INSERT INTO `student` VALUES (5, '00054', '不想毕业', NULL, 1);
INSERT INTO `student` VALUES (6, '51234', '好好说话', 'say@qq.com', 2);
INSERT INTO `student` VALUES (7, '83223', 'tellme', NULL, 2);
INSERT INTO `student` VALUES (8, '09527', '老外学中文', 'foreigner@qq.com', 2);

-- ----------------------------
-- Table structure for score
-- ----------------------------

CREATE TABLE `score`  (
  `score_id` bigint NOT NULL AUTO_INCREMENT,
  `student_id` bigint NULL DEFAULT NULL,
  `course_id` bigint NULL DEFAULT NULL,
  `score` decimal(5, 2) NULL DEFAULT NULL,
  PRIMARY KEY (`score_id`) USING BTREE,
  INDEX `student_id`(`student_id` ASC) USING BTREE,
  INDEX `course_id`(`course_id` ASC) USING BTREE,
  CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `score_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`course_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (1, 1, 1, 70.50);
INSERT INTO `score` VALUES (2, 1, 3, 98.50);
INSERT INTO `score` VALUES (3, 1, 5, 33.00);
INSERT INTO `score` VALUES (4, 1, 6, 98.00);
INSERT INTO `score` VALUES (5, 2, 1, 60.00);
INSERT INTO `score` VALUES (6, 2, 5, 59.50);
INSERT INTO `score` VALUES (7, 3, 1, 33.00);
INSERT INTO `score` VALUES (8, 3, 3, 68.00);
INSERT INTO `score` VALUES (9, 3, 5, 99.00);
INSERT INTO `score` VALUES (10, 4, 1, 67.00);
INSERT INTO `score` VALUES (11, 4, 3, 23.00);
INSERT INTO `score` VALUES (12, 4, 5, 56.00);
INSERT INTO `score` VALUES (13, 4, 6, 72.00);
INSERT INTO `score` VALUES (14, 5, 1, 81.00);
INSERT INTO `score` VALUES (15, 5, 5, 37.00);
INSERT INTO `score` VALUES (16, 6, 2, 56.00);
INSERT INTO `score` VALUES (17, 6, 4, 43.00);
INSERT INTO `score` VALUES (18, 6, 6, 79.00);
INSERT INTO `score` VALUES (19, 7, 2, 80.00);
INSERT INTO `score` VALUES (20, 7, 6, 92.00);

 4.1内连接

语法:

#标准写法
select 列名 from 表名1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;

#个人习惯写法

select 列名 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件

注释:习惯哪种用哪种!

 示例:查询“许仙”同学的成绩(分步骤做这道题)

1.首先确定哪几张表参与查询:成绩表和学生表;

select *from student,score;

2.根据表与表之间的主外键关系,确定过滤条件

student_id作为主外键关联字段

select *from student,score where student.student_id=score.student_id;

3.确定过滤条件

在where中添加student.name='许仙'的过滤条件

select *from student,score where student.student_id=score.student_id and student.`name`='许仙';

4.精简信息

只需要姓名和分数

select student.`name`,score.score from student,score where student.student_id=score.student_id and student.`name`='许仙';

注释:联合查询详细步骤

1.确定查询中涉及到有那些表。2.对目标表取笛卡尔积。3.确定连接条件。4.确定对整个结果集的过滤条件。5.精减查询字段

示例:查询所有同学的总成绩和个人信息

select st.student_id,st.`name`,sum(sc.score) as 总分 from student st,score sc where st.student_id=sc.student_id group by sc.student_id;

 4.2外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示就是左外连接,右侧的表全部显示就是右外连接

语法:
select*from 表1 left(right) join 表2 on 连接条件;

示例:查询没有考试的同学

select*from student st left join score sc on st.student_id=sc.student_id where sc.score_id is NULL;

 

4.3自链接

实现行与行之间的比较功能

注意:自连接时,因为同一张表需要用到两次,所以得起不一样的别名,否则会报错

示例:显示所有计算机原理成绩比Java成绩高的信息(分步骤演示)

1.确定涉及的表:课程表和成绩表

2.取笛卡尔积:select*from score sc1,score sc2;

3.连接条件就是student_id相同
select*from score sc1,score sc2 where sc1.student_id=sc2.student_id;

 4.观察结果集,确定过滤条件

1 是Java ,3是计算机原理

要么sc1.course_id=1 and sc2.course_id=3

要么sc1.course_id=3 and sc2.course_id=1

5.加入条件

select*from score sc1,score sc2 where sc1.student_id=sc2.student_id and sc1.course_id=3 and sc2.course_id=1 and sc1.score>sc2.score ;

5.子查询(嵌套查询)

 5.1单行子查询

示例:查询与“不想毕业”的同班同学

select *from student where class_id=(select class_id FROM student where `name`='不想毕业');

5.2多行子查询

示例:查询语文和英文成绩信息 (使用到in关键词)

 select *from score where course_id in (select course_id from course where `name`='语文' or `name`='英文');

6.exists关键字

语法:select*from 表名 where exists (查询语句);

exists 后面括号中的查询语句,如果有结果正常返回,则执行外层语句;如果返回空,则不执行

相当于if语句的判断条件,有结果返回true,没结果返回false

1.正常返回,因为学号有1的同学

2.返回为空,因为学号没有100的同学 

7.合并查询

关键词 union ,union all

语法:select *from 表名1 union/ union all select *from 表名2;

union 会去重,union all不会去重

在单表查询推荐使用 or,多表查询不能用or ,就必须用union来连接 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python学习笔记1

首先,想要学习一个东西,要弄清楚他是做什么的。需要用什么东西去完成他。 python是一种解释型编辑语言,类似于百度搜索引擎,主要目的是搜集资料和整理资料。 了解到这个目的之后,pytohon的学习和使用就简单很多。 第一…

15 go语言(golang) - 并发编程goroutine原理及数据安全

底层原理 Go 的 goroutine 是一种轻量级的线程实现,允许我们在程序中并发地执行函数。与传统的操作系统线程相比,goroutine 更加高效和易于使用。 轻量级调度 用户态调度:Go 运行时提供了自己的调度器,这意味着 goroutine 的创建…

dmdba用户资源限制ulimit -a 部分配置未生效

dmdba用户资源限制ulimit -a 部分配置未生效 1 环境介绍2 数据库实例日志报错2.1 mpp01 实例日志报错2.2 mpp02 实例日志报错 3 mpp02 服务器资源限制情况4 关闭SELinux 问题解决4.1 临时关闭 SELinux4.2 永久关闭 SELinux 5 达梦数据库学习使用列表 1 环境介绍 Cpu x86 Os Ce…

【计算机网络】核心部分复习

目录 交换机 v.s. 路由器OSI七层更实用的TCP/IP四层TCPUDP 交换机 v.s. 路由器 交换机-MAC地址 链接设备和设备 路由器- IP地址 链接局域网和局域网 OSI七层 物理层:传输设备。原始电信号比特流。数据链路层:代表是交换机。物理地址寻址,交…

【新人系列】Python 入门(十四):文件操作

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…

JVM指令集概览:基础与应用

写在文章开头 在现代软件开发中,Java 语言凭借其“一次编写,到处运行”的理念成为了企业级应用的首选之一。这一理念的背后支撑技术正是 Java 虚拟机(JVM)。JVM 是一个抽象的计算机,它实现了 Java 编程语言的各种特性,并且能够执行编译后的字节码文件。了解 JVM 的工作原…

HarmonyOS4+NEXT星河版入门与项目实战(22)------动画(属性动画与显示动画)

文章目录 1、属性动画图解2、案例实现-小鱼移动游戏1、代码实现2、代码解释3、资源图片4、实现效果3、显示动画4、案例修改-显示动画5、总结1、属性动画图解 这里我们用一张完整的图来汇整属性动画的用法格式和使用的主要属性范围,如下所示: 2、案例实现-小鱼移动游戏 1、代…

diffusion model: prompt-to-prompt 深度剖析

参考:diffusion model(十四): prompt-to-prompt 深度剖析-CSDN博客 P2P提出的Motivation 目前大火的文生图技术(text to image),给定一段文本(prompt)和随机种子,文生图模型会基于这两者生成一张图片。生…

【vue for beginner】Vue该怎么学?

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 vue2 和 vue3 Vue2现在正向vue3逐渐更新中,官方vue2已经不再更新。 这个历程和当时的pyt…

Python语法基础(三)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 我们这篇文章来说一下函数的返回值和匿名函数 函数的返回值 我们先来看下面的这一段函数的定义代码 # 1、返回值的意义 def func1():print(111111111------start)num166print…

光伏功率预测!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型时序预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量时序光伏功率预测 (Matlab2023b 多输入单输出) 1.程序已经调试好,替换数据集后,仅运行一个main即可运行,数据格式…

Jpype调用jar包

需求描述 ​   公司要求使用python对接口做自动化测试,接口的实现是Java,部分接口需要做加解密,因此需要使用python来调用jar包来将明文加密成密文,然后通过http请求访问接口进行测试。 如何实现 1.安装Jpype ​   首先我…

HTML飞舞的爱心

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色…

前端面试题-1(详解事件循环)

1.了解浏览器的进程模型 1.什么是进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 2.什么是线程&#xff1f…

记录QT5迁移到QT6.8上的一些问题

经常看到有的同学说网上的教程都是假的,巴拉巴拉,看看人家发布时间,Qt官方的API都会有所变动,多搜索,多总结,再修改记录。 下次遇到问题多这样搜索 QT 4/5/6 xxx document,对比一下就知道…

python常见问题-pycharm无法导入三方库

1.运行环境 python版本:Python 3.9.6 需导入的greenlet版本:greenlet 3.1.1 2.当前的问题 由于需要使用到greenlet三方库,所以进行了导入,以下是我个人导入时的全过程 ①首先尝试了第1种导入方式:使用pycharm进行…

【计算机网络】—— 物理层

文章目录 前言 一、基本概念 1. 传输媒体 2. 物理层协议的主要任务 3. 物理层的任务 二、传输媒体 1. 导引型 同轴电缆 双绞线 光纤 电力线 2. 非导引型 三、传输方式 1. 串行、并行 2. 同步、异步 3. 单工、半双工、全双工 四、编码和调制 1. 基本概念 2. …

OGRE 3D----4. OGRE和QML共享opengl上下文

在现代图形应用开发中,OGRE(Object-Oriented Graphics Rendering Engine)和QML(Qt Modeling Language)都是非常流行的工具。OGRE提供了强大的3D渲染能力,而QML则用于构建灵活的用户界面。在某些应用场景中,我们需要在同一个应用程序中同时使用OGRE和QML,并且共享OpenGL…

Lumoz TGE在即,NFT助力提前解锁esMOZ

引导语: 虽然近期比特币逼近 10 万美元大关,但很多加密玩家却满仓山寨币,收益甚至可能没有跑赢大盘。别着急,2024 年最后一个“大羊毛”来袭,这便是Lumoz esMOZOG NFT王炸空投组合。 11 月 5 日,模块化计算…

Trimble X12助力电力管廊数据采集,为机器人巡视系统提供精准导航支持

地下电缆是一个城市重要的基础设施,它不仅具有规模大、范围广、空间分布复杂等特点,更重要的是它还承担着信息传输、能源输送等与人们生活息息相关的重要功能,也是一个城市赖以生存和发展的物质基础。 01、项目概述 本次项目是对某区域2公里左…