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

系列文章目录

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 studentGROUP BY className;

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

SELECT className,COUNT(className)FROM studentGROUP BY classNameHAVING COUNT(className)>4  -- 条件筛选

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

SELECT classname,COUNT(classname)FROM studentWHERE english >60GROUP BY classnameHAVING COUNT(classname)>3ORDER 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 idLIMIT 0,3   0 = (1-1)*3
-- 查询第二页的数据,每一页显示3条
SELECT * FROM student ORDER BY idLIMIT 3,3   3 = (2-1)*3
-- 查询第三页的数据,每一页显示3条
SELECT * FROM student ORDER BY idLIMIT 6,3   6 = (3-1)*3要显示的总共的页数需要计算
-- 需要的是第5页的数据的sql语句
select * from student limit (5-1)* 3,3

2.2 具体的案例

SELECT * FROM studentORDER BY idLIMIT 0,3

 

-- 查询第二页内容,每页显示5条数据
SELECT * FROM studentORDER BY idLIMIT 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 ADDCONSTRAINT 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.mzph.cn/news/12989.shtml

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

相关文章

【Kafka】消息队列Kafka进阶

目录 Kafka分区机制生产者分区写入策略轮询策略随机策略(不用)按key分配策略乱序问题自定义分区策略 消费者组Rebalance机制消费者分区分配策略Range范围分配策略RoundRobin轮询策略Stricky粘性分配策略 Kafka副本机制producer的ACKs参数acks配置为0acks…

three.js入门二:相机的zoom参数

环境: threejs:129 (在浏览器的控制台下输入: window.__THREE__即可查看版本)vscodewindowedge 透视相机或正交相机都有一个zoom参数,它可以用来将相机排到的内容在canvas上缩放显示。 要点:…

Mysql- 存储引擎

目录 1.Mysql体系结构 2.存储引擎简介 3.存储引擎特点 InnoDB MyISAM Memory 4.存储引擎选择 1.Mysql体系结构 MySQL整体的逻辑结构可以分为4层: 连接层:进行相关的连接处理、权限控制、安全处理等操作 服务层:服务层负责与客户层进行…

C++设计模式笔记

设计模式 如何解决复杂性? 分解 核心思想:分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单的问题。 抽象 核心思想:从高层次角度讲,人们处理复杂性有一个通用的技术,及抽象。…

ShardingSphere-Proxy水平分片详解与实战

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

Python爬虫时遇到SSL证书验证错误解决办法汇总

在进行Python爬虫任务时,遇到SSL证书验证错误是常见的问题之一。SSL证书验证是为了确保与服务器建立的连接是安全和可信的,但有时候可能会由于证书过期、不匹配或未受信任等原因导致验证失败。为了解决这个问题,本文将提供一些实用的解决办法…

【电路效应】信号处理和通信系统模型中的模拟电路效应研究(SimulinkMatlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、Simulink仿真实现 💥1 概述 在信号处理和通信系统模型中,模拟电路效应研究是指考虑到实际电路的特性对信号进行建模和分析的过程。模拟电路效应…

ffplay播放器剖析(6)----音视频同步分析

文章目录 1. 音视频同步基础1.1 音视频同步策略1.2 音视频同步概念1.3 FFmpeg中的时间单位1.4 不同结构体的time_base/duration分析1.5 不同结构体的pts/dts分析1.6 ffplay中Frame结构体分析1.7 Vidoe Frame PTS获取及矫正1.8 Audio Frame PTS的获取 2.以音频为基准3.以视频为基…

excel绘制折线图或者散点图

一、背景 假如现在通过代码处理了一批数据,想看数据的波动情况,是不是还需要写个pyhon代码,读取文件,绘制曲线,看起来也简单,但是还有更简单的方法,就是直接生成csv文件,csv文件就是…

【MySQL】事务之MVCC(多版本并发控制)

【MySQL】事务-MVCC 一、数据库并发的三种场景二、MVCC2.1 3个记录隐藏字段2.2 undo log(撤销日志)2.3 模拟MVCC---update2.3.1 delete2.3.2 insert2.3.3 select 2.4 Read View2.5 整体流程 三、RR(可重复读)与RC(读提…

【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

sql server表值函数

一、创建测试表 Employees 二、创建表值函数 -- DROP FUNCTION TableIntSplit;CREATE FUNCTION TableIntSplit(Text NVARCHAR(4000),Sign NVARCHAR(4000)) RETURNS tempTable TABLE(Id INT ) AS BEGIN DECLARE StartIndex INT DECLARE FindIndex INT DECLARE Content VARCHAR(…

阿里云盘自动每日签到无需部署无需服务器(仅限学习交流使用)

一、前言 阿里云盘自动每日签到,无需部署,无需服务器 执行思路:使用金山文档的每日定时任务,执行阿里云盘签到接口。 二、效果展示: 三、步骤: 1、进入金山文档网页版 金山文档官网:https:…

Verilog语法学习——LV7_求两个数的差值

LV7_求两个数的差值 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 根据输入信号a,b的大小关系,求解两个数的差值:输入信号a,b…

【飞书】飞书导出md文档 | 飞书markdown文档导出 | 解决飞书只能导出pdf word

一、飞书导出markdown github地址:https://github.com/Wsine/feishu2md 这是一个下载飞书文档为 Markdown 文件的工具,使用 Go 语言实现。 请看这里:招募有需求和有兴趣的开发者,共同探讨开发维护,有兴趣请联系。 二、…

MySQL数据库分库分表备份(shell脚本)

创建目录 mkdir /server/scripts 一、使用脚本实现分库备份 1、创建脚本并编写 [rootlocalhost scripts]# vim bak_db_v1.sh #!/bin/bash ######################################### # File Name:bak_db_v1.sh # Version: V1.0 # Author:Shen QL # Email:17702390000163.co…

干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

前言 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽都顺利。 如…

短视频矩阵系统源码开发流程​

一、视频矩阵系统源码开发流程分为以下几个步骤: 四、技术开发说明: 产品原型PRD需求文档产品交互流程图部署方式说明完整源代码源码编译方式说明三方框架和SDK使用情况说明和代码位置平台操作文档程序架构文档 一、抖音SEO矩阵系统源码开发流程分为以…

【Linux】进程通信 — 共享内存

文章目录 📖 前言1. 共享内存2. 创建共享内存2.1 ftok()创建key值:2.2 shmget()创建共享内存:2.3 ipcs指令:2.4 shmctl()接口:2.5 shmat()/shmdt()接口:2.6 共享内存没有访问控制:2.7 通过管道对共享内存进…

Python进行数据分析(详细教程)

1.为什么选择Python进行数据分析? Python是一门动态的、面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言。Python入门简单,代码可读性强,一段好的Python代码,阅读起来像是在读一篇外语文章。Pyth…