SQL
DDL
#如果不存在则创建数据库
create database if not exists user default charset utf8mb4 collate utf8mb4_general_ci;
#查看所有数据库
show databases;
#使用数据库
use user;
#查看当前使用的是哪个数据库
select database();
#创建表
create table users (
id int,
name varchar(20) comment '年龄',
age int,
birth datetime
);
#查看所有表
show tables;
#查看创建表的语句
show create table user;
#查看表结构
desc user;
#添加新的字段
alter table user add email varchar(30);
#修改字段的数据类型
alter table user modify age tinyint unsigned comment '年龄';
#修改字段名和字段的数据类型
alter table user change birth birthday date comment '生日';
#删除字段
alter table user drop email;
#重命名表名
alter table user rename to user;
#截断表
truncate table user;
#如果存在则删除表
drop table if exists user;
#删库跑路
drop database if exists user;
DML
#给指定字段添加数据
insert into 表名(字段名1, 字段名2) values(值1, 值2, ...);
#给全部字段添加数据
insert into 表名 values(值1, 值2, ...);
#给指定字段添加多条数据
insert into 表名(字段名1, 字段名2) values(值1, 值2, ...),(值1, 值2, ...);
#添加多条数据
insert into 表名 values(值1, 值2, ...),(值1, 值2, ...);
#修改数据
update 表名 set 字段名1 = 值1, 字段名2 = 值2, ... [where 条件];
#删除数据
delete from 表名 [where 条件];
DQL
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
#查询多个字段
select 字段1, 字段2, ... from 表名;
select * from 表名;
#设置别名
select 字段1 [as 别名1] from 表名;
#去除重复记录
select distinct 字段列表 from 表名;
select * from user where name like "王%";
select * from user where name like "__";
select * from user where name is null;
select * from user where age in (20, 21, 22);
select * from user where age between 20 and 22;
select count(*) from sc;
select max(score) from sc;
select min(score) from sc;
select avg(score) from sc;
select sum(score) from sc;
select gender, count(*) from emp group by gender;
select gender, avg(age) from emp group by gender;
select workaddress, count(*) from emp where age < 30 group by workaddress;
select workaddress, count(*) num from emp where age < 30 group by workaddress having num >= 3;
select * from emp order by age [asc];
select * from emp order by age desc;
select * from emp order by age desc, entrydate desc;
#查询前10条记录
select * from emp limit [0,] 10;
#查询索引从3开始的10条记录
select * from emp limit 3, 10;
DCL
use mysql;
#查询所有用户
select * from user;
#创建用户
create user 'tao'@'localhost' identified by '123456';
create user 'test'@'%' identified by 'test';
#修改用户密码
alter user 'test'@'%' identified with mysql_native_password by '123456';
#删除用户
drop user 'test'@'%';
#查询用户的权限
show grants for '用户名'@'主机名';
#授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
#撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
函数
字符串函数
函数 |
功能 |
concat(s1, s2, …, sn) |
字符串拼接,将所有字符串拼接成一个字符串 |
lower(s) |
将字符串s全部转成小写 |
upper(s) |
将字符串s全部转成大写 |
lpad(s, n, pad) |
左填充,用字符串pad对s的左边进行填充,达到n个字符串长度 |
rpad(s, n, pad) |
右填充,用字符串pad对s的右边进行填充,达到n个字符串长度 |
trim(s) |
去掉字符串s头部和尾部的空格 |
substring(s, start, len) |
返回字符串s从start位置开始长度为len的字符串 |
数值函数
函数 |
功能 |
ceil(x) |
向上取整 |
floor(x) |
向下取整 |
mod(x, y) |
返回x/y的模 |
rand() |
返回0~1的随机数 |
round(x, y) |
求参数x的四舍五入的值,保留y位小数 |
日期函数
函数 |
功能 |
curdate() |
返回当前日期 |
curtime() |
返回当前时间 |
now() |
返回当前日期和时间 |
year(date) |
获取指定date的年份 |
month(date) |
获取指定date的月份 |
day(date) |
获取指定date的日期 |
date_add(date, interval expr type) |
返回一个日期/时间值加上一个时间间隔expr后的时间值 |
datediff(date1, date2) |
返回起始时间date1和结束时间date2之间的天数 |
流程函数
函数 |
功能 |
if(value, t, f) |
如果value为true,返回t,否则返回f |
ifnull(value1, value2) |
如果value不为null,返回value1,否则返回value2 |
case when [val1] then [res1] …else [default] end |
如果val1为true,返回res1,否则返回default |
case [expr] when [val1] then [res1] …else [default] end |
如果expr的值为val1,返回res1,否则返回会default |
约束
约束 |
描述 |
关键字 |
非空约束 |
限制该字段的数据不能为null |
not null |
唯一约束 |
保证该字段的所有数据都是唯一、不重复的 |
unique |
主键约束 |
主键是一行数据的唯一标识,要求非空且唯一 |
primary key |
默认约束 |
保存数据时,如果未指定该字段的值,则采用默认值 |
default |
检查约束(8.0.16以后) |
保证字段值满足某一个条件 |
check |
外键约束 |
用来让两张表的数据之间建立连接,保证数据的一致性和完整性 |
foreign key |
create table user (
id int primary key auto_increment comment '主键',
name varchar(10) not null unique,
age int check (age > 0 && age <= 120),
status char(1) default '1',
gender char(1)
);
#添加外键
create table 表名 (
字段名 数据类型
[constraint] [外键名称] foreign key (外键字段名) referemce 主表(主表列名)
);
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名);
#删除外键
alter table 表名 drop foreign key 外键名称;
#外键的更新和删除行为
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名) on update cascade on delete cascade;
多表查询
内连接
#隐式内连接
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 表1 别名1 join 表2 别名2 on 连接条件 ...;
联合查询
#union会对合并后的数据进行去重,而union all不会
select 字段列表 from 表1 ...
union [all]
select 字段列表 from 表2 ...;
子查询
select * from t1 where column1 = (select column1 from t2);
#标量子查询
select * from emp where dept_id = (select id from dept where name = '研发部');
列子查询
操作符 |
描述 |
in |
在指定集合范围内,多选一 |
not in |
不再指定集合范围内 |
any |
子查询返回列表中,有任意一个条件满足即可 |
some |
与any相同,使用some的地方都可以用any |
all |
子查询返回的列表的所有值都必须满足 |
select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name = '研发部'));
行子查询
select * from emp where (salary, managerid) = (select salary, managerid from emp where name = '小明');
表子查询
select * from emp where (job, salary) in (select job, salary from emp where name = '小明' or name = '小红');
事务
事务开启方式
#查看事务提交方式
select @@autocommit;
#设置事务提交方式
set @@autocommit = 0;
#提交事务
commit;
#回滚事务
rollback;
#开启事务
start transaction;
begin;
事务的四大特性
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability)︰事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事务问题
问题 |
描述 |
脏读 |
一个事务读到另外一个事务还没有提交的数据 |
不可重复读 |
一个事务先后读取到一条记录,但两次读取的数据不同 |
幻读 |
一个事务按照条件查询数据时,没有对应的行,但是在插入数据时,又发现这行数据已经存在 |
事务隔离级别
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交 |
√ |
√ |
√ |
读已提交 |
× |
√ |
√ |
可重复读(默认) |
× |
× |
√ |
串行化 |
× |
× |
× |
#查询事务隔离级别
select @@transaction_isolation;
#设置事务隔离级别
set [session|global] transaction isolation level {read uncommitted|read committed|repeatable read|serializable};
发表评论