mysql学习之路_高级数据操作

关系

将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多。

所有关系都是表与表之间的关系。

一对一:

一张表的一条记录一定只对应另外一张表的一条记录,反之亦然。


Id


姓名


性别


年龄


电话号码


1


张三



23


13320848263

一对多

一张表中有一条记录,对应另一张表多条记录但是反过来,另一张表的一条记录只能对应这张表的一条记录。

例母亲与孩子的关系

多对多

一张表中的一条记录对应另外一张表的多条记录,同时另一张表的一条记录对应另外一张表的多条记录。

范式

Normal format

是一找种离散型数学中的知识,为解决数据存储的与优化问题,

数据保存以后,凡是能够通过关系找出来的数据,坚决不在重复存储:终极目标是减少数据的冗余。

范式是一种分层的结构规范,分为六层,每一层都比上一层严。若要满足下一范式,前提是满足上一层范式。

六层范式:1NF,2NF,3NF.4NF,5NF,6NF最高

Mysql属于关系型数据库有空间浪费:致力于节省存储空间,与范式所解决的问题不谋而活:在设计数据库,会利用范式来指导设计,但是数据不单是解决空间问题,要保护效率问题,范式只为解决空间问题,所以数据库的设计又不可能完全按照范式要求实现,一般只有前三种范式需求满足。

范式在数据库中有指导意义:但是不强制规范。

第一范式:1NF

在设计表存储数据的时候,如果表中设计的字段存储的数据,再取出来的使用之前还需要额外的处理(拆分)那么说表的设计不满足第一范式=>第一范式要求字段的数据具有原子性=>不可再分。

第二范式:2NF

再数据表设计过程中,如果有复合主键(多字段主键),且表中有字段并不是由整个主键来确定,而是依靠主键的某个字段(主键的一部分)=>存在字段约束主键的部分问题,称之为部分依赖=>第二范式就是要解决表中不允许出现部分依赖。

取消复合主键,使用逻辑主键。

第三范式:3NF

要满足第三范式,必须满足第二范式。

第三范式:理论上讲,y应该一张表中所有字段都应该有直接依赖主键(逻辑主键代表业务主键),如果表设计中存在一个字段,并不直接依赖主键而是通过某个非主键字段依赖,最终实现依赖主键。把这种不是直接依赖主键而是依赖非主键字段的依赖关系称之为依赖传递

逆规范化

磁盘利用率与效率的对抗,有时候再设计表的时候如果一张表中有就几个字段需要从别的表中去获取信息,理论上讲的确可以获得想要的数据,但是效率低一点,会刻意的在某些表中,不去保存外表的主键(逻辑主键)而是直接保存想要的数据信息这样一来在查询数据的时候,一张表可以直接提供数据,而不需要多表查询(效率低)。

数据的高级操作:

数据的操作:增删查改。

高级新增数据

Insert into 表名(字段列表) values (值列表);

在数据插入的时候,假设主键对应的值已经存在,插入一定会失败。

主键冲突:

当主键存在冲突的时候(Duplicate key)

可以选择性进行处理:更新和替换

高级操作更新:

Insert into 表名 [field主键] values (值列表) on duplicate key update 字段=新值;

主键冲突例子:insert into my_sql values (‘php’,’B101’);

更新:insert into my_sql values (‘php’,B101’) on duplicate key update room =’B102’;

替换

Replace into 表名[字段主键] values (值列表)

例:replace into my_sql values (‘Java’,’102’);

蠕虫复制:

蠕虫复制:从已有的数据表中获取数据,然后将数据又进行新增操作,数据成部的增加。

表创建高级操作:从已有表创建新表(复制表结构)

Create table 表名 like 数据库.表名;

蠕虫复制:先查出数据,然后再将查出的数据新增n遍

Insert into 表名(字段) select 字段列表/* from 数据表名;;

蠕虫复制的意义:

1,从已有表拷贝数据到新表中

2,可以迅速让表中数据膨胀到一定的数量级;测试表的压极效率;

高级更新数据

Update

Update 表名 set 字段 =值[where条件];

高级新增语法

Update  表名 set 字段 =值[where条件][limit 更新数量];

例:update my_copy set name =’c’ where name =’a’ limit =3;

删除数据与更新类似

Delete from表名 [where条件][limit 数量];

例:delete from my_copy where name =’a’ limit=3;

删除:如果表中存在主键自增长,那么当删除之后自增长不会还原。

思路:数据的删除是不会改变表结构,只能删除表后重建

Truncate 表名; 先删除改变后新增改变

清空表,重置自增长。

查询数据

Select 字段列表/* from表名 [where条件];

完整语法:

Select  [select选项] 字段列表 [字段别名] /* from数据源 [where条件子句] [group by 子句] [ having 子句] [order by 子句] [limit 子句];

select选项

Select对查询出来的结果处理方式

All:默认的保留所有结果。

Distinct:去重,查出来的结果,将重复的结构去除(所有字段相同)。

字段别名

当数据查询出来以后,有时候名字不一定就满足需求(多表查询的时候,会有同名的字段)

就需要对字段名进行重命名:别名:字段名 [as] 别名;

数据源

数据源:数据的来源,关系型数据库的来源都是数据表,本质上可以保证数据类似二维表,最终都可以作为数据源,

数据源分为多种:单标数据源,多表数据源,查询语句。

单标数据源

Select * from 表名;

多表数据源

Select *from 表名1,表名2.......;

从一张表中取出一条记录,去另外一张表中匹配所有记录,而且全部保留(记录数和字段数),将这种结果称之为笛卡尔积(交叉连接)

笛卡尔积没什么用,应该尽量避免。

子查询

数据的来源是一条查询语句(查询语句结果是二维表)

Select * from (select 语句) as 表名;

Where 子句

Where 子句,用来判断数据,筛选数据,

Where子句会返回结果:0/1;true/false

判断条件:运算符:<,>,<=,>=,!=,<>,like between and ,notin/in

逻辑运算符:&&(and),or

where原理

Where 是唯一一个直接从磁盘读取数据的时候就开始判断的条件,从磁盘取出一条记录,开始进行where 判断,成立保存到内存,失败则放弃

条件查询

要求找:

Group by 子句

分组

根据某个字段分组(同为一组)

基本语法:group by 字段名

意义:统计数据(按分组字段进行数组统计)

SQL提供了一系列统计函数

Count(c):统计分组后记录数,每组多少记录。

Max():最大值

MIn():最小值
Avg():平均数

Sum():求和

Count函数:里面可以使用两种参数,*代表统计记录

字段名代表统计对应字段(null不统计)

分组会自动排序,根据分组字段:默认排序

Group by 字段[desc/asc] ;多分组结果然后合并之后的整个结果进行排序;

多字段分组:先根据一个字段进行分组,然后对分组厚度结果按照其他字段进行分组。

有一个函数:可以对分组结果中的某个字段进行字符串连接(保留该字段所有的字段):

Group _concat(字段)

回溯统计:with rollup :任何一个分组后都会有一个小组,最后都需要向上级分组进行汇报统计:根据当前分组字段,回溯统计的时候会将分组字段置空

多字段回溯:考虑第一层分组会有此回溯:第二次分组要看第一层分组的组数,组数是多少回溯就是多少,然后加上第一层

Having子句

与where 子句一样;进行条件判断的,where是对磁盘数据进行判断,进入到内存以后经常分组操作,分组结果就需要having 来处理。

Having 能做where能做的几乎所有事情,但是where不能做having能做的很多事情。

1) 分组统计的结果就是或者是说统计函数都只有having 能够使用

2) Having 能够使用做的别名,where不能=>where是从磁盘读取数据,而名字可能是字段进入到内存后产生的。

Order by子句

Order by子句:排序,根据某个字段进行升序或者降序,排序依赖校对集。

基本语法:order by 字段名 [asc/desc]

Asc:是升序(默认的)

Desc:降序

排序可以进行多字段排序:先根据某个字段进行排序然后排序好内部。再按照某个数据进行排序。

Limit子句

Limit 子句是限制结果的语句,限制数量

Limit有两种使用方式

方案1:只用来限制长度(数据量)

Limit 数据量;

方案2:

限制起始位置,限制数量:limit 起始位置,长度

主要用来实现数据的分页:为当前用户节省时间提高服务器的响应效率,减少资源的浪费。

对于用户来讲:可以点击的分页按钮1,2,3,4

对于服务器来讲:根据用户选择的页码来获取不同的数据:limit offset,

Length;

Length:每页显示的数据量,基本不变;

Offset: offset=(页码-1)*每页显示量。

原文地址:https://www.cnblogs.com/lqh969696/p/9693785.html

时间: 2024-10-01 05:51:03

mysql学习之路_高级数据操作的相关文章

mysql学习之路_外键

回顾4 连接查询: 连接多张表到一起,不管记录数如何,字段数一定会增加. 分类:内连接,外连接.自然连接,交叉连接, 交叉连接:cross join (笛卡尔积) 内连接:inner join,左右两张表有连接条件匹配(不匹配自动忽略) 外连接:left/right join 主表的一条记录一定会存在匹配保留副表数据,否则置空 自然连接:natural join 自动匹配(相同字段名) PHP操作:mysql Php充当客户端,开启mysql扩展 连接认证:mysql_connect;执行sql

mybatis学习之路----批量更新数据两种方法效率对比

原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql:

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

MySQL从删库到跑路_高级(三)——视图

作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.视图简介 1.视图简介 视图是由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式.视图包含一系列有名称的数据列和数据行,但视图中的数据并不真实在于数据库中,视图返回的是结果集. 2.创建视图的目的 视图是存储在数据中的查询的SQL语句,创建视图主要出于两种原因: A.实现安全.视图可设置用户对视图的访问权限. 创建查询是JAVA班学生成绩的视图javaview.NET班学生成绩的视图ne

Python不归路_字符编码操作

文件操作补充 上篇随笔中写了文件操作的几个方法,其中truncate()方法遗漏,truncate()方法作用是截取内容,f.truncate()不带参数会清空文件内容,带参数表示截取从零到参数的位置 字符编码 在<Python不归路_零基础学习二>中我们已经学习了一些编码的知识,比如ASCII一共有255个符号,Unicode中,中文字符占两个字节,英文占一个字节,utf-8是unicode的优化方案,中文字节占三个字符.不同字符编码之间需要相互转化才能正常读取.encode和decode,

mysql学习之路

                Mysql php阶段将数据库分为三个阶 基础阶段: mysql数据库的基本操作(增删改查),以及一些高级操作(视图,触发器,函数,存储过程等),PHP操作没有sql数据库. 优化阶段: 如何提高数据库效率,如索引,分表等. 部署阶段: 如何搭建真实的系统环境,如服务集群,负载均衡. 数据库基础 什么是数据库: 数据库:database ,存储数据的仓库(高效的存储和处理数据库的介质如磁盘.内存) 数据库分类: 1,关系型数据库:(sql型) 2,非关系型数据库(

第3章 文件I/O(7)_高级文件操作:存储映射

8. 高级文件操作:存储映射 (1)概念: 存储映射是一个磁盘文件与存储空间的一个缓存相映射,对缓存数据的读写就相应的完成了文件的读写. (2)mmap和munmap函数 头文件 #include<sys/types.h> #include<sys/mman.h> 函数 void* mmap(void* addr, size_t length, int prot, int flags,                       int fd, off_t offset); int

小白的CTF学习之路2——二进制数据基础与运算(上)

今天的第二更,被我拖到了傍晚,嘿嘿,二进制这方面让本就数学不好的我很头疼,所以研究了一段时间 在学习之前我们先了解几个问题: 32位是几个字节? 01011100对于十进制是多少? 00001111向左位移两位结果是多少?有什么规律? 以补码形式表示的8位二进制数11111111,十进制为多少? 二进制和十进制有什么区别? 在学习前肯定会对问题里的一些属于感到蒙蔽,不要急,按照我写的一步一步往下看,再回头看这些问题,就会迎刃而解 为什么要用二进制? 可能有些人不了解我们放着好好地十进制不用为什么

MySQL从删库到跑路_高级(一)——数据完整性

作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.数据完整性简介 1.数据完整性简介 数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据能够正确反应实际情况.数据的完整性是指数据的可靠性和准确性,数据完整性类型有四种:A.实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过唯一约束,主键约束或标识列属性).B.域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则)