MySQL笔记——表的分组查询、表的分页查询、表的约束、数据库设计

news2024/11/12 23:09:58

系列文章目录

MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明

MySQL笔记——表的修改查询相关的命令操作

MySQL案例——多表查询以及嵌套查询​​​​​​

 MySQL笔记——数据库当中的事务以及Java实现对数据库进行增删改查操作

文章目录

前言

一 表的分组查询

1.1 语法

 1.2. 注意点

1.3 案例添加数据演示

 1.4 相关分组案例讲解

数据内容

1.4.1 统计学生表中男女学生数量分别有多少 

1.4.2 统计男生的数学平均值,女生数学的平均值 

1.4.3 统计不同性别的学生XX成绩在XX分以上的平均值

1) 统计不同性别的学生数学成绩在85分以上的平均值

 2) 统计不同性别的学生英语成绩在95分以上的平均值

3)变形——统计不同性别的学生英语平均值在95分之上

PS补充内容:where与having的区别

1.4.4 统计不同 班级的学生的总人数

1.4.5  统计班级总人数大于2的班级的总人数

1.4.6 统计英语成绩在60分之上的班级的总人数,总人数按照从大到小进行排序

二  分页查询

2.1 语法

2.2 具体的案例

三 约束

3.1 几种约束详解

3.1.1  非空约束(not null)

3.1.2 唯一约束(unique)

3.1.3 主键约束(primary key)

3.1.4 设置某列自动增长

3.1.5 外键约束

3.2  约束添加的时机

总结


前言

本文主要介绍表的分组查询、表的分页查询、表的约束,以及相关的案例展示。

一 表的分组查询

1.1 语法

group by 分组字段;

 1.2. 注意点

1. 分组之后查询的字段:分组字段、聚合函数     

2. where 和 having 的区别?

  • where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
  • where 后不可以跟聚合函数,having可以进行聚合函数的判断。

按照性别分组。分别查询男、女同学的平均分

 SELECT 
    sex , AVG(math) 
    FROM student 
    GROUP BY sex;

按照性别分组。分别查询男、女同学的平均分,人数

 SELECT 
    sex , AVG(math),COUNT(id) 
    FROM student 
    GROUP BY sex;

按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组

SELECT 
    sex , AVG(math),COUNT(id) 
    FROM student 
    WHERE math > 70 
    GROUP BY sex;

按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人        

SELECT 
    sex , AVG(math),
    COUNT(id) 
    FROM student 
    WHERE math > 70 
    GROUP BY sex 
    HAVING COUNT(id) > 2;
        
SELECT sex , AVG(math),
    COUNT(id) 人数 
    FROM student 
    WHERE math > 70 
    GROUP BY sex 
    HAVING 人数 > 2;

group by 的用法

group by 是 SQL 查询语句中的一个关键字,用于对结果集进行分组操作。它通常与聚合函数(如 SUM、COUNT、AVG 等)一起使用,以便在分组的基础上进行计算。

group by 的基本语法如下:

SELECT 列名1, 列名2, ... FROM 表名 GROUP BY 列名1, 列名2, ...

在执行 group by 操作时,首先根据指定的列名进行分组,然后对每个分组进行计算或者筛选。查询结果将返回每个分组的聚合结果,而不是每条原始数据的详细信息。

以下是一个示例查询,演示了 group by 的用法:

SELECT 
    department, COUNT(*) as employee_count 
    FROM employees 
    GROUP BY department;

这个查询将根据 employees 表中的 department 列对数据进行分组,并计算每个部门的员工数量。最后的结果将返回每个部门和对应的员工数量。

需要注意的是,在 group by 子句中指定的列名必须是查询结果中出现的列名之一,或者是可以通过聚合函数计算得到的列名。否则,将会引发错误。

1.3 案例添加数据演示

此处演示使用SQLyog软件操作,其操作与Navicat类似。

更改列时选中改变表菜单进行更改。

假设添加一个新的列id这一列,操作如下:

此处也可以使用SQL语句来添加新的一列,或者直接在外接工具上面添加一列,添加完成之后记得保存退出即可。

ALTER TABLE score ADD id int(20); 

 保存完成之后刷洗一下即可看到表的新列添加进去了。

 查看表的机构如下

DESC score;

 添加前面的id内容之后保存一下。

 1.4 相关分组案例讲解

数据内容

INSERT INTO student VALUES(3,'tom',23,'女','2班',88,34,69);
INSERT INTO student VALUES(6,'dismiss',25,'男','1班',48,94,89);
INSERT INTO student VALUES(9,'injury',33,'女','3班',76,34,59);
INSERT INTO student VALUES(2,'export',26,'女','2班',88,54,65);
INSERT INTO student VALUES(7,'spot',20,'男','1班',98,74,76);
INSERT INTO student VALUES(5,'crash',22,'女','2班',78,44,86);
INSERT INTO student VALUES(10,'pollect',24,'男','3班',82,64,79);
INSERT INTO student VALUES(4,'expolit',27,'女','1班',68,39,81);
INSERT INTO student VALUES(8,'exhaust',29,'女','1班',87,64,69);
INSERT INTO student VALUES(12,'collapse',32,'女','2班',58,84,99);
INSERT INTO student VALUES(13,'highly',35,'男','1班',76,73,69);
INSERT INTO student VALUES(11,'discourage',25,'女','3班',79,31,67);
INSERT INTO student VALUES(14,'slippery',28,'男','2班',80,67,84);

打开表查看信息

1.4.1 统计学生表中男女学生数量分别有多少 

查看难受和女生的数量: 

SELECT sex,COUNT(sex) AS 数量 
	FROM student 
	GROUP BY sex;

 

 错误的书写方式演示

MySQL报错 SELECT list is not in GROUP BY clause and contains nonaggregated column…的原因如下:

在mysql5.7以上的版本中,对于 group by 的这种聚合操作,如果在select 中的列,没有在group by 中出现,那么这个SQL是不合法的,因为列不在group by的从句中,所以对于设置了这个mode的数据库,在使用group by 的时候,就要用MAX(),SUM(),ANT_VALUE()的这种聚合函数,才能完成GROUP BY 的聚合操作

 注意:

  • SQL里面出现分组,select后面字段的字段必须是group by 后面出现的字段
  • 分组语句中select后面的还可以是聚合函数

1.4.2 统计男生的数学平均值,女生数学的平均值 

SELECT sex,AVG(math) 
    FROM student 
    GROUP BY sex

1.4.3 统计不同性别的学生XX成绩在XX分以上的平均值

1) 统计不同性别的学生数学成绩在85分以上的平均值

SELECT sex,AVG(math) 
	FROM student 
	WHERE math > 85 
	GROUP BY sex;

 2) 统计不同性别的学生英语成绩在95分以上的平均值

SELECT sex,AVG(english) 
	FROM student 
	WHERE english > 95 
	GROUP BY sex;

PS:where先于分组之前执行

3)变形——统计不同性别的学生英语平均值在95分之上

SELECT 
	sex,AVG(english) 
	FROM student 
	GROUP BY sex 
	HAVING AVG(english) > 80;

查询结果: 

PS补充内容:where与having的区别

HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法

但是 WHERE 和 HAVING 关键字也存在以下几点差异
1.一般情况下,WHERE 用于过滤数据行,而 HAVING 用于过滤分组
2.WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数
3.WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤
4.WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤。也就是说,WHERE 根据数据表中的字段直接进行过滤,而 HAVING 是根据前面已经查询出的字段进行过滤。
5.WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名

1.4.4 统计不同 班级的学生的总人数

SELECT 
      className,COUNT(className)
      FROM student
      GROUP BY className;

1.4.5  统计班级总人数大于2的班级的总人数

SELECT 
      className,COUNT(className)
      FROM student
      GROUP BY className
      HAVING COUNT(className)>4  -- 条件筛选

1.4.6 统计英语成绩在60分之上的班级的总人数,总人数按照从大到小进行排序

SELECT classname,COUNT(classname)
	FROM student
	WHERE english >60
	GROUP BY classname
	HAVING COUNT(classname)>3
	ORDER BY COUNT(classname) DESC;

 

二  分页查询

        当我们处理大量数据时,通常需要进行分页查询来减少内存的使用和提高查询效率。MySQL提供了LIMIT和OFFSET子句来实现分页查询。

        LIMIT子句用于限制查询结果的数量,而OFFSET子句用于指定查询结果的起始位置。

        以下是一个示例代码,展示了如何在MySQL中进行分页查询:

2.1 语法

limit 开始的索引,每页查询的条数;

计算公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

limit 参数1,参数2
    参数1:从第几条数据开始
    参数2:每页显示的条数

    已知的数据:当前的页码  currentPage  每一页显示的多少条数据 pageCount
    参数1的获取公式 = (currentPage-1)* pageCount

举例:每页显示3条记录 

-- 查询第一页的数据,每一页显示3条
SELECT * FROM student 
    ORDER BY id
    LIMIT 0,3   0 = (1-1)*3
-- 查询第二页的数据,每一页显示3条
SELECT * FROM student 
    ORDER BY id
	LIMIT 3,3   3 = (2-1)*3
-- 查询第三页的数据,每一页显示3条
SELECT * FROM student 
    ORDER BY id
	LIMIT 6,3   6 = (3-1)*3
	
要显示的总共的页数需要计算
-- 需要的是第5页的数据的sql语句
select * from student limit (5-1)* 3,3

2.2 具体的案例

SELECT * FROM student
	ORDER BY id
	LIMIT 0,3

 

-- 查询第二页内容,每页显示5条数据
SELECT * FROM student
	ORDER BY id
	LIMIT 5,5

三 约束

一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。MySQL数据库通过约束(constraints)防止无效的数据进入到表中,以保护数据的实体完整性。

约束的分类
在 MySQL 中,主要有六种约束:

  • 1、NOT NULL:非空约束,用于约束该字段的值不能为空。比如姓名、学号等。
  • 2、DEFAULT:默认值约束,用于约束该字段有默认值,约束当数据表中某个字段不输入值时,自动为其添加一个已经设置好的值。比如性别。
  • 3、PRIMARY KEY:主键约束,用于约束该字段的值具有唯一性,至多有一个,可以没有,并且非空。比如学号、员工编号等。
  • 4、UNIQUE:唯一约束,用于约束该字段的值具有唯一性,可以有多个,可以没有,可以为空。比如座位号。
  • 5、CHECK:检查约束,用来检查数据表中,字段值是否有效。比如年龄、性别。
  • 6、FOREIGN KEY:外键约束,外键约束经常和主键约束一起使用,用来确保数据的一致性,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中某列的值。比如学生表的专业编号,员工表的部门编号,员工表的工种编号。

3.1 几种约束详解

约束是为了对表中的数据进行限定,保证数据的正确性、有效性和完整性。    

    1. 主键约束:primary key
    2. 非空约束:not null
    3. 唯一约束:unique
    4. 外键约束:foreign key

3.1.1  非空约束(not null)

某一列的值不能为null

1. 创建表时添加约束 

CREATE TABLE stu(
            id INT,
            NAME VARCHAR(20) NOT NULL -- name为非空
        );

 

2. 创建表完后,添加非空约束

ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

 

 3. 删除name的非空约束

 ALTER TABLE stu MODIFY NAME VARCHAR(20);

3.1.2 唯一约束(unique)

某一列的值不能重复

1. 注意:
        * 唯一约束可以有NULL值,但是只能有一条记录为null

2. 在创建表时,添加唯一约束

CREATE TABLE stu(
            id INT,
            phone_number VARCHAR(20) UNIQUE -- 手机号
        );

3. 删除唯一约束

ALTER TABLE stu DROP INDEX phone_number;

4. 在表创建完后,添加唯一约束

 ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

3.1.3 主键约束(primary key)

1. 注意:

        1. 含义:非空且唯一
        2. 一张表只能有一个字段为主键
        3. 主键就是表中记录的唯一标识

2. 在创建表时,添加主键约束

create table stu(
            id int primary key,-- 给id添加主键约束
            name varchar(20)
        );

 

 3. 删除主键
-- 错误 alter table stu modify id int ;

ALTER TABLE stu DROP PRIMARY KEY;

4. 创建完表后,添加主键

ALTER TABLE stu MODIFY id INT PRIMARY KEY;

3.1.4 设置某列自动增长

  • 1.  概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
  • 2. 在创建表时,添加主键约束,并且完成主键自增长     
create table stu(
            id int primary key auto_increment,-- 给id添加主键约束
            name varchar(20)
        );

3. 删除自动增长

ALTER TABLE stu MODIFY id INT;

4. 添加自动增长

ALTER TABLE stu MODIFY id INT AUTO_INCREMENT; 

3.1.5 外键约束

1. 外键约束语法

CREATE TABLE emp(
        id INT PRIMARY KEY AUTO_INCREMENT,
        sname VARCHAR(20) ,
        did INT,        -- 添加外键约束
        CONSTRAINT emp_depart FOREIGN KEY (did) REFERENCES depart(id)
    )

2. 删除外键 

ALTER TABLE emp DROP FOREIGN KEY emp_depart

3. 表创建成功之后添加外键约束

ALTER TABLE emp ADD
    CONSTRAINT emp_depart FOREIGN KEY (did) REFERENCES depart(id)
    on delete cascade on update cascade

4. 不推荐使用级联操作:
    级联

  •     1、级联删除  on delete cascade
  •     2、级联更新  on update cascade 

3.2  约束添加的时机

  • 1、创建表的的时候添加
  • 2、创建表完成以后,也可以添加
  • 3、删除约束

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

室外高精度人员定位系统解决方案:实现安全与效率的完美平衡

在如今高度竞争的商业环境中,室外高精度人员定位系统已成为许多行业提高安全性和效率的关键工具。 对此,华安联大推出室外高精度人员定位系统解决方案,该方案通过融合多种定位技术和优化算法,实现高精度定位,并通过真…

【Docker】Docker容器与虚拟机的对比、三要素、架构和镜像加速器的详细讲解

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…

亚马逊建议卖家使用“客户评论”选项卡提高产品评级!

亚马逊美国站发布公告称客户评论见解选项卡通过分析评论来帮助卖家推出评价较高的产品,以更好地了解客户偏好和当前趋势,从而提高产品评级,以下是公告内容: 客户评论见解选项卡通过分析评论来帮助卖家推出评价较高的产品&#xf…

一份百万收藏的《从零开始写分布式服务框架》称霸Github榜首!

前言 架构说简单点就是一堆技术、框架、工具的组合,至于怎么组合,这就非常考验架构师的经验和水平。一个优秀的架构,可以让开发效率变得更加高效,为企业节省更多的成本。程序员可将自己更多的精力放在业务需求的实现上&#xff0…

Redis 集群部署

Redis 3.0 版本后正式推出 Redis 集群模式,该模式是 Redis 的分布式的解决方案,是一个提供在多个 Redis 节点间共享数据的程序集,且 Redis 集群是去中心化的,它的每个 Master 节点都可以进行读写数据,每个节点都拥有平等的关系,每个节点都保持各自的数据和整个集群的状态…

基于YOLOv8开发构建蝴蝶目标检测识别系统

在前面的一篇博文中已经很详细地描述了如何基于YOLOv8开发构建自己的个性化目标检测模型,感兴趣的话可以看下: 《基于YOLOv8开发构建目标检测模型超详细教程【以焊缝质量检测数据场景为例】》 本文的主要目的就是基于YOLOv8来开发构建细粒度的蝴蝶目标…

【高压架构】AP5199S LED平均电流型恒流驱动IC 0.01调光 景观舞台汽车灯驱动照明

说明 AP5199S 是一款外围电路简单的多功能平均电流型 LED 恒流驱动器,适用于宽电压范围的非隔离式大功率恒流 LED 驱动领域。芯片 PWM 端口支持超小占空比的 PWM 调光,可响应 60ns 脉宽。为客户提供解决方案,限度地发挥灯具优势,…

Betaflight飞控之FAILSAFE机制

Betaflight飞控之FAILSAFE机制 1. 源由2. 设计2.1 触发方式2.1.1 遥控开关触发2.1.2 遥控信号丢失 2.2 FAILSAFE策略2.2.1 Drop mode2.2.2 Landing mode2.2.3 GPS Return mode 3. GPS救援状态机4. 总结5. 参考资料 1. 源由 之前对航模飞控之FAILSAFE机制做了一个简单的探讨&am…

【JavaEE初阶】——第七节.Servlet入门学习笔记

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:JavaEE进阶 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录 前…

基于 moleculer 微服务架构的智能低代码PaaS 平台源码 可视化开发

低代码开发平台源码 低代码管理系统PaaS 平台 无需代码或通过少量代码就可以快速生成应用程序的开发平台。 本套低代码管理后台可以支持多种企业应用场景,包括但不限于CRM、ERP、OA、BI、IoT、大数据等。无论是传统企业还是新兴企业,都可以使用管理后台…

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…

SpringBoot项目使用MyBatisX+Apifox IDEA 插件快速开发

今天跟大家介绍两个快速开发项目的插件。能大大提高开发效率。希望能帮助到大家。 1、MyBatisX 插件 MyBatis-Plus为我们提供了强大的mapper和service模板,能够大大的提高开发效率。但是在真正开发过程中,MyBatis-Plus并不能为我们解决所有问题&#xf…

Spark Streaming流媒体引擎

Spark Streaming是Spark的上一代流媒体引擎。Spark Streaming不再有更新,它是一个遗留项目。Spark中有一个更新且更易于使用的流媒体引擎,称为结构化流媒体 概述 Spark Streaming是核心Spark API的扩展,支持实时数据流的可扩展、高吞吐量、…

技术分享 | App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具,可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

Python Geoplotlib 可视化地理数据的综合指南

Geoplotlib: Exploring the World with Python Python Geoplotlib 可视化地理数据的综合指南 Geoplotlib是一个强大的Python库,用于可视化地理数据。它提供了一种简单直观的方法来创建地图并在其上绘制地理数据。 Geoplotlib 建立在 matplotlib 和 numpy…

有哪些常用的设计素材资源网站?

设计师要想在瞬息万变的设计世界中紧跟潮流,就需要不断探索和访问流行的UI设计网站,看看什么是时尚。UI设计网站也是寻求可能解决方案、脚本和设计反馈的好地方。Behance对很多设计师来说并不陌生,是Adobe的UI设计网站。然而,2022…

蓝桥杯单片机第九届国赛 真题+代码

iic.c /* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础&#xff0c;根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求&#xff0c;进行代码调试和修改。 */ #include <STC1…

【Vue3】局部组件和全局组件

1. 局部组件 Card.vue <template><div class"card"><header><div>标题</div><div>副标题</div></header><section>内容</section></div> </template><script setup lang"ts"…

Jenkins集成SonarQube保姆级教程

Jenkins是自动化部署平台&#xff0c;一个粗眉大眼的糙汉子&#xff01; SonarQube是代码扫描平台&#xff0c;一个眉目清秀的小女子&#xff01; 有一天&#xff0c;上天交给我一个任务&#xff0c;去撮合撮合他们&#xff01; 我抬头看了看天&#xff0c; 不&#xff0c;…

第五章 传输层

第五章 传输层 5.1 运输层的功能 运输层功能&#xff1a; 运输层为应用进程之间提供 端到端的逻辑通信&#xff08;但网络层是为主机之间提供逻辑通信&#xff09;。 运输层还要对收到的报文进行差错检测。 运输层提供面向连接和无连接的服务 ​ 从通信和信息处理的角度看…