【MySQL探索之旅】数据库设计以及聚合查询

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 1. 数据库设计
    • 1.1 数据库设计基本概念
    • 1.2 数据库设计的步骤
    • 1.3 表设计
      • 1.3.1 一对一
      • 1.3.2 一对多
      • 1.3.3 多对多
  • 2. 聚合查询
    • 2.1 聚合函数
    • 2.2 分组查询
    • 2.3 条件过滤

1. 数据库设计

1.1 数据库设计基本概念

  • 数据库设计就是根据业务的具体需求,结合我们所学的 DBMS ,为了这个业务构造最优的数据存储模型。
  • 建立数据库中的表结构以及表与表之间的关联关系的过程。

1.2 数据库设计的步骤

  1. 需求分析(数据是什么?数据具有哪些属性?数据和属性之间的特点是什么)

  2. 逻辑分析(通过 ER图对数据库进行逻辑建模)

    image-20240407085211974

  3. 物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)

  4. 维护设计(1. 对新的需求进行建表;2. 表优化)

1.3 表设计

1.3.1 一对一

例如:人 和 身份证 的关系

一个人只能对应一个身份证号

image-20240407085627653

1.3.2 一对多

例如: 班级 和 学生 的关系

一个班级多个学生

image-20240407085731860

1.3.3 多对多

例如:学生 和 课程 的关系

一个学生可以选择多个课程

一个课程可以被多个学生选择

image-20240407092458971

案例:

  1. 创建学生表:学生 id ,姓名

    create table student(id int primary key auto_increment,name varchar(20)
    );
    
  2. 创建课程表:课程表,课程名

    create table course(courseId int primary key auto_increment,courseName varchar(20)
    );
    
  3. 创建关联表:学生和课程之间的关系,需要包含学生id 和课程id 作为外键。

    create table student_course(student_id int, course_id int,primary key (student_id, course_id), foreign key (student_id) references student(id), foreign key (course_id) references course(courseId));
    

2. 聚合查询

2.1 聚合函数

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

函数说明
COUNT([DISTINCT] expr)返回查询的数据的数量
SUM([DISTINCT] expr)返回查询到的数据的总和,忽略非数值
AVG([DISTINCT] expr)返回查询到的数据的平均值,忽略非数值
MAX([DISTINCT] expr)返回查询到的数据的最大值,忽略非数值
MIN([DISTINCT] expr)返回查询到的数据的最小值,忽略非数值

案例:

  • count:计数

    -- 统计有多少位学生
    select count(*) from student;-- 统计学生表有多少个姓名,姓名为 NULL 不会计入结果
    select count(name) from student;
    

    image-20240407110627436

  • sum:总和

    -- 统计分数的总和
    select sum(score) from score;-- 统计分数小于70的总分,如果没有返回null
    select sum(score) from score where score<70;
    

    image-20240407111805677

  • avg:平均值

    -- 查询分数的平均值
    select avg(score) from score;-- 查询分数小于70的平均值,如果没有则返回 NULL
    

    image-20240407112027574

  • MAX:最大值

    -- 查询分数的最大值
    select max(score) from score;-- 查询60到90之间的最大值
    select max(score) from score where score>60 and score<90;-- 查询大于90的最大值,如果没有则返回 NULL
    select max(score) from score where score>90;
    

    image-20240407112339701

  • MIN:最小值

    -- 查询分数的最小值
    select min(score) from score;-- 查询分数在60到90之间的最小值
    select min(score) from score where score>60 and score<90;-- 查询分数在60以下的最小值,如果没有则返回 NULL
    select min(score) from score where score<60;
    

    image-20240407113012629

2.2 分组查询

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

select column1, sum(column2), .. from table group by column1,column3;

案例:

测试表:职工表 id,name(姓名),role(职位),salary(工资)

create table emp(id int, name varchar(20), role varchar(20), salary int);insert into emp values (1,'张三','Java开发',10000);
insert into emp values (2,'李四','Java开发',9000);
insert into emp values (3,'王五','Web开发',8000);
insert into emp values (4,'赵六','Web开发',9000);
insert into emp values (5,'王麻子','运维',8500);
insert into emp values (6,'玛晕','老板',100000);
  • 查询每个岗位的最高工资、最低工资和平均工资

    select role,max(salary),min(salary),avg(salary) from emp group by role;
    

    image-20240407131309574

2.3 条件过滤

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

  • 查询平均工资低于9000的职位和它的平均工资

    select role,max(salary),min(salary),avg(salary) from emp group by role having avg(salary)<9000;
    

    image-20240407131726751

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

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

相关文章

测试必备:网站崩溃原因大揭秘!12种常见问题一网打尽

网站崩溃是研发团队最怕看到的情况&#xff0c;但是由于种种原因却时常出现&#xff0c;作为测试人员&#xff0c;我们更应该比一般人了解网站崩溃的原因及排查方法&#xff0c;这是我们测试工作的重要一环。接下来我就谈谈12种常见的网站崩溃原因以及如何跟踪和解决它们。 你的…

Stable Diffusion——SDXL Turbo让 AI 出图速度提高10倍

摘要 在本研究中&#xff0c;我们提出了一种名为对抗扩散蒸馏&#xff08;ADD&#xff09;的创新训练技术&#xff0c;它能够在1至4步的采样过程中&#xff0c;高效地对大规模基础图像扩散模型进行处理&#xff0c;同时保持图像的高质量。该方法巧妙地结合了分数蒸馏技术&…

光谱共焦传感器:揭秘非接触测厚绝技

在工业测量和检测的世界里&#xff0c;准确性和效率始终是追求的焦点。想象一下&#xff0c;当您面对堆积如山的工件&#xff0c;需要测量它们的厚度&#xff0c;而传统方法不仅耗时费力&#xff0c;还可能因为接触式测量而损伤材料表面时&#xff0c;那种无奈与焦虑是否涌上心…

STM32-看门狗

1、看门狗是什么&#xff1a;就是一个向下定时器&#xff0c;定时时间一到&#xff0c;就会触发一个向下的复位的中断&#xff0c;使单片机开始工作 2、作用&#xff1a;MCU微控制器构成的微型计算机系统中&#xff0c;由于微控制器的工作常常会受到来自外界电磁场的干 扰,造成…

记一次渗透测试(2)

内网渗透 centos上线msf 这里因为是linux的原因&#xff0c;就不使用cs上线的打法了&#xff0c;先生成一个linux的payload上线到msf use exploit/multi/script/web_delivery set lhost 192.168.1.10 set lport 4444 set target 7 run 运行之后会给出一个payload use expl…

【面试题】如何在亿级别用户中检查用户名是否存在?

前言 不知道大家有没有留意过&#xff0c;在使用一些app或者网站注册的时候&#xff0c;提示你用户名已经被占用了&#xff0c;比如我们熟知的《英雄联盟》有些人不知道取啥名字&#xff0c;干脆就叫“不知道取啥名”。 但是有这样困惑的可不止他一个&#xff0c;于是就出现了“…

TypeScript系列之-理解TypeScript类型系统画图讲解

TypeScript的输入输出 如果我们把 Typescript 编译器看成一个黑盒的话。其输入则是使用 TypeScript 语法书写的文本或者文本集合。 输出是编译之后的 JS 文件 和 .d.ts 的声明文件 其中 JS 是将来需要运行的文件(里面是没有ts语法&#xff0c;有一个类型擦除的操作)&#xff0…

openGauss学习笔记-258 openGauss性能调优-使用Plan Hint进行调优-指定子查询不展开的Hint

文章目录 openGauss学习笔记-258 openGauss性能调优-使用Plan Hint进行调优-指定子查询不展开的Hint258.1 功能描述258.2 语法格式258.3 示例 openGauss学习笔记-258 openGauss性能调优-使用Plan Hint进行调优-指定子查询不展开的Hint 258.1 功能描述 数据库在对查询进行逻辑…

使用Code开发Django_模版和CSS

转到定义 和 查看定义 在使用Django或任何其他库的过程中&#xff0c;我们可能需要检查这些库中的代码。VS Code提供了两个方便的命令&#xff0c;可以直接导航到任何代码中的类和其他对象的定义&#xff1a; 转到定义 在Python开发环境中&#xff0c;我们可以轻松地对函数、类…

【LeetCode热题100】32. 最长有效括号(动态规划)

一.题目要求 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 二.题目难度 困难 三.输入样例 示例 1&#xff1a; 输入&#xff1a;s “(()” 输出&#xff1a;2 解释&#xff1a;最长有效括号子…

物联网行业趋势——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断进步和应用场景的日益扩大&#xff0c;物联网行业呈现出迅猛发展的势头。作为当今世界最具前瞻性和战略意义的领域之一&#xff0c;物联网行业的趋势和未来发展值得深入探讨。 ​一、物联网行业正逐渐实现全面普及。随着物…

泡泡写作怎么用 #经验分享#微信

泡泡写作是一款非常好用的论文写作工具&#xff0c;它可以帮助用户检测论文的相似度并进行降重&#xff0c;减少抄袭和重复引用的问题&#xff0c;是学生和研究人员们写作过程中的得力助手。 使用泡泡写作非常简便方便。用户只需要将待检测的论文文本复制粘贴到工具中&#xff…