这是一篇很全面的MySql基础扫盲文章,不论是重温经典,还是初次掌握,皆可配着五香瓜子慢慢食用
数据库基础
- 数据库 :
database,高效的存储和处理数据的介质(介质主要是两种:磁盘和内存) - 数据库基于存储介质的不同:进行的分类,分为两类:关系型数据库(SQL)和非关系型数据库(NoSQL:not only sql)
- 不同的数据库阵营中的产品有哪些?
- 关系型数据库 :
- 大型的 :oracle ,DB2
- 中型 :SQL-SERVER , MySql
- 小型 : access
- 非关系型数据库:memcached,mongodb,redis
- 关系型数据库 :
- 两种阵营的区别:
- 关系型数据库: 安全,(保存磁盘基本不可能丢失,)
- 非关系型数据库 : 效率高 不安全(断电丢失)
当然本文是依托关系型数据库来完成的,下面以mysql5.7 介绍基础使用
常用命令
- 查看数据库:
show databases - 查看数据库创建语句:
show create database 数据库名 - 更新数据库
- 数据库名字不可以修改。
- 数据库修改的仅限库选项 :字符集和校对集
alter database landmanage charset GBK- 删除数据库:
drop database 数据库名字 - 新增数据表:
create table 表名( 字段名字 数据类型, ) - 删除数据表:
drop table 表名 - 查看表:
desc 表名 - 修改表名字 :
rename table 老表明 to 新表名 - 添加字段 :
alter table 表名 add column 字段 - 修改字段 :
alter table 表名 modify 字段名 数据类型 - 重命名字段:
alter table 表名 change 旧字段 新字段名 数据类型 - 删除字段 :
alter table 表名 drop 字段名 - 查看所有字符集:
show character set - 查看数据库默认的对外处理的字符集:
show variables like 'character_set%' - 修改字符集:
character_set_client,character_set_connection,character_set_results set names gbk
基础概念
校对集
- 有三种格式
_binbinary 二进制比较,取出二进制位,一位一位比较,区分大小写_cscase sensitive 大小写敏感,区分‘大小写_cicase insensitice 大小写不敏感,不区分大小写
列类型
- 数值型: 分为整数型和小数型
- 整型:
Tinyint: 迷你整型,使用一个字节存储。Smallint: 小整型,使用2个字节存储Mediumint: 中整型,使用3个字节存储Int: 标准整型 使用4个字节存储Bigint: 大整型,使用8个字节存储
- 其中整型在创建表时类型后面跟的小括号是
显示长度,不是指定的长度。 - 小数型 :
- mysql中将小数型细分为两种 一种是浮点型,一种是定点型
- 其中浮点型 :小数点浮动,精度有限,而且会丢失精度
- 定点型:小数点固定,精度固定,不会丢失精度
- 其中小数型在创建表时后面跟的小括号中指定的(M,D) 是指定长度
- M为一共多少位,D为小数多少位
- 浮点型 :
-
float单精度 占用4个字节3.402823466E+38精度大约7位左右 -
double双精度 占用8个字节1.797693134862E+308精度大约15位左右 -
浮点型数据的插入:整型部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)
-
- 定点型 :
decimal - 定点的精度高
- 日期类型
datetime: YYYY-mm-dd HH : ii : ssdate: datetime 中的 date部分time:HH : ii : ss
timestamp: 时间戳 是指从1970年开始的YYYY-mm-dd HH:ii:ss ,该列可设置自动填充,默认值是当前时间,如果执行update,insert操作时会自动更新该列year: YYYYnow()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。curdate()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。curtime()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。
- 字符串类型
- 定长字符串
char,磁盘在定义结构的时候,就已经确定了最终的数据存储长度 最长 可以为255 - 变长字符串
varchar, 在分配空间的时候,根据最大的空间分配,但是实际上最终用了多少,是根据具体的数据来确定 理论上可以存65536个字符,如果长度超出255,既不用定长也不用变长,用text - 文本字符串
text,如果数据量非常大,通常超过255个字符就会使用文本字符串 text不可以写默认值,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。文本字符串根据存储的数据的格式进行分类 : text 和blobtex: 文字blob: 存储二进制数据
- 枚举字符串
enum事先将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据其中一个- 例 enum('哈','哈哈') 则该字段只能存 哈,或者哈哈,别的存不进去
- 其中的类型都有一个key,
- insert into ..values (1); 插入的是‘哈’
- insert into ..values (2); 插入的是‘哈哈’
- 所以在插入时要加单引号
- 集合字符串
set - 集合和枚举很类似,实际存储的是数值,而不是字符串,(集合是多选) set('丽江','成都','山海关')
insert into ..values('丽江,成都')
- 定长字符串
列的属性
unsigned无符号zerofill零填充(当设置零填充的时候,自动加上无符号)例:alter table xx add xx int(2) unsigned zerofile显示位 2位,不够零填充
not null不能为空,如果不写,默认是可以为空,comment列描述 用来描述字段的default默认值collate指定字段的校对集 例如 COLLATE utf8mb4_unicode_ci- 主键 :
primary key- 增加主键的3种方式:
- 建表的时候添加 create table 表名 ( name varchar(20) primary key )
- 直接添加个主键 alter table 表名 add primary key(字段名)
- 修改表的时候添加 alter table 表名 modify 字段名 varchar(5) primary key
- 复合主键的时候,都相同才存不进去
- 更新主键和删除主键
- 不能更新 主键,只能先删除,再增加。
alter table 表名 drop primary key
- 增加主键的3种方式:
- 外键(
foreign key):如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键。一张表可以有多个外键- 增加外键 : 可以在新建表的时候建立外键,也可以在建表之后新增外键
- 创建表的时候创建外键:在所有的表字段之后,使用`foreign key(字段名)references 外部表(主键字段)`` ;外键要求字段本身必须先是一个索引(普通索引),如果字段本身没有索引,则会先创建索引 在创建外键
- 创建表之后新增外键:
alter table 表名 add constraint 外建名 foreign key(字段名) references 父表名(主键名)
- 删除外键: 外键不能修改,只能先删除在新增
alter table 表名 drop foreign key 外键名- 删除之后 因为没有索引而创建的索引还存在
- 外键条件
- 外键要存在:数据库的存储引擎
innodb(默认)如果不是 外键创建会成功 但是没有约束效应。 - 外键的字段类型,必须与父表主键类型完全一致。
- 一张表中的外键名字不能重复
- 外键要存在:数据库的存储引擎
- 外键约束:
restrict:严格模式,父表不能删除一个已经被子表引用的数据。cascade:级联模式,父表的操作,子表关联的数据也跟着改变(update父表 子表外键字段跟着改变,delete父表,子表对应数据跟着删除)set null: 父表操作之后,子表子表对应的数据(外键字段) 被置空- 指定模式的语法:
foreign key(字段名) references 父表(主键名) on delete 模式 on update 模式
- 增加外键 : 可以在新建表的时候建立外键,也可以在建表之后新增外键
- 自增长 :
auto_increment- 任何一个字段要做自增长,前提他的本身是一个主键
- 自增长字段必须是数字(整型)
- 一张表只能有一个自增长
- 修改自增长 :
alter table auto_increment = 值;只能比最大的值大,不能比最大的值小,小的时候也不报错,只是无效果 - 查看自增长变量:
show variables like 'auto_increment%' auto_increment_increment ‘步长’ auto_increment_offset ‘起始值’
- 可以修改变量,实现不同的效果,但是是对整个数据库修改,不是对单张表修改 (修改是会话级别):
set auto_increment_increment = 5; - 删除自增长
alter table 表名 modify 字段名 类型-- 就是修改字段属性,不写auto_increment了
- 唯一键 :
unique key- 唯一键和主键的区别,1.唯一键可以为空,且可以多个为空,因为空不参与比较
- 删除唯一键: alter table 表名 drop index 索引名字