存储引擎:
不同的数据应该有不同的处理机制
MySQL 存储引擎
Innodb: 默认的存储引擎 查询速度相比于 myisam 慢 但是更安全
myisam:MySQL 老版本用的存储引擎
memory: 内存引擎 (数据全部存在内存中)
blackhole: 无论存什么都立刻消失 (黑洞)
show engines;
数据类型:
创建表的完整语法:
create table 表名 (
字段名 1 类型 [(宽度) 约束条件],
字段名 2 类型 [(宽度) 约束条件],
字段名 3 类型 [(宽度) 约束条件]
);
注意:
1, 字段名和字段类型都是必须的 中括号内的参数都是可选的参数
2, 同一张表中字段名不能重复
3, 最后一个字段后面不能加括号
宽度:(使用数据库的准则: 尽可能让它少干活)
对存储数据的限制
char(1) 只能存一个字符如果超过了 MySQL 会自动帮你截取或者直接报错 (MySQL 中的严格模式)
alter table tablename modify name char not null; not null(该字段不能为空)
类型和中括号内的约束:
类型约束的是数据的存储类型
而约束是基于类型之上的额外的限制
字段类型:
整形: SMALLINT TINYINT INT BIGINT
================= 有符号: 默认有符号, 即数字前有正负号 ===========
- create table t1(id tinyint);
- insert into t1 values(-128); #插入成功
- insert into t1 values(-129); #插入失败, 5.7 版本报错: ERROR 1264 (22003): Out of range value for column 'id' at row 1. 之前版本不会报错, 会将 -129 存成 -128
- insert into t1 values(127); #插入成功
- insert into t1 values(128); #插入失败, 5.7 版本报错. 之前版本不会报错, 会将 128 存成 127
=================== 无符号: 范围在 0~255======================
create table t2(id tinyint unsigned);
insert into t2 values(-1); 插入失败, 5.7 之前版本会将 -1 存成 0.
其余结果就不一一演示了.
===================zerofill 测试整数类型的显示宽度 ===============================
- MySQL> insert into zerofilltable values(1),(11),(111),(1111)
- MySQL> select * from zerofilltable;
- +------+
- | id |
- +------+
- | 001 |
- | 011 |
- | 111 |
- | 1111 |
- +------+
- 4 rows in set (0.00 sec)
TINYINT: 默认是带有符号的 (-128,127), 超出这个限制之后会存最大值或最小值
create table tablename(id TINYINT);
not null 不能为空
unsigned 无正负符号
zerofill 0 填充多余的位数
char 后面的数字是用来限制存储数据的长度的
特例: 只有整型后面的数字不是用来限制存储数据的长度的 而是用来控制展示数据的位数的
int(8) 够 / 超 8 位有几位存几位, 不够 8 位就用空格填充
强调: 对于整型来说, 数据类型后的宽度并不是存储限制, 而是限时限制, 所以在创建表的时候, 如果字段采用的是 int 类型, 完全可以不指定限时宽度, 默认的限时宽度, 足够显示完整当初存放的数据
模糊匹配:
like
%: 匹配任意多个字符
_: 匹配任意一个字符
set session 临时有效 只在你当前操作的窗口有效
set global 全局有效 终生有效
设置完成之后, 你需要重新退出再次登陆就 OK 了
浮点型
float(255,30) 总共 255 位 小数部分占 30 位
double(255,30) 总共 255 位 小数部分占 30 位
decimal(65,30) 总共 65 位 小数部分占 30 位
- create table t12(id FLOAT(255,30));
- create table t13(id DOUBLE(255,30));
- create table t14(id DECIMAL(65,30));
精确度: float <double < decimal
字符类型
char(4): 最大只能存 4 个字符超出就会直接报错 如果少了 会自动用空格填充
varchar(4): 最大只能存 4 个字符 超出就会直接报错 如果少了 有几个就存几个
- create table t15(name char(4));
- create table t16(name varchar(4));
- char_length():
msyq 在存储 char 类型字段的时候 硬盘上确确实实存在的是固定长度的数据, 但是在取出来的那一瞬间, MySQL 就会自动将填充的空格去除 (可以通过严格模式, 来修改该机制 让其不做自动去处处理)
char 与 varchar 的区别:
char 取的时候方便直接按固定的长度取就可以
varchar: 取得时候比较繁琐, 无法是知道数据到底有多长
char 定长:
1, 浪费空间
2, 存取速度快
varchar 变长:
1, 节省空间
2, 存取速度慢 (相对于 char 比较慢)
存的时候 需要先给数据一个记录长度的报头
取的时候 需要先读取报头才能读取真是数据
日期类型
- MySQL> create table t2(d date, t time, dt datetime);
- Query OK, 0 rows affected (0.03 sec)
- MySQL> insert into t2 values(now(), now(), now());
- Query OK, 1 row affected, 1 warning (0.01 sec)
- MySQL> select * from t2;
- +------------+----------+---------------------+
- | d | t | dt |
- +------------+----------+---------------------+
- | 2019-08-19 | 23:32:13 | 2019-08-19 23:32:13 |
- +------------+----------+---------------------+
- 1 row in set (0.00 sec)
- ==============================================timestamp==================================
- MySQL> create table t3(timestamp_ timestamp);
- Query OK, 0 rows affected (0.02 sec)
- MySQL> insert into t3 values(now());
- Query OK, 1 row affected (0.01 sec)
- MySQL> select * from t3;
- +---------------------+
- | timestamp_ |
- +---------------------+
- | 2019-08-19 23:35:12 |
- +---------------------+
- 1 row in set (0.00 sec)
- ==============================================year=======================================
- MySQL> insert into t1 values(now());
- Query OK, 1 row affected (0.00 sec)
- MySQL> select * from t1;
- +-----------+
- | born_year |
- +-----------+
- | 2001 |
- | 1990 |
- | 2017 |
- | 2019 |
- +-----------+
- 4 rows in set (0.00 sec)
1. 单独插入时间时, 需要以字符串的形式, 按照对应的格式插入
2. 插入年份时, 尽量使用 4 位值
3. 插入两位年份时,<=69, 以 20 开头, 比如 50, 结果 2050
>=70, 以 19 开头, 比如 71, 结果 1971
- MariaDB [db1]> create table t12(y year);
- MariaDB [db1]> insert into t12 values
- -> (50),
- -> (71);
- MariaDB [db1]> select * from t12;
- +------+
- | y |
- +------+
- | 2050 |
- | 1971 |
- +------+
date: 年月日
datetime: 年月日时分秒
year: 年
time: 时分秒
枚举和集合类型
枚举: enum 限制某个字段能够存储的数据类型
- MySQL> create table shirts(
- -> name varchar(40),
- -> size enum('s', 'l', 'x', 'xxl'));
- Query OK, 0 rows affected (0.02 sec)
- MySQL> insert into shirts values('dress', 's'), ('youyiku', 'x');
- Query OK, 2 rows affected (0.01 sec)
- Records: 2 Duplicates: 0 Warnings: 0
- MySQL> select * from shirts;
- +---------+------+
- | name | size |
- +---------+------+
- | dress | s |
- | youyiku | x |
- +---------+------+
- 2 rows in set (0.00 sec)
===================================== 只插入一个值 ====================================
- MySQL> insert into shirts(name) values('haha');
- Query OK, 1 row affected (0.00 sec)
- MySQL> select * from shirts;
- +---------+------+
- | name | size |
- +---------+------+
- | dress | s |
- | youyiku | x |
- | haha | NULL |
- +---------+------+
- 3 rows in set (0.00 sec)
=========================== 枚举类型不一致会报错 =========================================
- MySQL> insert into shirts values('der', 'asd');
- ERROR 1265 (01000): Data truncated for column 'size' at row 1
集合: set 限制某个字段能够存储的数据内容
- MySQL> create table teacher(
- -> id int,
- -> name char(16),
- -> gender enum('male', 'female', 'others'),
- -> hobby set('pingpang', 'basketball', 'soccer'));
- Query OK, 0 rows affected (0.02 sec)
========================= 插入 =========================
- MySQL> insert into teacher values(1, 'egon', 'male', 'soccer,pingpang');
- Query OK, 1 row affected (0.00 sec)
注意: 插入的时候, set 多选的值之间不能有其他的东西, 如多了个空格之类的神奇玩意;
======================== 查询 ====================
- MySQL> select * from teacher;
- +------+------+--------+-----------------+
- | id | name | gender | hobby |
- +------+------+--------+-----------------+
- | 1 | NULL | female | soccer |
- | 1 | egon | male | soccer |
- | 1 | egon | male | pingpang,soccer |
- +------+------+--------+-----------------+
- 3 rows in set (0.00 sec)
约束条件:
not null: 不能为空
unique: 唯一
单列唯一:
限时某一个字段是唯一的
联合唯一:
在语句的最后用括号的形式, 表示哪几个字段组合的结果是唯一的
default: 给某个字段设置默认值 (当用户写了就用写的, 没有的话就用默认的)
create table t17(id int,name char(16) default 'william
primary key: 主键
限制效果跟 not null + unique 组合效果一致 非空且唯一
create table t18(id int primary key);
primary key 也是 innodb 引擎查询必备的索引, 索引可以当成书的目录
innodb 引擎在创建表的时候 必须要有一个主键, 当你没有指定主键的时候:
1, 会将非空且唯一的字段自动升级为主键
2, 当你的表中没有任何的约束条件的时候 innodb 会采用自己的内部默认的一个主键字段, 该主键字段你在查询的时候是无法使用的, 查询数据的速度就会变得很慢, 就好像是一页一页翻书
通常每张表都应该有一个 id 字段, 并且应该将 id 设置为表的主键字段
联合主键: 多个字段联合起来作为表的一个主键, 本质还是一个主键!!!
ps:innodb 引擎中一张表有且只有一个主键
auto_increment: 自动递增
delete from : 仅仅是删除数据没 不会重置主键
truncate: 初始化表 会重置主键
来源: https://www.cnblogs.com/tulintao/p/11380641.html