聊聊数据库~SQL基础篇 (2)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspwyg.html