MYSQL四

-- ########## 01、ER关系 ##########-- ER关系(逻辑描述)
-- A:E---Entity简写,实体,具有相同属性(特征)的对象归为同一实体
--        Attribute属性,描述实体具有的特征,一个实体可以有若干个属性来描述
-- B:R---Relationship简写,关系/联系,数据对象彼此之间的互相关联的关系-- ER关系常见的三种形式:
-- 1、一对一关系(1:1):例如:夫妻关系、一个国家只有一个最高领导人、向日葵...
-- 2、一对多关系(1:n):例如:一把锁有多把钥匙、一个房子有多个门、一个皇帝有多个太监、一个部门有多个员工...
-- 3、多对多关系(m:n):例如:参加招聘会的企业和同学、学生选课、饭桌上的菜和吃菜的人...-- ########## 02、数据库设计 ##########
-- 设计的过程不是一步到位的,也不可能一步到位,都是一个反复迭代的过程-- 需求:商城里会员顾客购买若干数量的商品
-- 提供的数据如下:
-- 顾客编号为1的顾客张三购买了3个商品编号为123的A商品
-- 顾客编号为2的顾客李四购买了4个商品编号为456的B商品
-- 顾客编号为1的顾客张三购买了3个商品编号为123的A商品(数据来自不同渠道)
-- 顾客编号为3的顾客王五购买了5个商品编号为123的A商品
-- 顾客编号为1的顾客张三购买了2个商品编号为456的B商品
-- .....-- 分析:这可能就是业务提供方描述的一个场景,数据库设计时,会从中挖掘出很多信息
-- 数据整理:去除无效的数据,比如:去除重复的数据(可能来自不同的渠道,但是其实描述的是相同的数据内容)-- 广大开发人员在长期的数据库设计过程中归纳整理了几个称为【范式】的东西
-- 【第1范式(1NF)】为了保证表中的行的数据是唯一的,属性是原子的。
-- 也就是说,行的唯一性通过在表中定义一个唯一的主键来实现
-- 注意:这里说的唯一的主键,没有说主键只能建立在一个字段上CREATE TABLE order_1nf
(orderid INT,productid INT,quantity INT,customerid INT,customername VARCHAR(10) NOT NULL,productname VARCHAR(20) NOT NULL,PRIMARY KEY(orderid, productid)
);
DESC order_1nf;-- 【第2范式(2NF)】首先数据必须满足第1范式,其次要求非键属性(Nonkey Attribute)和候选键之间必须满足一定的条件。
-- 也就是说,一个非键属性不能只完全函数依赖于候选键的一部分。
-- 分析:order_1nf表中,customerid这个非键属性只依赖于主键(候选键)(orderid, productid)的一部分orderid,所以,需要把order_1nf表进行分解
CREATE TABLE order_2nf
(orderid INT,customerid INT,customername VARCHAR(10) NOT NULL,PRIMARY KEY(orderid)
);
CREATE TABLE orderdetail_2nf
(orderid INT,productid INT,quantity INT,PRIMARY KEY(orderid)
);
CREATE TABLE product_2nf
(productid INT,productname VARCHAR(20) NOT NULL,PRIMARY KEY(productid)
);-- 【第3范式(3NF)】首先数据必须满足第2范式,其次要求所有的非键属性必须非传递依赖于候选键。
-- 也就是说,一个非键属性不能依赖于其他的非键属性。
-- 分析:order_2nf表中,customername依赖于customerid这个非键属性,所以,需要把order_2nf表进行分解
CREATE TABLE order_3nf
(orderid INT,customerid INT,PRIMARY KEY(orderid)
);
CREATE TABLE customer_3nf
(customerid INT,customername VARCHAR(10) NOT NULL,PRIMARY KEY(customerid)
);
CREATE TABLE orderdetail_3nf
(orderid INT,productid INT,quantity INT,PRIMARY KEY(orderid)
);
CREATE TABLE product_3nf
(productid INT,productname VARCHAR(20) NOT NULL,PRIMARY KEY(productid)
);-- 注意:实际开发中,一般必须达到第2范式及以上,不过有时处于操作数据效率的考虑,设计时也会使用第2范式的设计(即包含了一些冗余)-- 需求:设计 学生选课的数据库设计
--         学生可以选择多门课程,一门课程可以有多个学生,一个老师可以带多门课程,一门课程只能由一个老师来带,每个学生选的课程有一个相应的课程成绩
-- 分析:
-- 实体:学生、课程、老师、成绩(这四个名词拿出来作为候选实体)
-- 实体间的关系:"一个老师可以带多门课程,一门课程只能由一个老师来带"这句话描述了课程 和 老师 之间的关系是多对一的关系
--                 "学生可以选择多门课程,一门课程可以有多个学生"这句话描述了 学生 和 课程之间的关系是多对多的关系
--                 "每个学生选的课程有一个相应的课程成绩"这句话读起来 成绩 像是 课程的一个属性,并且是一个学生的一门课程的一个成绩,
--                         结合上述应该要先解决多对多的关系,再看这个成绩怎么设计-- 首先设计较为独立的实体
-- 老师信息实体
CREATE TABLE teacherinfo
(-- 老师编号teacherid INT AUTO_INCREMENT PRIMARY KEY,-- 老师姓名teachername VARCHAR(10) NOT NULL,-- 老师性别teachergender ENUM('男', '女') NOT NULL,-- 老师年龄teacherage INT NOT NULL
);
-- 学生信息实体
CREATE TABLE studentinfo
(-- 学生编号studentid INT AUTO_INCREMENT PRIMARY KEY,-- 学生姓名studentname VARCHAR(10) NOT NULL,-- 学生性别studentgender ENUM('男', '女') NOT NULL,-- 学生年龄studentage INT NOT NULL
);-- 接着设计一对多的关系,可以在作为多的实体中添加作为一的实体的主键作为非键属性的值
-- 也可以在作为一的实体中添加作为多的实体的主键作为非键属性的值
-- 显然,前者操作起来比较简单,也是一对多关系的经典设计方式-- 课程信息实体
CREATE TABLE courseinfo
(-- 课程编号courseid INT AUTO_INCREMENT PRIMARY KEY,-- 课程名称coursename VARCHAR(10) NOT NULL,-- 老师编号teacherid INT NOT NULL
);-- 最后考虑多对多的关系,首先考虑套用一下一对多的关系的设计,在courseinfo表中放入studentinfo表的主键,在studentinfo表中放入courseinfo表的主键
-- 这样的设计有一个问题,作为学生信息,并不确定有多少课程被选,即无法确定多个课程主键的数量,当然写在一个字段中也可以,但是操作又很麻烦
--                     同样,作为课程信息,也不确定有多少学生选择
-- 既然考虑这两个实体中都要放入对方的主键作为属性使用,这里不妨制作一个独立的关系实体,包含有着两个实体的主键作为属性,即可轻松实现多对多的关系
-- 而且,这个独立的关系实体还可以包含有和多对多关系相关的其他属性,比如:成绩-- 成绩信息实体(学生 和 课程 多对多 关联关系表)
CREATE TABLE scoreinfo
(-- 成绩编号scoreid INT AUTO_INCREMENT PRIMARY KEY,-- 学生编号studentid INT NOT NULL,-- 课程编号courseid INT NOT NULL,-- 成绩分数score DECIMAL(4, 1) NOT NULL
);-- ########## 03、汇总数据(进阶) ##########-- 模拟数据
INSERT INTO scoreinfo VALUES(NULL, 1, 1, 60), (NULL, 1, 2, 90), (NULL, 1, 3, 80), (NULL, 1, 4, 70), (NULL, 1, 5, 40),
(NULL, 2, 1, 70), (NULL, 2, 2, 50), (NULL, 2, 3, 70), (NULL, 2, 4, 30), (NULL, 2, 5, 90),
(NULL, 3, 1, 55), (NULL, 3, 2, 65), (NULL, 3, 3, 75),
(NULL, 4, 1, 87), (NULL, 4, 2, 63), (NULL, 4, 4, 28);SELECT * FROM scoreinfo;-- 需求:获取每个同学的成绩总分和成绩平均分
-- 思路:因为每个同学可能有多门课程的成绩,所以这里需要基于学生编号进行分组,并使用聚合函数
SELECT studentid AS 学生编号, SUM(score) AS 成绩总分, AVG(score) AS 成绩平均分
FROM scoreinfo GROUP BY studentid;-- 需求:列出每门功课的最高分、最低分,该门功课的总分、该门功课的平均分
-- 思路:因为每门功课可能对应多个学生的成绩,所以这里需要基于课程编号进行分组,并使用聚合函数
SELECT courseid AS 课程编号, MAX(score) AS 最高分, MIN(score) AS 最低分, SUM(score) AS 总分, AVG(score) AS 平均分
FROM scoreinfo GROUP BY courseid;-- 需求:列出平均分高于65分的同学的学生编号及其平均分
-- 思路:首先想到的是使用分组子句(GROUP BY) 和 筛选条件子句(WHERE)-- 1、语义错误:先对scoreinfo这个集合进行了条件筛选,把65分以上的成绩都留下来了,再按学生编号进行分组
SELECT studentid AS 学生编号, AVG(score) AS 平均分
FROM scoreinfo WHERE score > 65 GROUP BY studentid;-- 2、语法错误:参照顺序图,因为WHERE子句先于GROUP BY子句执行,所以在WHERE子句中无法提前使用聚合函数
-- 错误代码: 1111 Invalid use of group function
SELECT studentid AS 学生编号, AVG(score) AS 平均分
FROM scoreinfo WHERE AVG(score) > 65 GROUP BY studentid;-- 正确写法:引入 HAVING 子句,对于分组后的数据进行条件筛选
SELECT studentid AS 学生编号, AVG(score) AS 平均分 
FROM scoreinfo
GROUP BY studentid
HAVING AVG(score) > 65;-- 注意:
-- 1、WHERE子句关注的是行的记录的条件筛选
-- 2、HAVING子句关注的是组的记录的条件筛选SELECT * FROM scoreinfo HAVING score > 70;
-- 上句可以理解为:
SELECT * FROM scoreinfo GROUP BY scoreid HAVING score > 70;
-- 下面两句可以理解为:因为按照scoreid这个主键进行分组,每组就是一条记录,对这一条记录使用聚合函数还是它自身
SELECT * FROM scoreinfo GROUP BY scoreid HAVING AVG(score) > 70;
SELECT * FROM scoreinfo GROUP BY scoreid HAVING SUM(score) > 70;
-- 也就等价于
SELECT * FROM scoreinfo WHERE score > 70;-- 需求:列出单科课程(课程编号)对应的所有同学(多行显示同学编号)
-- 如下写法不正确,因为这样分组后select获取的是每一组的第一条记录
-- 思考:为什么到处使用分组?
SELECT courseid AS 课程编号, studentid AS 学生编号
FROM scoreinfo
GROUP BY courseid;-- 正确写法
SELECT courseid AS 课程编号, studentid AS 学生编号
FROM scoreinfo
ORDER BY courseid;
-- 或者
SELECT courseid AS 课程编号, studentid AS 学生编号
FROM scoreinfo
ORDER BY courseid, studentid;-- 需求:列出单科课程(课程编号)对应的所有同学(单行显示同学编号,多个编号之间以逗号连接)
-- 思路:首先考虑分组,分组后select时使用字符函数CONCAT,但是这样拼接的是每一组的第一条记录中studentid
SELECT courseid AS 课程编号, CONCAT(studentid, ',') AS 学生编号
FROM scoreinfo
GROUP BY courseid;-- 到MySQL手册中找灵感,查找了一下和GROUP BY子句相关的内容,看到GROUP_CONCAT(expr) :该函数返回带有来自一个组的连接的非NULL值的字符串结果。
SELECT courseid AS 课程编号, GROUP_CONCAT(studentid) AS 学生编号
FROM scoreinfo
GROUP BY courseid;-- 需求:列出单科课程(课程编号)对应的学生人数
SELECT courseid AS 课程编号, COUNT(studentid) AS 选择该门课程的学生人数
FROM scoreinfo
GROUP BY courseid;-- 需求:列出单科课程(课程编号)对应的学生人数,并进行总计
-- 思路:总计操作使用 WITH ROLLUP 子句
SELECT courseid AS 课程编号, COUNT(studentid) AS 选择该门课程的学生人数
FROM scoreinfo
GROUP BY courseid
WITH ROLLUP;-- 需求:列出单科课程(课程编号)对应的所有学生(单行显示学生编号),并进行总人数的统计(单行显示学生编号)
SELECT courseid AS 课程编号, GROUP_CONCAT(studentid) AS 选择该门课程的学生编号
FROM scoreinfo
GROUP BY courseid
WITH ROLLUP;

 

转载于:https://www.cnblogs.com/java-le/p/6443404.html

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

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

相关文章

AI研究过于集中狭隘,我们是不是该反思了?

来源:AI科技大本营译者 | 陆离编辑 | 夕颜【导读】2019年是AI领域更加冷静的一年,少了些喧嚣和泡沫,大浪淘沙留下的是经过检验的真正的AI研究者、实践者。但是你也许没有发现,本来被寄予厚望要解决一切“疑难杂症”的AI&#xff0…

svchost占用内存过高_是什么导致你的Java服务器内存和CPU占用过高呢

一、内存占用过高1、造成服务器内存占用过高只有两种情况:内存溢出或内存泄漏(1)内存溢出:程序分配的内存超出物理内存的大小,导致无法继续分配物理内存,出现OOM报错。(2)内存泄漏:不再调用的对象一直占用着内存不释放…

php取不到post数据库,安卓post 数据到php 在写入数据库老是不成功, 数据post不到php...

代码如下安卓端public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);new Thread(){Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);new Thread(){Overridepublic void run(){ArrayList para…

Even Three is Odd

题意&#xff1a; 问题是对于所有的长度为n&#xff0c;且$1<ai<n$的整数序列求 $\prod_{i1}^{n-2}{max \{w_i,w_{i1},w_{i2}}\}$ 之和。 解法&#xff1a; 首先设dp状态为 $f(i,j,k)$ &#xff0c;长度为$i3$的&#xff0c;最大值为k&#xff0c;且最大值出现的位置集合…

中国图书评论协会2019年度“中国好书”

来源&#xff1a;腾讯网2019.12.16第1127次推送为读者发现好书&#xff0c;为好书寻找读者。“中国好书”月榜由我国权威的图书评测机构中国图书评论学会发布&#xff0c;志达书店经整理编辑&#xff0c;为您呈现“中国好书”2019年度榜单&#xff08;1-10月&#xff09;。寒假…

pythonfor循环列表排序_Python使用for循环对列表内元素进行排序方法

这篇文章介绍Python使用for循环对列表内元素进行排序方法list [13, 22, 6, 99, 11]for m in range(len(list)-1):for n in range(m1, len(list)):if list[m]> list[n]:temp list[n]list[n] list[m]list[m] tempprint list结果&#xff1a;[6, 11, 13, 22, 99]分析&#…

a标签居中 img vue,让html img图片垂直居中的三种方法

三种让img元素图片在盒子内垂直居中的方式教程&#xff0c;依据代码与文章教程熟习掌握并加以应用。一、使用flex完成垂直居中操纵css flex实现垂直居中。flex或许不是完成垂直居中最好的选择&#xff0c;由于IE8,9其实不赞成它。那时&#xff0c;为了用flex实现垂直居中&#…

python——面向对象相关

其他相关 一、isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 123456class Foo(object):passobj Foo()isinstance(obj, Foo)二、issubclass(sub, super) 检查sub类是否是 super 类的派生类 1234567class Foo(object):passclass Bar(Foo):passissubclass(Bar, Foo)三、异…

德国工业4.0眼里“工业互联网”与“智能制造”

来源&#xff1a;智造智库工业4.0在德国被认为是第四次工业革命&#xff0c;主要是指&#xff0c;在“智能工厂”利用“智能备”将“智能物料”生产成为“智能产品”&#xff0c;整个过程贯穿以“网络协同”&#xff0c;从而提升生产效率&#xff0c;缩短生产周期&#xff0c;降…

python常用模块教程_盘点Python常用的模块和包

模块1.定义计算机在开发过程中&#xff0c;代码越写越多&#xff0c;也就越难以维护&#xff0c;所以为了编写可维护的代码&#xff0c;我们会把函数进行分组&#xff0c;放在不同的文件里。在python里&#xff0c;一个.py文件就是一个模块。2.优点&#xff1a;提高代码的可维护…

php 正则匹配静态资源,Struts2 配置静态资源文件不经过Strut处理(正则匹配)

Struts2框架有两个核心配置文件&#xff1a;struts.xml和Struts2默认属性文件default.properties(在struts2-core-2.3.20.jar中)default.properties可以通过自己在classpath下写一个struts.properties文件进行定制改写为什么是struts.properties&#xff0c;这可以看org.apache…

全球数字孪生市场大预测:2025 年的 358 亿美元,年复合增长率(CAGR)高达 37.8%...

来源&#xff1a;云头条 数字孪生市场估计将从2019年的38亿美元猛增到2025年的358亿美元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;高达37.8%。推动数字孪生需求增长的几个因素包括&#xff1a;越来越广泛地采用物联网和云计算之类的技术用于实施数字孪生&#xff…

matlab 小波中心频率,小波频域特性Matlab实现.pdf

小波频域特性Matlab实现小波频域特性– Matlab实现东北大学信号与信息处理研究所栾峰 副教授/luanfeng/luanfeng编程示例例下面给出了一个信号的连续小波变换的例子。这个信号的第一个时间段包含了一个低频成分&#xff0c;最后一个时间段包含了高频成分&#xff0c;中间的时间…

yii3正式版什么时候发布_事业单位联考结束,成绩什么时候发布?合格分数线怎么算?...

今天上午&#xff0c;2020下半年全国事业单位联考笔试结束了。笔试刚刚结束&#xff0c;很多考生问图图有没有此次联考的答案&#xff0c;那肯定得有啊。为了帮助各位考生更好估分&#xff0c;华图教育推出估分系统&#xff0c;各位考生只需点击文末“了解更多”即可参与估分。…

Open Live Writer测试

************************我是可爱的分界线***************************转载于:https://www.cnblogs.com/elijahxb/p/6473105.html

德勤全球智慧城市2.0报告!中国占了世界一半

来源&#xff1a;德勤全球智慧城市新发展全球城市化的进程依然以不可阻挡的趋势向前推进&#xff0c; 到2050年&#xff0c; 接近70%的世界人口将生活在城市。人口大国中国和印度所在的亚洲将成为全球城市化最快的地区。在城市急速扩张的过程中&#xff0c; 先进的技术将帮助城…

python神经网络作用_Python · 神经网络(三*)· 网络

(这里是最终成品的 GitHub 地址)(这里是本章用到的 GitHub 地址)推荐先修章节&#xff1a;Python 神经网络(二*) 层Python 神经网络(三) 网络由于分形这个东西是在 tensorflow 的基础上实现的且相当麻烦、所以我就没在我自己的结构里面实现分形。因此&#xff0c;我自己实现的…

大公司里怎样开发和部署前端代码

作者&#xff1a;张云龙链接&#xff1a;https://www.zhihu.com/question/20790576/answer/32602154来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。没人邀请&#xff0c;看到这个问题不错&#xff0c;路过怒答。&#x…

5G产业发展最新进展深度解析(144页PPT)

来源&#xff1a;吴东升本报告对不同区域&#xff08;全球、美国、中国、日本、欧洲等&#xff09;的5G产业发展做了深入、全面的分析&#xff1b;对5G产业链和生态链以及主要产业应用状况做了系统盘点分析&#xff1b;对5G技术进展、投资环境和投资机会等也做了详细梳理。是5G…

php layui table,Layui table组件相关介绍

出现的问题&#xff1a;1、使用 Layui 官方提供的 【转换静态表格】 方式初始化加载时报 id 找不到的错误(自己的锅)2、传递参数问题使用的 table 加载刷新方案有一个页面&#xff0c;左侧是一个 tree&#xff0c;右侧是一个 table&#xff0c;默认 table 加载全数据&#xff0…