数据库、表操作
1. SQL
语法
1.1. 结尾
;
表示一行代码解释。
1.2. 注释
-- 单行注释
/**
* 多行注释
*/
1.3. 特殊名称
如果表名或者字段的名称和sql
关键字冲突,或者带有特殊字符,这时候就需要用到 ``
。
create database `database`;
1.4. 命名
[!note|style:flat]
SQL
的关键字,字段名均不区分大小写。
2. 数据库需要操作的内容
[!note]
- 操作数据库
- 操作表
- 操作表中的数据
3. 操作数据库
3.1. 添加数据库
if not exists
: 判断为真,才执行命令。
create database [if not exists] 数据库名;
3.2. 删除数据库
if exists
: 判断为真,才执行。
drop database [if exists] 数据库;
3.3. 使用数据库
use `数据库名`
3.4. 字符集
create database `名称` character set utf8 collate utf8_general_ci;
character set utf8
:设定字符集collate utf8_general_ci
:校验字符集
4. 操作表
4.1. 数据库数据类型
4.1.1. 数值
类型 | 描述 | 字节 |
---|---|---|
tinyint |
最小的数 | 1 |
smallint |
较小的数 | 2 |
mediumint |
中等 | 3 |
int |
标准 | 4 |
bigint |
较大的 | 8 |
float |
4 | |
double |
8 | |
decimal |
字符串的浮点数,防止浮点数丢失精度;金融行业 |
4.1.2. 字符串
类型 | 描述 | 字节 |
---|---|---|
char |
固定长度字符串,设定的长度全部用完 | 0 ~ 255 |
varchar |
存储变长的字符串,设定的长度只是最大值 | 0 ~ 65535 |
tinytext |
微型文本串,不能指定默认长度 | 0 ~ 255 |
text |
文本串,存储可变长度的非Unicode数据,不能指定默认长度。 | 0 ~ 65535 |
4.1.3. 日期
类型 | 格式 | 描述 |
---|---|---|
date |
YYYY-MM-DD | 年月日 |
time |
hh:mm:ss | 时分秒 |
datetime |
YYYY-MM-DD hh:mm:ss | 年月日时分秒 |
timestamp |
1970.1.1到现在的毫秒 | 时间戳 |
year |
年 |
4.1.4. null
[!note|style:flat]
- 不要使用
null
进行算数运算- 字符串的空为
''
,并非null
4.2. 字段的属性
字段 | 作用 | 注意 |
---|---|---|
unsigned |
无符号整型 | 不能为负数 |
zerofill |
未使用的字节,根据length 进行0 填充 |
|
Auto Inc |
自增,在上一条记录上加一 | 1. 用来设计唯一的主键 2. 必须为整数 3. 可以设定初始值、步长 3. 超过类型最大值时,设置为最大值,并报错 |
not null |
1. 勾选,不给对应元素复制,就会报错 2. 不选,不填值默认为 null |
|
default |
设置默认值 | |
length |
1.数值,显示的长度0001 2. char,varchar ,字符的长度 |
4.3. 约束
create table [if not exists] `表明`(
`列名` 类型(length) 字段约束,
表级约束
)[表类型] [字符集] [注释];
4.3.1. 字段约束
约束 | 描述 |
---|---|
not null |
约束该字段的值不能为空 |
default |
约束默认值 |
primary key |
约束该字段的值具有唯一性,并且非空 |
unique [key/index] |
约束该字段的值具有唯一性,可以为空 |
check |
字段值是否有效 |
auto_increment |
自增约束,数据删除后,值不会进行调整 |
4.3.2. 表级约束
约束 | 描述 |
---|---|
primary key |
约束该字段的值具有唯一性,并且非空 |
unique [key/index] |
约束该字段的值具有唯一性,可以为空 |
check |
字段值是否有效 |
FOREIGN KEY |
用来确保数据的一致性,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值 |
[!note] 对于索引约束,除了
primary key
,其余都可以定义个索引名。
4.4. 表的列名(正式项目用)
列名 | 作用 | |
---|---|---|
id |
主键 | |
version |
乐观锁 | |
is_delete |
伪删除,只是标记数据被删除,但是数组仍然储存在数据库中 | |
gmt_create |
创建时间 | |
gmt_update |
修改时间 |
4.5. 表的类型
项目 | 描述 | MYISAM |
INNODB |
---|---|---|---|
事务 | 一段捆绑执行的业务逻辑 | 不支持 | 支持 |
行锁定 | 多用户,可对行操作进行锁定 | 不支持 | 支持 |
外键约束 | 建立主从表关系,确定数据一致性 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 | |
储存空间 | 较小 | 约为MYISAM 的两倍 |
物理空间储存:
- 表都存储在指定数据库的文件夹下
INNODB
两个文件.frm
: 存储表的结构信息,在数据库文件夹下ibdata1
: 存储数据,与数据库文件夹同级
MYISAM
三个文件.frm
: 存储表的结构信息.MYD
:存储数据.MYI
:存储索引
4.6. 创建表
create table [if not exists] `表明`(
`列名` 类型(length) [属性] [索引] [注释],
....
`列名` 类型(length) [属性] [索引] [注释],
primary key (`列名`)
)[表类型] [字符集] [注释];
CREATE table if not exists `student`(
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(10) NOT NULL DEFAULT '李华' COMMENT '名字',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`number` VARCHAR(11) NOT NULL DEFAULT '10086' COMMENT '电话',
PRIMARY KEY(`id`)
)engine=InnoDB charset=utf8 COMMENT='学生';
[!note|style:flat] 给定了
not null
属性后,就不能再设置default null
。
4.7. 查看表
4.7.1. 查看表的列结构
describe `表名`;
4.7.2. 查看表的创建代码
show create table `表名`;
4.8. 修改表结构
4.8.1. 修改表名
alter table `表名` rename as `新表名`;
4.8.2. 增加字段(列)
alter table `表名` add `列名` 类型名(length) [属性] [索引] [注释];
4.8.3. 修改字段(列)
修改类型,约束(列属性):
alter table `表名` modify `列名` [类型,约束];
可以重命名,修改类型,约束:
alter table `表名` change `列名` `新列名` [类型,约束];
[!note|style:flat] 重新修改字段,
[类型,约束]
也会跟着以前修改掉,不指定就没有。
4.8.4. 修改表级别约束
增加:
alter table `表名` add 约束 [`索引名`] (`字段`);
删除:
alter table `表名` drop 约束 [`索引名` (`字段`)];
4.8.5. 删除字段
alter table `表名` drop `列名`;
4.9. 删除表
drop table [if exists] `表名`;