一.存储引擎

引擎 指的是一个系统的核心部分

引擎有不同分类是为了适应不同的使用场景

查看mysql支持所有引擎

show engines;

MRG_MYISAM 是一堆MYISAM表的集合

用于做水平分表,如果一个表中数据量太大 将导致效率降低

水平分表就是把整个大表拆成不同的小表,每一次查询 会判断数据在哪一个表中 然后对应去查找 以此来提高效率

name age sex

jerry 40 woman

name age sex

bgon 30 man

垂直分表

name age sex phone addr gf bf idcard number

jerry 40 woman 110 上海 xx xx 身份证 学号

当一个表中 字段太多 然而常用的信息就那么一两个 那就可以把不常用字段 切到另一个表中 然后建立关联关系

innodb 是最最常用的引擎 因为支持 事务 行锁 外键一系列功能....

MyISAM 没有上述一堆功能 但是 存储效率比innodb要高 并且支持分表

MEMORY 速度快 不能永久存储 没有特别的功能

二.详细建表语句

[]表示可选

create table 名称(字段 类型[(宽度) 约束条件],字段 类型,......)

三.mysql数据类型

为什么要给数据分类?

1.不同的数据类型 描述信息可以更加方便准确

2.在计算机中对数据分类可以减少内存开销

1.数字

整型 默认都是有符号的

tinyint 1个字节 8个二进制 0-255 -128 - 127

smallint 2个字

mediumint 3个字节

int 4个字节

bigint 8个字节

设置为无符号 需要在类型后添加unsigned

create table t8(a tinyint unsigned);

宽度在整型数据中 不是用来设置可存储的数据范围的

用于控制最先小显示长度(字符数) 如果长度不足 就帮你补0 但是需要指定zerofill

create table t12(a tinyint(5) zerofill);

结论是: 使用整型数据 宽度这个属性一般不用管它

浮点

float 4个字节

float(a,b)

double 8个字节

double(a,b)

decimal 不固定

decimal(a,b)

a代表总位数 b表示小数位数

5,3 最大值99.999

共同点: 小数位最大为30

float与double总长最大为255

都是不精确的 double比float精确点

不同点:

decimal总长最大为65 并且是精确的

2.字符串

char固定长度 和 varchar 可变长度

char(L) varchar(L)

L 都是表示最大可存储的长度 不是字节

a char(4) b varchar(4)

a:S 最终还是占4个字符长度

b:S 最终占1个字符长度 + 标识信息的长度(1-2字节)

S S S

如果有三个数据要存 每个数据都是一个s字符 最终3 * 4 12个字符长度

占用空间较多 存取速度较快

1S1S1S varchar 存储时必须保存一个长度标识信息 所以所占空间为实际内容长度+标识信息长度

相比较char 空间节省了 但是效率降低了

char采取的空间换时间 提高效率

字符串类型的BUG 由于char类型是定长 mysql会在末尾填充空格来达到定长的效果

所以char类型 不能存储末尾带有空格的数据 会直接把空格给去了

固定长度的字符串类型 不常用

tinytext 1字符

text 2字符

mediumtext 3字符

longtext 4字符

3.二进制数据类型 单位都是字节

binary varbinary

binary是固定长度的二进制

varbinary 可变长度的二进制

长度固定无法修改的二进制

tinyblob

blob

mediumblob

longblob

强调:

二进制数据类型 一般不用 如果要存储多媒体 如 音频 视频

需要将其放到FTP文件服务器上 然后数据库中只存储连接即可

4.时间类型

year 4为年份

date 日期 yyyy-MM-DD

time 时间 HH:mm:SS

datetime yyyy-MM-DD HH:mm:SS

timestamp 时间戳 一个浮点类型 从unix元年到现在的秒数

year 可以是数字 也可以是字符串

可以用四位字符串 也可以2位字符 或数字

00-69 == 2001-2069

70-99 == 1970 - 1999

甭管什么时间类型 照着标准格式字符串写 就行

timestamp 会自动更新时间 当你插入时 或修改时

current_time 和 now() 所有的时间 日期类型 都可以使用这两个方法来输入当前时间

所有的日期时间 数据库返回的都是字符串类型

严格模式

5.7以下的版本 默认是非严格模式的 例如你的类型为tinyint 存储的是128 最终存储的是127

set global sql_mode = "strict_trans_tables" 可以将其设置为严格模式

最好写到配置文件中 永久有效

enum 提前规定该字段能选的值的范围 多选1

set 提前规定该字段能选的值的范围 区别是 set字段 可以有多个值 用逗号隔开 多选多

数据库范式

就是指导你该如何设计数据库

数据类型 整型 int 浮点 float-double decimal 字符串 char varchar 时间-日期 枚举-集合 二进制

在保证数据足够保存情况下 选用占用空间最小的类型

四.约束

完整的建表语句

create table 名称(字段 类型[(宽度) 约束条件],字段 类型,......)

约束 是指 给数据的值加上一些限制

类型就是一种限制 宽度对于整型数据 没有存储限制 其他类型的宽度是有限制作用的

约束就是除了 数据类型以及宽度之外的其他限制

unsigned就是约束中第一种 表示你的整数 不能包含符号 仅针对数字类型

约束 是为了保证数据的完整性

完整性约束

not null 非空

限制该字段 必须有值

例如账号密码

default 默认值

例如 多数用户都是男的 游戏账号的金币可以默认

1.建表直接指定

create table t(name char(10) not null default 默认值);

2.后期增加约束

alter table t modify name char(10) not null default 已有的字段

alter table t add sex char(10) not null default 新增字段

unique 唯一性约束 并且是一个索引

要求该字段的值 不能重复

单字段:

create table olbPerson(name char(20) unique,school char(10));

多字段联合唯一约束

create table olbPerson(name char(20),school char(10), unique(name,school));

例如:姓名和校区两个字段 如果两个校区有相同的姓名 这时候就可以把这两个字段作为联合唯一索引

这些字段都相同才算是重复

primary key 主键约束

从约束角度来看 和 非空 + 唯一 是相同的效果

不能为空且不能重复

需要强调的是:

主键除了有约束的效果 还是一个索引 并且是非常重要的索引

在该innodb 主键是必不可少的

innodb 组织数据结构是按照树形结构来组织的,该结构中 必须有一个数据 不能为空且唯一的

如果没有这样的数据 树形结构也就不存在.

mysql在创建表的时候 会检测 是否存在主键

如果没有 它就找一个具有非空且唯一约束的字段提升为主键

如果也没有这样的字段 mysql就创建一个隐藏字段作为主键

索引 可以提高查询速度

结论是: 只要你是用innodb引擎 你就应该建表时设置一个主键 通常主键字段叫做id

id 有唯一标识的意思

索引 就像是 字典里目录 用于快速定位数据所在位置

自动增长

主键在使用中 需要我们自己来维护 其正确性 你需要知道上一次写的是什么 然后找一个之前没用过的主键

mysql 提高了自动增长约束 可以帮你自动管理主键的值

要求必须是整型,每次插入数据都会自动+1 程序中就不要再自己管理主键了

语法:

create table table_name(id int primary key auto_increment,name char(10));

# 插入带有自动增长的字段时 可以直接忽略该字段 也可以插入一个null

insert into table_name values(null,"jack");

insert into table_name(name) values("jack");

只要你创建一个表 就应该有主键 并且自动增长.

foreign key 外键约束

mysql 进阶_mysql进阶知识相关推荐

  1. mysql游标进阶_MYSQL进阶学习知识拓展一:MySQL 存储过程之游标!

    一.MySQL游标的概念 游标介绍: MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想, ...

  2. mysql 进阶_mysql进阶 - 随笔分类 - 云潇洒 - 博客园

    随笔分类 - mysql进阶 1 摘要:防御SQL注入的方法总结 这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下. SQL注入是一类危害 ...

  3. mysql select 进阶_MySQL进阶_SELECT篇(一)

    MySQL中SELECT语句的基本语法是: SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] [DI ...

  4. mysql游标进阶_mysql进阶(三)游标简易教程

    mysql游标简易教程 从mysql V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存储引擎.InnoDB支持事务,而且拥有相关的RDBMS特性:ACID事务支持,数据完整性(支持外键 ...

  5. mysql中括号_mysql进阶知识点,启动项、系统变量、字符集介绍!

    点击上方「蓝字」关注我们 mysql数据库是当前应用最为的广泛的数据库,在实际工作中也经常接触到.真正用好mysql也不仅仅是会写sql就行,更重要的是真正理解其内部的工作原理.本文先从宏观角度介绍一 ...

  6. linux mysql进阶_mysql进阶学习二之搭建主从

    前面说了主从复制的原理,现在我们搭建主从结构 1. 提前准备 我准备了两台主机,主节点是远程的centos7,从节点是本机windows 主从复制的原理在上一篇已经说了:主节点中mysql创建一个用户 ...

  7. mysql 减去_MySql进阶面试题

    11. 表中有大字段 X (例如:text 类型),且字段 X 不会经常更新,以读为 为主,将该字段拆成子表好处是什么? 如果字段里面有大字段(text,blob)类型的,而且这些字段的访问并不多,这 ...

  8. mysql谓词演算_MySQL基础知识

    一.了解MySQL 1.什么是数据库? 数据库是一种以某种有组织的方式存储的数据集合. 2.模式(schema):关于数据库和表的布局及特性的信息. 3.列:正确的将数据分解为多个列极为重要.通过把它 ...

  9. mysql〉_MySql 基础知识-常用命令及sql语句

    一.常用mysql命令行命令 1,启动mysql服务 net start mysql. 停止mysql服务 net stop mysql 2,netstart -na|findstr 3306查看被监 ...

最新文章

  1. python数据科学-单变量数据分析
  2. 51nod1832(二叉树/高精度模板+dfs)
  3. springboot的起步依赖
  4. 《小团团团队》第四次作业:项目需求调研与分析
  5. 使用alarm API实现灵活的延时操作
  6. SFP光模块与SFP+、XFP、QSFP、GBIC、BIDI的区别
  7. nyoj244 16进制的简单运算
  8. C语言员工信息管理系统
  9. 计算机屏保后无法再次启动,电脑开机一直停留在屏保 电脑问题的原因以及解决方法...
  10. HTML——多选框和按钮、搜索框滑块简单验证
  11. linux socket监听端口,Linux-socket使用
  12. python获取两个时间间隔的天数
  13. 从实践角度重新理解BIO和NIO
  14. 瀚高数据库并行导入导出
  15. 拉卡拉考拉超收,关于它的全部信息!
  16. CSS利用PS切图+学成在线综合案例
  17. 转行AI产品经理的学习过程
  18. 达梦数据库DEM(企业管理器)部署实战
  19. c#中应用skinEngine给应用程序换皮肤
  20. C语言中字符型变量与整型变量的联系

热门文章

  1. undo表空间暴长,如何取消自动扩展
  2. Oracle 11g新特性:Result Cache
  3. Oracle启用、禁用角色
  4. 云计算管理三利器:Nagios、Ganglia和Splunk
  5. 自己也遇到了-db_recovery_file_dest_size 修改大一点
  6. C#中的delegate的 Invoke 、BeginInvoke的区别
  7. linux uname 命令 打印系统信息
  8. affiliate的使用方式
  9. 07_UI基础_UITableView实战- 支付宝口碑
  10. 无法访问请求的页面,因为该页的数据的相关配置数据无效