我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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. 注意点

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

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 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 id    LIMIT 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

创建表时添加约束 

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

 

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

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

 

 3. 删除name的非空约束

 ALTER TABLE stu MODIFY NAME VARCHAR(20);

3.1.2 唯一约束(unique)

某一列的值不能重复

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

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

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

删除唯一约束

ALTER TABLE stu DROP INDEX phone_number;

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

 ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

3.1.3 主键约束(primary key)

注意:

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

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

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

 

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

ALTER TABLE stu DROP PRIMARY KEY;

创建完表后,添加主键

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)        );

删除自动增长

ALTER TABLE stu MODIFY id INT;

添加自动增长

ALTER TABLE stu MODIFY id INT AUTO_INCREMENT; 

3.1.5 外键约束

外键约束语法

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

删除外键 

ALTER TABLE emp DROP FOREIGN KEY emp_depart

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

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

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

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

3.2  约束添加的时机

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

总结

以上就是今天的内容~

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

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

来源地址:https://blog.csdn.net/m0_56006701/article/details/131931154

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL数据库约束及表的设计实例分析

这篇“MySQL数据库约束及表的设计实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL数据库约束及表的设计实例
2023-07-02

mysql数据库表的多条件查询

mysql数据库表的多条件查询 一、select语句基本查询 SELECT 字段1,字段2....FROM 表名[WHERE 条件] [LIMIT N][ OFFSET M] select可以返回多条数据也可以返回一条数据如果要查询所有的字
2023-08-22

单个表上亿行数据的主键、索引设计,及分页查询

单个表数据量超过1亿的,需要精心设计表的主键、索引,其分页查询也不能乱写,否则性能不佳。此文章特介绍作者心得。 一,概述一般而言,我们对关系型数据库系统,进行表结构设计时,会按数据的种类,进行分类,一般有如下种类:1)主数据,其数据量基本稳定,不随时间而
单个表上亿行数据的主键、索引设计,及分页查询
2015-11-11

mysql怎么查询数据库中的表名

本篇内容介绍了“mysql怎么查询数据库中的表名”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!查询数据库中的表名查询一个数据库中含有某关键词
2023-01-30

mysql怎么查询当前数据库的表

要查询当前数据库的表,可以使用以下 SQL 查询语句:SHOW TABLES;这条 SQL 查询语句会返回当前选定数据库中所有的表名列表。你可以在 MySQL 命令行客户端或者任何支持 SQL 查询的工具中执行这个查询语句,以获取当前数据
mysql怎么查询当前数据库的表
2024-04-15

MySQL连表查询分组去重的实现示例

目录业务逻辑数据表结构查询逻辑SQL脚本脚本说明业务逻辑通过多种渠道将小程序的活动页链接发布出去,比如通过多多种短信附带链接( channel 就记为 sms1,sms2,sms3 ),或者海报上面贴微信小程序的二维码( channel 记
2022-05-24

编程热搜

目录