【MySQL】_4.MySQL表的设计与聚合查询

这篇具有很好参考价值的文章主要介绍了【MySQL】_4.MySQL表的设计与聚合查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 表的设计

2. 查询与新增的联合

3. 聚合查询

3.1 聚合查询函数

3.1.1  COUNT函数

3.1.2 SUM函数

3.1.3 AVG 函数

 3.1.4 MIN函数 与 MAX函数

3.2 GROUP BY子句

3.3 HAVING 


1. 表的设计

(一)、梳理清楚需求中的“实体”:

(1)数据库中的实体类比面向对象的对象;

(2)很多时候每个实体都需要对应一张表来表示;

(二)、梳理清楚实体之间的关系:

(1)一对一:如学生与账号的关系:

第一种设计方式:一个大表包含学生信息+账号信息;

account_student(accountId,username,password,studentName...);

第二种设计方式:两个表相互关联:账户表+学生信息表;

account(accountId,userName,password,studentId);

student(studentId,studentName...);

将账户表通过studentId这一列与学生信息表联系起来了;

第三种设计方式

account(accountId,userName,password);

student(studentId, studentName,accountId);

这种方式使用最多,后续教师表也可与account表关联;

(2)一对多:如班级与学生的关系:

第一种设计方式:使用数组或列表保存一个表的信息(但MySQL不存在数组类型,不允许这种设计方式,但有些数据库如Redis存在数组类型,就可以考虑这种设计方式)

student(studentId,studentName);

class(classId,className,studentIdList); 

第二种设计方式(最典型的一对多设计方式)

class(classId,className);

student(studentId,name,classId);

(3)多对多:如学生与课程的关系

设计方式学生表+课程表+关联表:

student(studentId,studentName);

course(courseId,courseName);

student_course(studentId,courseId);

(三)、按照不同的关系代入既定公式;

注:一般只要实体和关系明确了,表的设计也基本成型。如果实体较多关系较复杂,可以画一个“实体关系图”(ER图)来表示;

2. 查询与新增的联合

查询与新增的联合即:将查询结果作为新增的数据;

现有student表如下(student2表为空):

mysql> select* from student;
+------+------+
| id   | name |
+------+------+
|    1 | 张三 |
|    2 | 李四 |
|    3 | 王五 |
+------+------+
3 rows in set (0.00 sec)

先将student表的数据新增至student2表中:

mysql> insert into student2 select* from student;
Query OK, 3 rows affected (0.10 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select* from student2;
+------+------+
| id   | name |
+------+------+
|    1 | 张三 |
|    2 | 李四 |
|    3 | 王五 |
+------+------+
3 rows in set (0.00 sec)

注:(1)查询与新增联合的要求是:查询结果的列数和类型与插入表的列数和类型匹配

3. 聚合查询

聚合查询即:查询过程中,表的行与行之间进行一定的运算

表达式查询是在查询过程中,表的列与列之间进行一定运算)

3.1 聚合查询函数

聚合查询函数时SQL提供的库函数:

函数 说明
COUNT ( [ DISTINCT ] ) expr ) 返回查询到数据的数量
SUM ( [ DISTINCT ] ) expr ) 返回查询到数据的总和,不是数字没有意义
AVG ( [ DISTINCT ] ) expr ) 返回查询到数据的平均值,不是数字没有意义
MAX ( [ DISTINCT ] ) expr ) 返回查询到数据的最大值,不是数字没有意义
MIN ( [ DISTINCT ] ) expr ) 返回查询到数据的最小值,不是数字没有意义

3.1.1  COUNT函数

 基于以下student表:

mysql> select* from student;
+------+------+
| id   | name |
+------+------+
|    1 | 张三 |
|    2 | 李四 |
|    3 | 王五 |
|    4 | NULL |
+------+------+
4 rows in set (0.00 sec)

使用聚合函数count分别查询表格总行数,id列行数和name列行数:

mysql> select count(*) from student;
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

mysql> select count(id) from student;
+-----------+
| count(id) |
+-----------+
|         4 |
+-----------+
1 row in set (0.00 sec)

mysql> select count(name) from student;
+-------------+
| count(name) |
+-------------+
|           3 |
+-------------+
1 row in set (0.00 sec)

注:(1)NULL作为空值,在使用count(*)进行查询是是可以被计数的,但是使用count(列名)就不会被计数;

3.1.2 SUM函数

基于以下exam_result表:

mysql> select* from exam_result;
+------+--------+---------+------+---------+
| id   | name   | chinese | math | english |
+------+--------+---------+------+---------+
|    1 | 唐三藏 |    67.0 | 98.0 |    56.0 |
|    2 | 孙悟空 |    87.5 | 78.0 |    77.0 |
|    3 | 猪悟能 |    88.0 | 98.5 |    90.0 |
|    4 | 曹孟德 |    82.0 | 84.0 |    67.0 |
|    5 | 刘玄德 |    55.5 | 85.0 |    45.0 |
|    6 | 孙权   |    70.0 | 73.0 |    78.5 |
|    7 | 宋公明 |    75.0 | 65.0 |    30.0 |
+------+--------+---------+------+---------+
7 rows in set (0.00 sec)

使用聚合函数SUM计算语文成绩总和:

mysql> select sum(chinese) from exam_result;
+--------------+
| sum(chinese) |
+--------------+
|        525.0 |
+--------------+
1 row in set (0.00 sec)

注:(1)sum函数名与其后的括号之间不能有空格,否则会报错;

(2)前文提过:NULL与其他数据计算结果仍为NULL,但SUM函数会自动跳过结果为NULL的和,对结果不构成影响;

(3)聚合函数SUM只对数字加和有效,对字符串类型无效,结果为0;

3.1.3 AVG 函数

仍基于上文exam_result表,使用聚合函数AVG查询语文成绩与总分平均分:

mysql> select sum(chinese) from exam_result;
+--------------+
| sum(chinese) |
+--------------+
|        525.0 |
+--------------+
1 row in set (0.00 sec)

mysql> select avg(chinese+math+english)as avgTotal from exam_result;
+-----------+
| avgTotal  |
+-----------+
| 221.42857 |
+-----------+
1 row in set (0.00 sec)

 3.1.4 MIN函数 与 MAX函数

仍基于以上exam_result表,使用聚合函数MAX和MIN查询最高和最低语文成绩:

mysql> select max(chinese),min(chinese) from exam_result;
+--------------+--------------+
| max(chinese) | min(chinese) |
+--------------+--------------+
|         88.0 |         55.5 |
+--------------+--------------+
1 row in set (0.00 sec)

3.2 GROUP BY子句

基于以下emp表:

mysql> select* from emp;
+------+------+--------+--------+
| id   | name | role   | salary |
+------+------+--------+--------+
|    1 | 张三 | 讲师   |  10000 |
|    2 | 李四 | 讲师   |  11000 |
|    3 | 王五 | 讲师   |  12000 |
|    4 | 赵六 | 学管师 |  10000 |
|    5 | 田七 | 学管师 |   9000 |
|    6 | 钱八 | 老板   | 100000 |
|    7 | 陈九 | 老板   | 120000 |
+------+------+--------+--------+
7 rows in set (0.00 sec)

求每个岗位的平均薪资,就要使用到分组查询:

mysql> select role, avg(salary) from emp group by role;
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 讲师   |  11000.0000 |
| 学管师 |   9500.0000 |
| 老板   | 110000.0000 |
+--------+-------------+
3 rows in set (0.00 sec)

注:(1)指定一个列,就会把列里的值相同的分到一个组中;

(2)select 指定的列要么是带有聚合函数的,要么就是得指定的group by的列,不能指定一个非聚合、非group by的列;

3.3 HAVING 

分组时可以指定条件筛选:

第一种:分组前筛选:使用where条件:

计算各个岗位(讲师除过张三外的)平均薪资:  

mysql> select role,avg(salary) from emp where name!="张三" group by role;
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 讲师   |  11500.0000 |
| 学管师 |   9500.0000 |
| 老板   | 110000.0000 |
+--------+-------------+
3 rows in set (0.00 sec)

第二种:分组后筛选:使用having条件:

计算除过老板的其余岗位的平均薪资:

mysql> select role,avg(salary) from emp group by role having role!="老板";
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 讲师   |  11000.0000 |
| 学管师 |   9500.0000 |
+--------+-------------+
2 rows in set (0.00 sec)

第三种:同时在分组前和分组后进行筛选:

计算除过老板岗位,不包括张三在内的所有岗位的平均薪资:文章来源地址https://www.toymoban.com/news/detail-599899.html

mysql> select role,avg(salary) from emp where name!="张三" group by role having role!="老板";
+--------+-------------+
| role   | avg(salary) |
+--------+-------------+
| 讲师   |  11500.0000 |
| 学管师 |   9500.0000 |
+--------+-------------+
2 rows in set (0.00 sec)

到了这里,关于【MySQL】_4.MySQL表的设计与聚合查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • {MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 承接上文,继续讲一下MySQL 提示:以下是本篇文章正文内容,下面案例可供参考 NOT NULL - 指示某列不能存储 NULL 值。 UNIQUE - 保证某列的每行必须有唯一的值

    2024年02月03日
    浏览(65)
  • 【MySQL】表的增删改查——MySQL基本查询、数据库表的创建、表的读取、表的更新、表的删除

         CURD是一个数据库技术中的缩写词,它代表Create(创建),Retrieve(读取),Update(更新),Delete(删除)操作。 这四个基本操作是数据库管理的基础,用于处理数据的基本原子操作。      在MySQL中,Create操作是十分重要的,它帮助用于创建数据库对象,如数据

    2024年03月18日
    浏览(69)
  • MySQL数据库增删改查及聚合查询SQL语句学习汇总

    目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table   查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的函数:now()  查询 查询表作列与列之间进

    2024年02月09日
    浏览(86)
  • mysql和sqlserver查询数据库表的数量的方法

    一、mysql查询数据库表的数量 1、查询mysql下所有数据库表的数量 2、查询指定数据库的表的数量   二、sqlserver查询数据库表的数量 1、查询指定数据库的表的数量(选择指定的sqlserver数据库后再执行语句) 2、xtype 的描述 (1)数据类型:char(2)。  (2)对象类型。常用列。

    2024年02月07日
    浏览(47)
  • ②【MySQL表操作】 数据库表的创建、查询、修改、删除

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 数据库表中的数据类型 : 数值类型: TINYINT :小整数 SMALLINT :大整数 MEDIUMINT :大整数,范围大于SMALLINT

    2024年02月06日
    浏览(63)
  • 【MySQL】_4.MySQL表的设计与聚合查询

    目录 1. 表的设计 2. 查询与新增的联合 3. 聚合查询 3.1 聚合查询函数 3.1.1  COUNT函数 3.1.2 SUM函数 3.1.3 AVG 函数  3.1.4 MIN函数 与 MAX函数 3.2 GROUP BY子句 3.3 HAVING  (一)、梳理清楚需求中的“实体”: (1)数据库中的实体类比面向对象的对象; (2)很多时候每个实体都需要对

    2024年02月16日
    浏览(30)
  • 【JaveWeb教程】(20) MySQL数据库开发之 基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询 详细代码示例讲解

    在上次学习的内容中,我们讲解了: 使用DDL语句来操作数据库以及表结构(数据库设计) 使用DML语句来完成数据库中数据的增、删、改操作(数据库操作) 我们今天还是继续学习数据库操作方面的内容:查询(DQL语句)。 查询操作我们分为两部分学习: DQL语句-单表操作

    2024年02月02日
    浏览(85)
  • Mysql 数据库DQL 数据查询语言 SELECT 基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询——包含DQL所有查询语句。吐血分享。

    DQL:数据查询语言; 用来对表内的数据进行查找 。Database Query Language SQL语句分为:基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询。  可以发现name字段就只剩下一个张三了;   条件: 条件查询—比较运算符 比较运算符 功能 大于 = 大于等于 小于 = 小于等

    2024年01月19日
    浏览(56)
  • 【JaveWeb教程】(18) MySQL数据库开发之 MySQL数据库设计-DDL 如何查询、创建、使用、删除数据库数据表 详细代码示例讲解

    下面我们就正式的进入到SQL语句的学习,在学习之前先给大家介绍一下我们要开发一个项目,整个开发流程是什么样的,以及在流程当中哪些环节会涉及到数据库。 2.1 项目开发流程 需求文档: 在我们开发一个项目或者项目当中的某个模块之前,会先会拿到产品经理给我们提

    2024年01月25日
    浏览(104)
  • MySQL数据库 - 表的操作

    目录 一、创建表 二、创建表案例 1、显示当前使用的数据库名 2、创建表  2.1 MyISAM存储引擎表 2.2 InnoDB存储引擎表 三、查看表结构  四、修改表 1、新增列   2、修改列类型 3、修改列名 4、修改表名  5、删除列   五、删除表 表的操作至少会涉及如下两类SQL语句: • DDL(

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包