PS:数据文件一般都是放在/var/lib/mysql中
课后拓展: 浅析MySQL 8忘记密码处理方式 https://www.cnblogs.com/wangjiming/p/10363357.html MySQL5.6更改datadir数据存储目录 https://www.cnblogs.com/ding2016/p/7644675.html 1.4.基础(MySQL and SQLServer)脚本示例:https://github.com/lotapp/BaseCode/tree/master/database/SQL
PS:在MySQL中运行SQL脚本:mysql < script.sql
后面代码优先使用通用SQL(MySQL和SQLServer(MSSQL)通用的SQL语句),逆天好几年没用SQLServer了(几年前讲过MSSQL),这边就一带而过(欢迎纠错)
PS:后面MariaDB我也直接说成MySQL了(有区别的地方我会说下,毕竟也是MySQL的分支,相似度还是很大的)
1.概念 1.1.传统概念来说说传统概念:
关系型数据库中的关系:表(行、列)
设计范式:
第1范式:字段是原子性的
第2范式:每个表需要一个主键
第3范式:任何表都不应该有依赖于其他非主键表的字段
DDL:数据定义语言(Data Defination Language)
create、drop、alter
DML:数据操作语言(Data Manipulation Language)
insert、delete、update、select
DCL:数据库控制语言(Data Control Language)
grant(授权)、revoke(回收)
PS:CURD(定义了用于处理数据的基本原子操作):创建(Create)更新(Update)读取(Retrieve)删除(Delete)操作
1.2.常见组件关系型数据库常见组件:
数据库:database
表:table
行:row
列:column
索引:index
视图:view
PS:如果有数据库迁移的需求则不建议使用
PS:MySQL的视图功能不是特别完素,尽量不使用
存储过程:procedure
存储函数:function
触发器:trigger
事件调度器:event、scheduler
用户:user
权限:privilege
PS:MySQL常见的文件类型:
数据:数据文件、索引文件
日记:错误日志、查询日志、慢查询日志、二进制日志、(重做日志、撤销日志、中继日志)
2.MySQL标准存储引擎 2.1.MySQL先说说MySQL标准存储引擎(表类型):
MyISAM:只支持表级锁,不支持事务
InnoDB:支持事务、间隙锁、行锁等等
2.2.MariaDB首先是插件式存储引擎(表类型)的改进和扩充 PS:其实也就是支持更多的存储引擎(包括自定义的)
MariaDB对标准存储引擎进行了改造升级:
MyISAM ==> Aria:支持崩溃后的恢复
InnoDB ==> XtraDB:优化存储性能
还进行了很多扩展并开发了新的功能(也提供了很多测试工具),比如添加一些NoSQL的功能(SQLServer也扩展了NoSQL)
3.创建、删除(数据库 | 表) 字段类型(含异同)官方文档:
https://mariadb.com/kb/en/library/data-types
https://dev.mysql.com/doc/refman/5.7/en/data-types.html
以MariaDB为例,简单列举下常用类型:(倾体说明和MySQL不一样)
字符型:
定长字符型:
char():不区分字符大小写类型的字符串,max:255个字符
binary():区分字符大小写类型的二进制字符串
变长字符型:
varchar(): 不区分字符大小写类型的字符串
max:65535(2^16 - 1)个字节(utf8编码下最多支持21843个字符)
可以理解为SQLServer的nvarchar
varbinary():区分字符的大小写类型的二进制字符串
对象存储:
text:不区分字符大小写的不限长字符串
最大长度为65,535(2^16 - 1)个字符
如果值包含多字节字符,则有效最大长度减少
blob:区分字符大小写的不限长二进制字符串
内建类型:(不推荐使用)
enum:单选字符串数据类型,适合表单中的单选值
set:多选字符串数据类型,适合表单的多选值
PS:MySQL系独有,SQLServer没有
数值型:
精确数值型:
整型:int
bool:布尔类型
PS:SQLServer是bit
相当于MySQL的tinyint(1)
tinyint:微小整型(1字节,8位)
[-2^7, 2^7)(-128 ~ 127)
无符号:[0, 2^8)(0 ~ 255)
smallint(2bytes,16bit):小整型
无符号:0 ~ 65535
mediumint(3bytes,24位):中等整型
PS:SQLServer中没这个类型
int(4bytes,32bit)
[-2^31, 2^31),[-2147483648,2147483648)
无符号:[0, 2^32),[0,4294967296)
bigint(8bytes,64bit)
[-2^63, 2^63)
无符号:[0, 2^64)
浮点类型:
float:单精度浮点数(4字节)
double:双精度浮点数(8字节)
PS:SQLServer的float类型相当于MySQL的double
decimal:精确小数类型(比double更精确)
钱相关用的比较多:decimal(位数,小数点位数)
eg:decimal(2,1) => x.x
日期和时间类型:(和MySQL一样)
date:日期(3bytes)
time:时间(3bytes)
year:年
eg:year(2):00~99(1bytes)
eg:year(4):0000~9999(1bytes)
PS:SQLServer没有这个类型
datetime:既有时间又有日期(8bytes)
timestamp:时间戳(4bytes)【精度更高】
修饰符:
所有类型都适用:
是否为null:null | not null
默认值:default xxx_value
主 键:primary key
唯一键:unique key
数值类型适用:
无符号:unsigned(MySQL系独有)
自增长:auto_increment (一般只用于整型)
获取ID:last_insert_id()
PS:多列设置:
主键:primary key(xx,...)
唯一键:unique key(xx,...)
索引:index index_name (xx,...)
PS:现在新版本数据库兼容了SQLServer的nvarchar写法(执行成功后数据类型变成varchar)【不推荐使用】
课后拓展:
MySQL:char、varchar、text的区别 https://dev.mysql.com/doc/refman/5.7/en/char.html https://blog.csdn.net/brycegao321/article/details/78038272 3.1.MySQL知识点概括:
创建数据库:
create database [if not exists] db_name;
删除数据库:
drop database [if exists] db_name;
创建表:
create table [if not exists] tb_name(列名1,数据类型 修饰符,列名2,数据类型 修饰符);
删除表:
drop table [if exists] db_name.tb_name;
修改表:
字段
添加字段:add
alter table tb_name add 列名 数据类型 修饰符 [first | after 列名];
PS:SQLServer没有[first | after 列名]
修改字段:alter、change、modify
修改字段名:alter table tb_name change 旧列名 新列名 类型 类型修饰符
修改字段类型:alter table tb_name modify 列名 类型 类型修饰符
添加默认值:alter table tb_name alter 列名 set default df_value
删除字段:drop
alter table tb_name drop 字段名
索引
添加索引:add(常用:create index index_name on tb_name(列名,...);)
alter table tb_name add index [ix_name] (列名,...);
添加唯一键:alter table tb_name add unique [uq_name] (列名,列名2...);
PS:不指定索引名字,默认就是第一个字段名
删除索引:drop(常用:drop index index_name on tb_name)
alter table tb_name drop index index_name;
删除唯一键:alter table tb_name drop index uq_name;
PS:唯一键的索引名就是第一个列名
PS:一般在经常用做查询条件的列设置索引
表选项
可以参考这篇文章:https://www.cnblogs.com/huangxm/p/5736807.html
SQL Model:定义MySQL对约束的响应行为:
会话修改:
mysql> set [session] sql_model='xx_mode'
mysql> set @@session.sql_mode='xx_mode'
PS:只在当前会话生效
全局修改:需要有权限,并且不会立即生效,对以后新建的会话生效(从全局继承的)
mysql> set global sql_mode='xx_mode'
mysql> set @@global.sql_mode='xx_mode'
PS:MySQL重启后失效
配置修改:永远生效:
eg:vi /etc/my.cnf,在[mysqld]下添加sql_mode='xx',然后重启数据库
常用mode:(阿里服务器默认是:strict_trans_tables)
traditional:使用传统模型,不允许对非法值做插入操作
strict_trans_tables:对所有支持事物类型的表做严格约束
strict_all_tables:对所有表做严格约束
查询当前设置:select @@sql_mode