Mysql

Mysql

零.学习资源

黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili

一.SQL

1. 基本语法

  • SQL可以单行或者多行书写,分号结尾
  • 可以使用空格或者缩进
  • SQL语句不区分大小写
  • 单行注释:--# 多行注释 /* */
  1. DDL(定义数据对象)
  2. DML(对数据进行增删改)
  3. DQL(查询数据)
  4. 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 分组后过滤条件]

wherehaving的区别

  • 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;

多表关系

  1. 一对一:在任意一方加入外键,关联另一方的主键,并设置外键为唯一的
  2. 多对多:建立第三张中间表,中间表至少包含两个外键,分别关联双方主键
  3. 多对一:在多的一方建立外键,指向一的一方的主键

多表查询

连接查询

  1. 内连接:查询$A$,$B$ 交集
  2. 外连接: 左外连接:查询$A$所有数据,以及两张表交集 右外连接:查询$B$所有数据,以及两张表交集
  3. 自连接:当前表与自身的连接查询,需要使用表别名

内连接

隐式

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);
  1. 标量子查询(子查询返回结果只返回一列一行,即一个值)
  2. 列子查询(结果为一列)
  3. 行子查询(结果为一行)
  4. 表子查询(结果为多行多列)

2.事务

事务是一组操作的集合,是一个不可分割的工作单位,会把所有的操作作为一个整体向系统提交或撤销

事务操作

查看/设置事务提交方式

select @@autocommmit
-- 结果是1则为自动提交
set @@autocommit=0;

提交事务

commit;

回滚事务

rollback;

开启事务

start transaction  begin;

事务的四大特性ACID

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

事务并发问题

  1. 脏读
  2. 不可重复读
  3. 幻读

事务隔离级别

  1. read uncommited 脏读,不可重复读,幻读
  2. read commited 不可重复读,幻读
  3. repeatable read 幻读
  4. serializable 无
select @@transaction_isolation;
set [seesion|global] transaction isolation level [事务隔离级别]

事务级别越高数据越安全,性能越低

二.存储引擎

create table tb_name(
	字段1 字段1类型 
)engine=innodb

show engines;