关系

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

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

一对一:

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

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)*每页显示量。

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

  1. mysql学习之路_连接查询

    回顾 列属性:主键,自增长,唯一键. 关系:一对一,一对多,多对多 三层范式: 1NF:字段设计必须符合原子性 2NF:不存在部分依赖(没有复合主键) 3NF:不存在传递依赖(实体单独成表) 逆规范化 ...

  2. mysql学习之路_事物_存储过程_备份

    数据备份与还原 备份:将当前已有的数据保留. 还原:将已经保留的数据恢复到对应表中 为什么要做数据备份 1,防止数据丢失,被盗,误操作 2,保护数据记录 数据备份还原方式有多种:数据表备份 单表数据备 ...

  3. mysql学习之路_基础知识

                    Mysql php阶段将数据库分为三个阶 基础阶段: mysql数据库的基本操作(增删改查),以及一些高级操作(视图,触发器,函数,存储过程等),PHP操作没有sql数 ...

  4. mysql学习之路_字段类型与属性2

    字段属性: 主键,唯一键,自增长. 主键: Primary key 主要的键,一张表只能有一个字段能使用对应的键,用来唯一约束该字段里面的数据不能重复,称之为主见. 一张表最多只有一个主键. 增加主键 ...

  5. mysql学习之路_字段类型与属性

    回顾 数据库基本知识:关系型数据库与非关系型数据库 关系型数据库:安全(磁盘) 非关系型数据库:高效(内存) 关系型数据库:建立在关系模型上的数据库, 数据结构:二维表(浪费空间) 数据库操作指令:s ...

  6. mysql学习之路_视图

    视图 视图:view是一种有结构的但是没有结构来源的虚拟表,虚拟表的结构来源不是自己定义的而是从对应的基表中产生(来源) 创建视图 基本语法: Create view 视图名字 as select 语 ...

  7. mysql学习之路_外键

    回顾4 连接查询: 连接多张表到一起,不管记录数如何,字段数一定会增加. 分类:内连接,外连接.自然连接,交叉连接, 交叉连接:cross join (笛卡尔积) 内连接:inner join,左右两 ...

  8. mysql学习之路_联合查询与子查询

    联合查询 联合查询:将多次查询(多条select语句)在记录上进行拼接(字段不会增加). 语法:多条select语句构成,每条select语句获取的字段必须严格一致(但是字段类型无关). Select ...

  9. mysql学习之路_乱码问题

    中文数据问题: 中文数据问题本质就说字符集问题, 计算机只识别二进制,人类识别符号:需要友谊个二进制与字符对应关系(字符集). 报错:服务器没有识别对应的四个字节. 服务器认为的数据是utf—8,一个 ...

随机推荐

  1. 宝塔Linux面板 概述

    安装要求: Python版本: 2.6/2.7(安装宝塔时会自动安装) 内存:128M以上,推荐512M以上(纯面板约占系统10M内存) 硬盘:100M以上可用硬盘空间(纯面板约占20M磁盘空间) 系 ...

  2. python requests的content和text方法的区别(转)

    原文地址: http://blog.csdn.net/xie_0723/article/details/51361006 问题: 一直在想requests的content和text属性的区别,从pri ...

  3. eval详解

    eval()的作用 把字符串参数解析成js代码并运行,并返回执行的结果: eval的作用域 作用域在它所有的范围内容有效 IE8及以下指向window 解决方法: functiona(){ if(wi ...

  4. java 向上转型和向下转型

    学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白.没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法. 首先看下怎么 ...

  5. sql建立一种,自定义的执行作业

    USE [chongwu] GO /****** Object: StoredProcedure [dbo].[p_createjob] Script Date: 01/21/2016 14:32:0 ...

  6. sqlserver自带的导入导出工具,分别导入大批量mysql和oracle数据时的感受

    sqlserver自带的导入导出工具,分别导入大批量mysql和oracle数据时,mysql经常出现格式转换出错,不好导入  导入的数据量比较大时,还不如自己写个工具导入 今天在导oracle时,想 ...

  7. SNP(单核苷酸多态性)准确性的验证,你造吗?

    SNP(单核苷酸多态性)准确性的验证,你造吗? [2016-12-12]       SNP(全称Single Nucleotide Polymorphisms)即单核苷酸多态性,主要是指在基因组水平 ...

  8. JDK 之 NIO 2 WatchService、WatchKey(监控文件变化)

    JDK 之 NIO 2 WatchService.WatchKey(监控文件变化) JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html ...

  9. jvm相关知识点

    1.hotspot虚拟机结构:类加载器.堆.栈.方法区.垃圾回收系统.执行引擎.本地方法栈.pc寄存器. 类加载器:负责将class文件从文件系统加载到方法区. 堆:存放对象的一块区域,所有线程共用. ...

  10. Android中关于使用空格对齐文字

    前言:今日编写新项目UI时,突然遇到文本有长有短无法对齐的问题(汗,以前竟从未遇到也从未考虑过这小小的问题),在资源文件中尝试Tab键.space空格键,发现效果都不能很好的实现,无奈只得请求度娘的协 ...