当前位置: 首页 > news >正文

MySQL篇02-三大范式,多表查询

数据入库时,由于数据设计不合理,会存在数据重复、更新插入异常等情况, 故数据库中表的设计遵循的设计规范:三大范式

1.第一范式(1NF)

要求数据库的每一列都是不可分割的原子数据项,即原子性。强调的是列的原子性,即数据库中每一列的字段都是单一属性,不可再分的。且这个单一属性必须是由基本数据类型所构成,如整数、字符串等.

例:  users表

uid

username

password

tel

address

u001

tmm

111111

15891xxxxxx

陕西省汉中市汉台区xxx

上面表中address字段,可以按照省、市、区进行分割,因此不满足第一范式。

解决办法:将一个字段分割成多个字段                            

uid

username

password

tel

province

city

area

address

u001

tmm

111111

15891xxxxxx

陕西省

汉中市

汉台区

xxxx

2.第二范式(2NF)

在满足第一范式的前提下,非码属性必须完全依赖于候选码,每张表只描述一件事情。一张表必须有一个主键;非主键类必须完全依赖于主键。

例:   users表

uid

username

password

tel

role

u001

tmm1

111111

15891xxxxxx

管理员

上面表中uid可以作为users表的主键,username,password,tel都依赖于uid,但是 role字段不依赖于uid.

解决办法:将一张表拆分成多张表 ( 将管理关系放在多方上边, 一个角色有多名用户, 故用户的外键为rid)

用户表users

uid

username

password

tel

r_id

u001

tmm1

111111

15891xxxxxx

r1001

u002

tmm2

111111

15891xxxxxx

r1002

角色表roles

rid

username

r001

管理员

r002

普通用户

3.第三范式(3NF)

在第二范式前提下,任何非主属性不依赖于其他非主属性(在2NF基础上,消除传递依赖),非主键列必须直接依赖于主键,不能存在传递依赖。即确保数据表中的每一列数据都和主键直接相关,而不能间接相关.

例: 选课表sc

scid

sname

cname

tname

credit

score

001

tmm1

js

a老师

4

90

002

tmm2

css

b老师

3

95

由于sname,cname,tname,credit,score都不依赖于scid,因此,要进行表的拆分

选课表sc

scid

sid

cid

tname

score

001

s01

c001

t01

90

002

s02

c002

t02

95

学生表 students

sid

sname

s01

tmm1

s02

tmm2

课程表 class

cid

cname

credit

c001

js

4

c002

css

3

老师表 teachers

tid

tname

t01

a老师

t02

b老师

多对多的解决办法: 创建一张新表:teacher_class

tcid

cid (课程编号)

tid (老师id)

tc001

c001

t01

tc002

c002

t02

各表关系如图所示: 

注意:在数据库使用可视化工具建表时, 有时不添加外键, 避免数据处理时, 别处占用无法进行处理

4.多表查询

-- 单表查询
-- 查询所有书籍的作者信息
SELECT * FROM `books_author`;
-- 查询所有书籍的标题
SELECT title FROM books;
-- 给表起别名, b为别名, 作用:使用别名.的方式查找字段时更方便,不易出错
SELECT b.`content` FROM books b;
-- 给列(字段)起别名*/`books`
SELECT b.`imgUrl` AS `iu` FROM books b;
-- 1. 每本书涨价10%,保留两位小数, 涨价完成后更新到数据库中   价格不为空时, is not null,不能使用<>不等于
UPDATE books  SET price = ROUND(price*(1.1),2) WHERE price IS NOT NULL;
-- 2. 查询书所对应的评论 
-- 多表查询
SELECT b.bookname,c.comcontent  FROM books_comment c,books b  WHERE b.bid = c._bid;
-- 使用左外连接,主表内容会完全显示,包括NULL的情况  默认左的内容显示的多
SELECT b.`bid`,b.bookname,c.comcontent FROM books b LEFT JOIN books_comment c ON b.`bid` = c.`_bid`;
-- 使用内连接, 当内容为NULL时, 不显示
SELECT b.`bid`,b.bookname,c.comcontent FROM books b INNER JOIN books_comment c ON b.`bid` = c.`_bid`;
-- 3. 统计评分大于等于4.5的书的评论数,并显示书名   分组聚合   统计评分大于等于4.5的书, 统计评论数
-- 多表查询
SELECT b.bookname,c.`comcontent`, COUNT(c.`comcontent`) AS comnums
FROM books_comment c, books b
WHERE c._bid = b.bid  AND c.score >= 4.5
GROUP BY b.bookname ;
-- 子查询  显示书名
SELECT b.bookname FROM books b
WHERE b.`bid` IN (SELECT c.`_bid` FROM books_comment c WHERE c.`score` >= 4.5GROUP BY c.`_bid` = b.`bid`
)
-- 4. limit 起始索引,查询条数
/* 显示第三页的数据,每页10条,   当前页curPage=3, 每页条数pageSize=10select * from books limit (curPage-1)*pageSize,10   */
SELECT * FROM books LIMIT 10,10;
-- 显示书籍评论信息  (books)书id,书名  (books_author) 作者  (books_comment)评论发布时间,评论内容  (users)评论者
-- (1)显示评论者信息    (books_comment, users表)
SELECT c.`_bid`,c.`comcontent`,c.`comtime`,u.`nickname` FROM books_comment c, users u
WHERE c.`_uid` = u.`uid`;
-- (2)显示作者信息 (books,books_author,books_books_category表)
SELECT b.`bid`,b.`bookname`,a.`aname` FROM books b, books_author a, books_books_author ba
WHERE ba.`ba_bid`= b.`bid` AND ba.`ba_aid`= a.`aid`
-- (3)结果综合
SELECT *
FROM (SELECT b.`bid`,b.`bookname`,a.`aname` FROM books b, books_author a, books_books_author ba WHERE ba.`ba_bid`= b.`bid` AND ba.`ba_aid`= a.`aid`) t1 LEFT JOIN(SELECT c.`_bid`,c.`comcontent`,c.`comtime`,u.`nickname` FROM books_comment c, users u WHERE c.`_uid` = u.`uid` ) t2ON t1.bid = t2._bid-- GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
-- CONCAT_WS('分隔符', 要合并的字段)   合并列
SELECT t1.bid,t1.bookname,t1.aname,t2.`comtime`,t2.`nickname`,
-- group_concat(concat_Ws(',',t1.bookname,t2.`comcontent`,t2.`comtime`,t2.`nickname`) separator ';')
GROUP_CONCAT(t2.`comcontent` SEPARATOR '=====')
FROM  (SELECT b.`bid`,b.`bookname`,a.`aname` FROM books b, books_author a, books_books_author ba WHERE ba.`ba_bid`= b.`bid` AND ba.`ba_aid`= a.`aid`) t1 
LEFT JOIN(SELECT c.`_bid`,c.`comcontent`,c.`comtime`,u.`nickname` FROM books_comment c, users u WHERE c.`_uid` = u.`uid` ) t2
ON t1.bid = t2._bid 
GROUP BY t1.bid,t1.bookname,t1.aname;

相关文章:

MySQL篇02-三大范式,多表查询

数据入库时,由于数据设计不合理&#xff0c;会存在数据重复、更新插入异常等情况, 故数据库中表的设计遵循的设计规范&#xff1a;三大范式1.第一范式(1NF)要求数据库的每一列都是不可分割的原子数据项&#xff0c;即原子性。强调的是列的原子性&#xff0c;即数据库中每一列的…...

vue-cli3创建Vue项目

文章目录前言一、使用vue-cli3创建项目1.检查当前vue的版本2.下载并安装Vue-cli33.使用命令行创建项目二、关于配置前言 本文讲解了如何使用vue-cli3创建属于自己的Vue项目&#xff0c;如果本文对你有所帮助请三连支持博主&#xff0c;你的支持是我更新的动力。 下面案例可供…...

Linux perf probe 的使用(三)

文章目录前言一、Dynamic Tracing二、kprobes2.1 perf kprobe 的使用2.2 kprobe Arguments3.3 tcp_sendmsg()3.3.1 Kernel: tcp_sendmsg()3.3.2 Kernel: tcp_sendmsg() with size3.3.2 Kernel: tcp_sendmsg() line number and local variable三、uprobes的使用3.1 perf uprobe …...

python GUI编程 多窗口跳转

# 多窗口跳转例子from tkinter import *def main(): # 主窗体def goto(num):root.destroy() # 关闭主窗体if num 1:one() # 进入第1个窗体elif num 2:two() # 进入第2个窗体root Tk()root.geometry(300x150600200)root.title(登录窗口)but1 Button(root, text"进入…...

nuxt 学习笔记

这里写目录标题路由跳转NuxtLinkquery参数params参数嵌套路由tab切换效果layouts 文件夹强制约定放置所有布局文件&#xff0c;并以插槽的形式作用在页面中1.在app.vue里面2.component 组件使用Vue < component :is"">Vuex生命周期数据请求useFetchuseAsyncDat…...

Python编程自动化办公案例(1)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.使用库讲解 1.xlrd 2.xlwt 二.主要案例 1.批量合并 模板如下&#xf…...

一站式 Elasticsearch 集群指标监控与运维管控平台

上篇文章写了一下消息运维管理平台&#xff0c;今天带来的是ES的监控和运维平台。目前初创企业&#xff0c;不像大型互联网公司&#xff0c;可以重复的造轮子。前期还是快速迭代试错阶段&#xff0c;方便拿到市场反馈&#xff0c;及时调整自己的战略和产品方向。让自己活下去&a…...

C# 调用Python

一、简介 IronPython 是一种在 NET 和 Mono 上实现的 Python 语言&#xff0c;由 Jim Hugunin&#xff08;同时也是 Jython 创造者&#xff09;所创造。 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python是…...

51单片机最强模块化封装(3)

文章目录 前言一、创建smg文件,添加smg文件路径二、smg文件编写三、模块化测试总结前言 本篇文章将带大家继续封装我们的代码。 这里我们会封装数码管的操作函数。 一、创建smg文件,添加smg文件路径 这里的操作就不过多解释了,大家自行看前面的文章即可。 51单片机模块化…...

【CSS 布局】水平垂直居中

CSS 布局-水平垂直居中 一、水平居中 创建一个父盒子&#xff0c;和子盒子 <div class"parent"><div class"child"></div> </div>基本样式如下 .parent {background-color: #fff; }.child {background-color: #999;width: 100p…...

【C++】类和对象--类的6个默认成员函数

目录1.类的6个默认成员函数2.构造函数2.1概念2.2特性3.析构函数3.1概念3.2特性4.拷贝构造函数4.1概念4.2特征5.赋值运算符重载5.1运算符重载5.2赋值运算符重载5.3前置和后置重载5.4流插入和流提取运算符重载6.const成员7.取地址重载和const取地址操作符重载1.类的6个默认成员函…...

常见面试题---------如何处理MQ消息丢失的问题?

如何处理MQ消息丢失的问题? RabbitMQ丢失消息分为如下几种情况&#xff1a; 生产者丢消息&#xff1a; 生产者将数据发送到RabbitMQ的时候&#xff0c;可能在传输过程中因为网络等问题而将数据弄丢了。 RabbitMQ自己丢消息&#xff1a; 如果没有开启RabbitMQ的持久化&#x…...

十四、Linux网络:高级IO

目录 五种IO模型 同步IO 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 异步IO...

带你走进API安全的知识海洋

Part1什么是API API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c;或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访…...

【Java】TCP的三次握手和四次挥手

三次握手 TCP三次握手是一个经典的面试题&#xff0c;它指的是TCP在传递数据之前需要进行三次交互才能正式建立连接&#xff0c;并进行数据传递。&#xff08;客户端主动发起的&#xff09;TCP之所以需要三次握手是因为TCP双方都是全双工的。 什么是全双工&#xff1f; TCP任何…...

JUC并发编程

1.什么是JUC java.util工具包、包、分类 业务&#xff1a;普通业务线程代码 Thread Runable: 没有返回值、效率相比Callable相对较低。 2.线程和进程 进程&#xff1a;一个程序&#xff0c;QQ.exe Music.exe 程序的集合 一个进程往往可以包含多个线程&#xff0c;至少包含一个…...

概率统计·假设检验【正态总体均值的假设检验、正态总体方差的假设检验】

均值假设检验定义 2类错误 第1类错误&#xff08;弃真&#xff09;&#xff1a;当原假设H0为真&#xff0c;观察值却落入拒绝域&#xff0c;因而拒 绝H0这类错误是“以真为假” 犯第一类错误的概率显著性水平α第2类错误&#xff08;取伪&#xff09;&#xff1a;当原假设H0不…...

如何预测机组设备健康状态?你可能需要这套解决方案

1. 应用场景随机振动[注1]会发生在工业物联网的各个场景中&#xff0c;包括产线机组设备的运行、运输设备的移动、试验仪器的运行等等。通过分析采集到的振动信号可以预估设备的疲劳年限、及时知晓设备已发生的异常以及预测未来仪器可能发生的异常等等。本篇教程会提供给有该方…...

C++类和对象:面向对象编程的核心。| 面向对象还编什么程啊,活该你是单身狗。

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 文章目录一、前言二、面向对象编程三、类和对象1、类的引入2、类的定义Ⅰ、声明和定义在一起Ⅱ、声明和定义分开Ⅲ、成员变量命…...

CUDA虚拟内存管理

CUDA中的虚拟内存管理 文章目录CUDA中的虚拟内存管理1. Introduction2. Query for support3. Allocating Physical Memory3.1. Shareable Memory Allocations3.2. Memory Type3.2.1. Compressible Memory4. Reserving a Virtual Address Range5. Virtual Aliasing Support6. Ma…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…...

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...