目录
基本操作
database操作
登录MYSQL(终端输入)
mysql -h 主机地址 -u 用户 -p 密码
mysq -u root -p
创建数据库
create database if not exists db_name [create_specification];
显示所有数据库
show databases;
使用数据库
use db_name;
显示创建数据库语句
show create database db_name \G;
修改数据库
alter database db_name [alter_spacification];
删除数据库
drop database if exists db_name;
导出数据库
mysqldump -p3306 -u root -p -B db_name > file_path;
导入数据库
source file_path;
table操作
创建一张表
create table if no exists table_name(
field1 datatype,
field2 datatype
);
展示当前数据库所有表
show tables;
查看表结构
desc table_name;
显示创建表的语句
show create table table_name \G;
修改表名
alter table table_name rename to new_table_name;
修改列
alter table table_name modify col datatype;
删除列
alter table table_name drop col;
在col1后面添加col2列
alter table table_name add col2 datatype after col1;
删除表
drop table if exists tb_name;
数据类型
在mysql中向特定类型插入不合法数据,会被直接截断<==>能插入mysql的数据一定是合法的。
数据类型本身也是一种约束,约束使用者合法插入数据。
INT类型
类型 | 字节 | 最小值 | 最大值 |
tinyint | 1 | - 2^7 | 2^7 - 1 |
tinyint unsigned | 1 | 0 | 2^8 - 1 |
smallint | 2 | - 2^15 | 2^15 - 1 |
smallint unsigned | 2 | 0 | 2^16 - 1 |
mediumint | 3 | - 2^23 | 2^23 - 1 |
mediumint unsigned | 3 | 0 | 2^24 - 1 |
int | 4 | - 2^31 | 2^31 - 1 |
int unsigned | 4 | 0 | 2^32 - 1 |
bigint | 8 | - 2^63 | 2^63 - 1 |
bigint unsigned | 8 | 0 | 2^64 - 1 |
bit类型
bit(M)
M表示每个数据所占用的比特数,范围从1到64。
如果M被忽略,默认为1。
FLOAT类型
float[(m, d)] [unsigned]
m指定显示长度(整数位+小数位)
d指定小数位数
占用4字节
decimal(m, d) [unsigned]
m指定显示长度(整数位+小数位)
d指定小数位数
占用16字节
相较于float会更加精确
CHAR类型
char(L)
固定长度字符串
L表示字符长度,单位为字符,不是字节
L范围为1到255,默认为1
varchar(L)
可变长度字符串
L表示字符长度,单位为字符,不是字节
L范围为1到255,默认为65535
varchar会自动节省没有用上的空间,但管理消耗更大。
总结:手机号,身份证号等固定长度用char(L),其他使用varchar(L)。
DATE类型
date
日期格式 'yyyy-mm-dd'
占用三字节
datetime
时间日期格式 'yyyy-mm-dd HH:ii:ss'
占用八字节
timestamp
时间戳格式 'yyyy-mm-dd HH:ii:ss'
占用四字节
在插入数据时,timestamp列会自动更新
SEL类型
enum(opt1, opt2, opt3,...);
枚举单选
下标从1开始
set(opt1, opt2, opt3,...);
集合多选
每个选项有1个比特位标志状态
find_in_set(opt,field);
将field列中数据包含opt选项的行筛选出来
表的约束
create table table_name (
field1 datatype [列约束],
field2 datatype [列约束],
...
[表约束]
);
列约束
NULL
null
默认选项
可以为空,表示此列选填
not null
不可为空,表示此列必填
field datatype not null,
DEFAULT
defult
就是cpp的缺省值,备胎
field datatype default data,
not null 与default 功能并不重合或冲突,not null只管数据是否为空,default只有在用户不输入的时候才起作用。另外,在不设置default与not null时,系统自带default null,不显示。
PRIMARY KEY
primary key
用于约束某列数据,无法重复,无法为空
field datatype primary key,
去掉主键
alter table table_name drop primary key;
加上主键
alter table table_name add primary key(field);
在使用表前就应提前使用主键,之后再加主键会要求之前的所有数据数据不能重复或为null
复合主键
create table if no exists table_name(
field1 datatype1,
field2 datatype2,
primary key(field1,field2)
);
用于约束多列数据,无法所有列数据都完全重复,无法为空
常常配合主键列实现自动编号,一般该列无需用户主动填写
create table if no exists table_name(
field1 datatype1 primary key auto_increment,
field2 datatype2,
auto_increment = start_num;--赋予初始值
);
UNIQUE KEY
unique key
用于约束某列数据,无法重复,可以为空
field datatype unique key,
表约束
PRIMARY KEY
复合主键
create table if no exists table_name(
field1 datatype1,
field2 datatype2,
primary key(field1,field2)
);
用于约束多列数据,无法所有列数据都完全重复,无法为空
常常配合主键列实现自动编号,一般该列无需用户主动填写
create table if no exists table_name(
field1 datatype1 primary key auto_increment,
field2 datatype2,
auto_increment = start_num;--赋予初始值
);
FOREIGN KEY
foreign key
外键用于连接两个表,并确保数据的一致性和完整性。
保证数据关联正确:确保子表中的数据(如订单的客户ID)必须存在于父表中(如客户表的客户ID)。
自动处理相关数据:当父表(如客户表)中的记录被删除或更新时,子表(如订单表)中相关的记录可以自动删除或更新。
--主表
create table if no exists Mtable_name(
field1 datatype,
field2 datatype
);
--从表
create table if no exists Stable_name(
field3 datatype,
field4 datatype,
--外键约束
foreign key field3 references Mtable_name(field1)
);
--
其他补充
AUTO_INCREMENT
auto_increment
自增长
只能用于整数
配合主键列实现自动编号,一般该列无需用户主动填写
不填写默认填本列最大值加1
create table if no exists table_name(
field1 datatype1 primary key auto_increment,
field2 datatype2,
auto_increment = start_num;--赋予初始值
);
COMMENT
comment
注释,提高可读性,无实际作用
field datatype comment'注释',
ZEROFILL
zerofill
该列数据显示时会自动用0补到目标宽度L
field datatype(L) zerofill,
表的CRUD
Create 创建
create table 创建表
create table table_name(
field1 datatype,
field2 datatype,
);
复制一份表(只复制表的结构,不复制表的数据)
create table 表名2 like 表名1;
insert into 插入数据
insert into table_name (field1, field2) values(data1, data2);
Read 读取
select 列筛选
where 行筛选
order by 排序
asc升序(默认)
desc降序
order by 列名1 asc/desc, 列名2 asc/desc;
limit a 从第1行开始读a行数据
limit b,a 从第b + 1行开始读a行的数据
limit a offset b 从第b + 1行开始读a行的数据
这种写法表达更明确,推荐使用
limit的本质是辅助显示,并不是筛选
select distinct * from 表名;去重复值
Updata 更新
对查询到的结果进行列值更新
updata 表名 set 列名 = 数据 where子句
更新替换
on duplicate key update
replace into 表名 (列名1, 列名2) values(数据1, 数据2);
Delete 删除
delete from 表名 子句
truncate table 表名 截断表
完全初始化
自增id也重新置位
不走事务,直接清空
insert into 表名1 select * from 表名2 子句;
表格的重命名
rename table 旧表名 to 新表名;
聚合函数
count数量
sum总和
avg平均值
max最大值
min最小值
distinct 做前缀,去重
group by
分组查询
分组的目的是为了进行分组后,方便进行聚合统计
select 分组列名 需要分组统计的各项数据 from 表名 group by 分组列名 having 约束子句;
having相当于where,用来对聚合统计的最终结果进行条件筛选
having VS where
having对分组聚合后的结果进行条件筛选
where对具体的任意列进行条件筛选
导入表格
source 文件路径
内置函数
日期函数
字符串函数
数学函数
其他函数
查询当前用户
user()
md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串
database()显示当前正在使用的数据库
password()函数,MySQL数据库使用该函数对用户加密 varchar(41)
ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值
复合查找
笛卡尔积
取并集
union去重
union all不去重
alter table EMP add index(empno);
表的索引
MYSQL事务
启动事务
start transaction
begain启动事务,必须手动提交
存档点
savepoint point_name;
操作回滚
rollback;整体回滚
rollback to point_name;
MYSQL事务
事务开始
begin;
事务提交(提交后无法回滚)
commit;
创建保存点
savepoint sp_name;
回滚到指定保存点
rollback to sp_name;
回滚到begin
rollback;
查看当前自动提交模式
show variables like 'autocommit';
关闭自动提交模式
set autocommit = 0;
开启自动提交模式
set autocommit = 1;
自动提交模式只对单条sql起作用,对begin与commit圈起的多sql事务没作用
终止异常SQL,模拟客户端崩溃
crl + /
如果事务未commit,客户端崩溃时系统会自动回滚到begin
事务提交后将无法回滚
只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是否设置set autocommit无关。
事务可以手动回滚,同时,当操作异常,MySQL会自动回滚
对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交。(select有特殊情况,因为MySQL 有 MVCC )
查看全局隔离级别
select @@global.tx_isolation;
查看会话隔离级别
select @@session.tx_isolation;
会话隔离级别只在当次会话有效,没次会话启动时会用全级隔离级别初始化会话隔离级别
设置隔离级别
set [session | global] transaction isolation level [read uncommitted | read committed |
repeatable read | serializable]
隔离级别
读未提交【Read Uncommitted】
未提交就可以读到数据
读提交【Read Committed】
提交了才可以读到数据
可重复读【Repeatable Read】(系统默认)
一次事务前后读到的数据保持一致
串行化【Serializable】
读操作不加锁,写的时候不能有其他人读或写,先开的事务先运行完。等待时间过长事务自动回滚关闭。
MYSQL视图
create view v_table_name as select field from table_name [where 筛选语句];
create view v_name as (select_table);
视图与基表修改数据会相互影响
删除视图
drop view v_name
视图不能添加索引
review是事务可见性的一个类,不是事务创建出来就有的,而是这个事务首次快照读的时候才形成