引擎和数据表文件:
数据库保存在 /var/lib/mysql/ 目录中。
每当创建一个数据库时, 会自动在 /var/lib/mysql/ 目录中 产生 同名的 目录。如:create database db2 ——> /var/lib/mysql/db2/
创建数据库时,如果没有指定数据库引擎,它选择默认引擎 —— innodb
在数据库中创建表:
innodb引擎:
表名.frm: 表的架构
表名.ibd: 表数据的 索引
对于该引擎,表数据是存放在 ../ibdata1 文件中,随着表个数、数据的增加,文件会自动增多: ibdata1、ibdata2、ibdata3.。。。
myisam引擎:
表名.frm: 表的架构
表名.MYD: 表数据
表名.MYI: 表数据索引
字符集:
在一次客户端访问MySQL数据库,执行语句过程中,至少保证 4 处 字符集一致:
1. 客户端选用的字符集。——> 影响 MySQL 客户端使用的字符集。 查看Linux系统字符集:echo 命令查看: echo 2
2. 客户端连接服务器时采用的字符集。
3. 数据库创建时采用的字符集。
4. 数据库返回结果时选用的字符集。
查看当前MySQL数据库字符集相关:
show variables like 'char%';
使用 set names 字符集。 一次性设置 character_set_client 、character_set_database、character_set_results
使用 set character_set_server = utf8 。 临时设置 字符集。 数据库登录退出,即失效。持久化生效修改配置文件: /etc/mysql/mysql.conf.d/mysqld.cnf
环境变量:
终端下,使用 env 可以查看所有环境变量列表。_ Linux
echo $PATH (key=value:value:value...)
echo $LANG
echo $HOME
每个进程,内部存储着当前进程自己的环境变量。
数值类型:
有符号 无符号数(unsigned)
tinyint : 1 字节 -2^7~2^7-1 0~2^8-1
smallint: 2 字节 -2^15 ~ 2^15-1 0~2^16-1
mediumint:3字节
int 4 字节
bigint 8 字节
数值类型使用时,可以指定显示宽度。—— 默认显示的位数 。id int(5)
如果想在结果集中查看的到:创建表时,指定 zerofill 。 id int(5)zerofill
数值类型使用时,数据类型决定取值范围。 insert 12345567 【正确】
浮点型:
float 单精度 4字节: -3.4E+38~3.4E+38
double 双精度 8字节: -1.8E+308~1.8E+308
声明语法:
float (总长度, 小数部分长度) double (总长度, 小数部分长度)
float(5, 3) double(5, 3)
create table t4(num1 float(5,3), num2 double(7, 3));
小数部分长度:如果超出(精度超出)。 进行 四舍五入。 insert 23.3467 ——> 23.347 、 insert 23.3461 ——> 23.346
整数部分长度超出:errror 报错。 insert 2345.3467 ——>ERROR 1264 (22003): Out of range value for
对于浮点数来说,允许在存储精度较高的数据时,有数据精度损失。
定点数据:
decimal 没有存储上限。
语法:decimal(总长度, 小数部分长度)
create table t6 ( num decimal(20,19));
存储本质:将小数部分、整数部分 分开存储以达到 没有精度损失的目的。但,会消耗存储空间。
字符类型:
定长字符串: char 255 使用时,指定的是 字符 数
指定 字符串长度上限,实际存储是,不会回收剩余空间。 效率高,浪费空间
变长字符串: varchar 65535 使用时,指定的字符数受限制:
指定 字符串长度上限,实际存储是,会回收剩余空间。效率低,节省空间
1. 受 表所选用的 字符集限制。 utf8: 1个字符 —— 3字节。 gbk :1字符 —— 2字节。
2. 受 一条记录的长度不能超过 65535.
字符文本:
tinytext:
text:
mediumtext:
longtext:
字符文本类型在实际存储数据时,不直接存数据内容,而存储的是指向数据内容的索引。大约占用 10 字节左右空间。
不会打破 一条记录不允许超出 65535
枚举类型:
语法: 字段名 enum(枚举值1, 枚举值2, 枚举值3 。。。)
每一个枚举值,对应一个数字,从 1 开始计数。
使用枚举的优点:
1)运算速度快
2)节省空间
3)限定了用户输入,保证数据完整性。
集合类型:
语法: 字段名 set(列举值1, 列举值2, 列举值3 。。。)
每一个列举值,对应一个数字,从 2^0 开始计数。 依次: 2^0, 2^1, 2^2 ....
使用集合的优点:
同上。
insert into t12 values(1, '烫头,抽烟,刷手机'); 【正确】
insert into t12 values(1, '烫头', '抽烟', '刷手机'); 【错误】
日期和时间:
datetime: 年-月-日 时:分:秒
年: 1-9999
月: 1-12
日:1-31
MySQL系统会自动帮助运算 、年(闰年)、月(不能超出12), 日。
date: 年-月-日
timestamp:时间戳。 采用绝对计时方式。 从 1970-1-1 00:00:00 ~ 2038年01月19日11:14:07 取值范围。
time: 时:分:秒 取值范围: -838:59:59 ~ 838:59:59
时:可以超过 24, 分、秒不允许超过 60
布尔类型:Boolean:
true —— 1
false —— 0
列属性:
空: nulll
非空: not null
默认值: default。
显示插入默认值: 对应域插入数据时,写入 default
隐式插入默认值: 对应域不插入数据。
自动增长:auto_increment
创建表时,指定字段具备自动增长属性:
create table表名(
id int(9) auto_increment primary key,
name char(10)
);
修改表,添加字段自动增长属性:
1) 创建一个不具备自动增长的表。
create table 表名(
id int(9) primary key,
name char(10)
);
2) 给表的 id 列添加自动增长 属性:
alter table 表名 change 旧字段名 新字段名 数据类型 auto_increment primary key
自动增长列的特性:
1) 字段从 1 开始,每次递增 1。 保证数据不重复。
2) 自动增长列必须是 数值类型。
3) 自动增长列必须是 主键。 (反之,主键不一定自动增长)
4) 可以使用 null 显示插入 自动增长值。
5) 删除的 自动增长值,不会重复使用。
主键: primary key
创建主键,方法1:
create table 表名(
id int(9) primary key,
name char(10)
);
创建主键,方法1:
create table 表名(
id int(9),
name char(10), # 较上一种方法,多添加一个‘,’
primary key(id)
);
创建组合主键:
create table 表名(
id int(9),
num tinyint,
name char(10),
primary key(id, num) # 借助id、num 两个域,创建一个主键。
);
修改表,添加主键, 方法1:
1) 创建一个不具备主键的表。
create table 表名(
id int(9),
name char(10)
);
2) 给表的 id 列添加主键:
alter table 表名 change 旧字段名 新字段名 数据类型 primary key
修改表,添加主键, 方法2:
alter table 表名 add primary key(id);
删除主键:
alter table 表名 drop primary key(id);
总结:
主键特性:
1) 非空、唯一。
2) 一张表只有一个主键。
主键的作用:
1) 保证数据完整性
2) 加快查询速度。
主键选择的原则:
1) 选择 一个字段做主键
2) 选择 修改较少的字段做主键
3) 选择 数值类型做主键。
唯一键: unique
创建唯一键, 方法1:
create table 表名(
id int(9),
name char(10) unique
);
创建唯一键, 方法2:
create table 表名(
id int(9),
name char(10) ,
unique(name)
);
创建组合唯一键,指定 键名:
create table t23(
id int,
name varchar(10),
email varchar(10),
unique `UQ_nameEmail` (name, email)
);
修改表属性,添加唯一:
alter table 表名 add unique(字段)。
查看唯一键:
show create table 表名\G 获取到唯一键的 键名
删除唯一键:
alter table 表名 drop index 唯一键的 键名;
唯一键特性:
1. 不允许重复。但是可以为空。
2. 一张表,可以有 多个唯一键。
注释:
单行:
#:
-- : -- 后要添加一个 “空格” 在添加注释内容。
多行:
/* xxxx */
create table t24(
id int, #这是单行注释
name varchar(10) -- 这也是单行注释
/*
这是
多行
注释
*/
);
数据完整性:
实体完整性、域完整性、引用完整性:
实体完整性缺失: 造成数据有歧义。
解决方法: 1) 添加主键 2)添加唯一键 3) 添加自动增长列。
域完整性缺失: 造成数据有歧义。
解决方法: 1) 数据类型约束 2)非空约束 3) 默认值。
外键约束:
1. 主表中没有的从表中不允许插入
2. 从表中有的,主表中不允许删除
3. 不能更改主表中的值而导致从表中的记录孤立存在。
4. 先删除从表,再删除主表
外键约束,创建方法:
语法: foreign key (从表的主键名) references 主表名 (主表的主键名)
创建主表:
create table stuinfo(
stuno char(4) PRIMARY KEY,
name VARCHAR(10) not null
);
创建从表:
create table stuinfo(
stuid char(4) PRIMARY KEY,
score int(10) not null,
foreign key (stuid) references stuinfo (stuno )
);
外键约束,修改表添加方法:
alter table 从表名 add foreign key (从表的主键名) references 主表名 (主表的主键名);
查看外键约束:
show craete table 从表名\G —— 外键名。
删除外键约束:
alter table 从表名 drop foreign key 外键名;
级联操作:
一般来说:主表删除的时候,从表置空(null)操作,主表更新的时候,从表级联(cascade)操作。
foreign key (stuno) references stuinfo(stuno) on delete set null on update cascade