Mysql
Mysql
零.学习资源
黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili
一.SQL
1. 基本语法
- SQL可以单行或者多行书写,分号结尾
- 可以使用空格或者缩进
- SQL语句不区分大小写
- 单行注释:
--或#多行注释/* */
- DDL(定义数据对象)
- DML(对数据进行增删改)
- DQL(查询数据)
- DCL(控制用户访问权限)
2.基本数据类型
tinyint #1byte
smallint #2bytes
mediumint #3bytes
int或integer #4bytes
bigint #5bytes
float #4bytes
double #8bytes
decimal #精确小数点
#blob描述二进制文件
#text描述文本文件
char #定长字符串 char(10) 性能好
varchar #变长字符串 varchar(10)
tinyblob
tinytxt
blob #65535bytes
text
mediumblob
mediumtxt
longblob
longtxt #4294967295bytes 极大文本数据
date #1000-01-01 ~ 9999-12-31
time # -030:59:59 ~ 030:59:59
year #1901 ~ 2155
datetime #1010-01-01 00:00:00
timestamp #时间戳
3.DDL
是否加[]是可选的
show databases;
select database(); #查询当前数据库
create database [if not exists] db_name [default charset 字符集] [collate 排序规则];
drop database [if exists] db_name; #删除数据库
use db_name;# 进入数据库
truncate table tb_name #删除指定表,并重新创建该表
show tables; #查看当前数据库的表
desc tb_name; #查询表结构
show create table tb_name; #查询指定表的建表语句
craete table tb_name(
字段1 字段1类型 [comment 字段1注释]
字段2 字段2类型 [comment 字段2注释]
字段3 字段3类型 [comment 字段3注释]
)[comment 表注释];
alter table tb_name add 字段名 类型 [comment 注释] [约束];#添加字段
alter table tb_name modify 字段名 新类型; #修改字段数据类型
alter table tb_name change 旧字段名 新字段名 类型 [comment 注释] [约束];#修改字段名和字段类型
alter table tb_name drop 字段名 #删除字段
alter table tb_name rename to 新表名 #修改表名
4.DML
insert into tb_name (字段名1,字段名2,..) values (值1,值2...);
insert into tb_name values (值1,值2...);# 顺序和字段顺序相同|插入一个记录
insert into tb_name values (值1,值2...),(值1,值2..)..;#插入多个记录
update tb_name set 字段名1=值1,字段名2=值2,...[where 条件]; #修改字段值
delete from tb_name [where 条件];
5.DQL
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
select 字段1,字段2... from tb_name;
select * from tb_name;
select 字段1 [as 别名1] ,字段2 [as 别名2] from tb_name;
select distinct 字段列表 from tb_name; #去除重复字段
where +条件
<,>,<=,=,!=.....
in(....) 在in后的列表中的值,多选一
like 占位符(_,%)
is null
between.. and ..
and &&
or ||
not !
聚合函数
将一列数据作为一个整体,进行计算
count #统计数量
max
min
avg
sum
select 聚合函数(字段) from tb_name;
null值不参与聚合函数的运算
分组查询
select 字段列表 from tb_name [where 条件] group by 分组字段名 [having 分组后过滤条件]
where 和 having的区别
where在分组之前过滤,having是分组后过滤where不能对聚合函数判断,having可以
一般查询的是聚合字段和分组字段,其他字段无意义
排序查询
select 字段列表 from tb_name order by 字段1 排序方式,字段2 排序方式
asc 升序(默认) ,desc 降序
如果第一个字段相同,才会按照第二个字段排序
分页查询
select 字段列表 from tb_name limit 起始索引,查询记录数
起始索引从$0$开始. 分页在不同数据库中有不同实现
执行顺序
from
表名
where
条件列表
group by
分组字段列表
having
分组后条件列表
select
字段列表
order by
排序字段列表
limit
分页参数
6.DCL
查询用户
use mysql;
select * from user;
创建用户
create user '用户名'@'主机名' identified by '密码'
alter user '用户名'@'主机名' identified with mysql_natvie_password by '密码' #修改密码
drop user '用户名'@'主机名' # 删除用户
权限控制
#常见权限
all
select
insert
update
delete
alter
drop
create
show grants for '用户名'@'主机名'; #查询权限
grant 权限列表 on 数据库名.tb_name to '用户名'@'主机名' #授予权限
revoke 权限列表 on 数据库名.tb_name from '用户名'@'主机名' #撤销权限
函数
字符串函数
concat(s1,s2,...,sn) #将s1,s2..sn拼接成一个字符串
lower(str)
uppper(str)
lpad(str,n,pad) #左填充
rpad(str,n,pad)
trim(str) #去掉字符串头部和尾部的空格
substring(str,start,len)
数值函数
ceil(x)
floor(x)
mod(x,y)
rand() #返回0~1的随机小数
round(x,y) # 求x的四舍五入值,保留y位小数
日期函数
curdate()
curtime()
now() #返回当前日期和时间
year(date)
month(date)
day(date)
date_add(date,interval expr type) #往后推expr个type时间
datediff(date1,date2) # date1-date2
流程函数
if(value,t,f) #如果value是true,返回t,否则返回f
ifnull(v1,v2) #如果v1不为空返回v1,否则返回v2
case when [val1] then [res1] ..else [defalut] end #如果val1为真,返回res1...,否则返回default
case [expr] when [val1] then [res1] ...else [default] end #如果expr =val1,返回res1...,否则返回default
约束
约束是作用于表中字段上的规则,用于限制存储在表中的数据
not null #限制该字段的数据不能是null
unique #保证该字段的所有数据都是唯一的
primary key #一行数据的唯一标识,要求非空且唯一
default #如果未指定该字段的值,则使用默认值
check #保证字段值满足某一个条件
foreign key #用于让两张表的数据建立联系,保持数据的一致性和完整性
外键约束
create table tb_name{
字段名 数据类型
..
[constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
}
alter table tb_name add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名);
--删除外键
alter table tb_name drop foreign key 外键名称;
外键的更新
no action --当在父表更新对应记录时,先检查该记录是否有外键,如果有则不允许更新
restrict
cascade --当在父表删除/更新对应记录时,先检查该记录是否有外键,如果有删除/更新子表中的记录
set null --当在父表更新对应记录时,先检查该记录是否有外键,如果有则设置子表该外键值为null
set default --父表变更时,子表将外键设置成一个默认值(innodb不支持)
alter table tb_name add constraint 外键名称 foreign key (外键名称) references 主表名 (主表字段名) on update cascade on delete cascade;
多表关系
- 一对一:在任意一方加入外键,关联另一方的主键,并设置外键为唯一的
- 多对多:建立第三张中间表,中间表至少包含两个外键,分别关联双方主键
- 多对一:在多的一方建立外键,指向一的一方的主键
多表查询
连接查询
- 内连接:查询$A$,$B$ 交集
- 外连接: 左外连接:查询$A$所有数据,以及两张表交集 右外连接:查询$B$所有数据,以及两张表交集
- 自连接:当前表与自身的连接查询,需要使用表别名
内连接
隐式
select 字段列表 from 表1 , 表2 where 条件
显式
select 字段列表 from 表1 [inner] join 表2 on 连接条件
外连接
左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件
右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件
自连接
select 字段列表 from 表A 别名A join 表A 别名B on 条件
联合查询-union/union all
把多次查询的结果合并,形成一个新的查询结果集
select 字段列表 from a..
union [all]
select 字段列表 from b..
如果想去重 ,使用union而非 union all
条件:查询的字段列表需要相同
子查询
sql语句中嵌套select语句
select * from t1 where column1 = (select column1 from t2);
- 标量子查询(子查询返回结果只返回一列一行,即一个值)
- 列子查询(结果为一列)
- 行子查询(结果为一行)
- 表子查询(结果为多行多列)
2.事务
事务是一组操作的集合,是一个不可分割的工作单位,会把所有的操作作为一个整体向系统提交或撤销
事务操作
查看/设置事务提交方式
select @@autocommmit
-- 结果是1则为自动提交
set @@autocommit=0;
提交事务
commit;
回滚事务
rollback;
开启事务
start transaction 或 begin;
事务的四大特性ACID
- 原子性
- 一致性
- 隔离性
- 持久性
事务并发问题
- 脏读
- 不可重复读
- 幻读
事务隔离级别
- read uncommited 脏读,不可重复读,幻读
- read commited 不可重复读,幻读
- repeatable read 幻读
- serializable 无
select @@transaction_isolation;
set [seesion|global] transaction isolation level [事务隔离级别]
事务级别越高数据越安全,性能越低
二.存储引擎
create table tb_name(
字段1 字段1类型
)engine=innodb
show engines;