查询所有数据库
show databases
查询当前数据库
select database()
创建数据库
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]
# 例 创建名称为newdb默认字符集为utf8mb4的数据库
create database if not exists newdb default charset utf8mb4
删除数据库
drop database [if exists] 数据库名
# 例 删除名称为newdb的数据库
drop database if exists newdb
使用数据库
use 数据库名
# 例
use testdb
查询当前数据库所有表
show tables
查询表结构
desc 表名
# 例 查询t_table的表结构
desc t_table
查询指定表的建表语句
show create table 表名
# 例 查看t_table的建表语句
show create table t_table
创建表 (字段类型参照文末表格 约束列表参考文末约束表)
create table 表名(
字段1 字段1类型 约束列表 [comment 字段1注释],
字段2 字段2类型 约束列表 [comment 字段2注释],
...
字段n 字段n类型 约束列表 [comment 字段n注释]
)[comment 表注释];
# 例 创建一个用户表
create table z_user(
id int primary key auto_increment comment '主键',
name varchar(10) not null unique comment '姓名',
age int check (age > 0 && age <=120) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
) comment '用户表';
表中添加字段
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束]
修改表中字段数据类型
alter table 表名 modify 字段名 新数据类型(长度)
修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束]
修改表名
alter table 表名 rename to 新表名
添加外键字段
alter 表名 add constraint 外键名称 foreign key (外键字段) references 主表名(主表字段名) onupdate cascade on delete cascade
删除表中字段
alter table 表名 drop 字段名
删除表
drop table [if exists] 表名
DML英文全称是Data Manipulation Lanage(数据操作语言),用来对数据库中表的数据记录进行增删改的操作
给指定字段添加数据
insert into 表名(字段名1, 字段名2, ...) values(值1, 值2, ...)
给全部字段添加数据
# 所有字段的值都必须写
insert into 表名 values(值1, 值2, ...)
批量增加数据
insert into 表名(字段1, 字段2, ...) values(值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...)
# 所有字段的值都必须写
insert into 表名 values(值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...)
修改数据
# 条件不写表示修改表中所有数据
update 表名 set 字段名1 = 值1, 字段名2 = 值2, ... [where 条件]
删除数据
# 条件不写表示删除表中所有数据
delete from 表名 [where 条件]
DQL英文全称是Data Query Language (数据查询语言),用来查询数据库中表的记录
查询语法
// 执行顺序 from -> where -> group by -> having -> select -> order by -> limit
select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数
查询多个字段
select 字段1, 字段2, ... from 表名
select * from 表名
设置别名
select 字段1 [as 别名1], 字段2 [as 别名2], ... from 表名
去除重复记录
select distinct 字段列表 from 表名
条件查询 where 运算符参考文末运算符表
select 字段列表 from 表名 where 条件列表
聚合函数查询 常用聚合函数参考聚合函数表
# 注意 null值不参与聚合函数运算
select 聚合函数(字段列表) from 表名
分组查询
// where 与 having区别
// where是分组之前执行,不满足不参与分组,having分组之后对结果进行过滤
// where不能对聚合函数进行判断,having可以
// 执行顺序 where > 分组函数 > having
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]
排序查询
// ASC 升序(默认) DESC 降序
// 如果多字段排序,当第一个字段相同时,才会根据第二个字段进行排序
select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2
分页查询
// 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
// 分页查询是数据库的方言, 不同的数据库有不同的实现
// 如果查询的是第一页数据,起始索引可以省略
select 字段列表 from 表名 limit 起始索引, 查询记录数
DCL英文全称是Data Control Language (数据控制语言),用来管理数据库用户、控制数据库的访问权限
查询用户
// 所有用户信息都是存在mysql数据库中的user表中
use mysql;
select * from user
创建用户
// 用户名用%表示可以访问任意主机
create user '用户名'@'主机名' identified by '密码'
修改用户密码
alter user '用户名'@'主机名' identified with mysql_naive_password by '新密码'
删除用户
drop user '用户名'@'主机名'
查询用户权限
show grants for '用户名'@'主机名'
授予权限 参考文末常用权限列表
// 多个权限使用逗号分隔
// 授权时,数据库名和表名可以使用*代表所有
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'
撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'
concat(s1, s2, s3…) 字符串拼接,将s1, s2, s3 … 拼接成一个字符串
select concat('hello ', 'mysql') # hello mysql
lower(str) 将字符串全部转为小写
select lower('hhhh') # HHHH
upper(str) 全部转为大写
select upper('HHHH') # hhhh
lpad(str, n, pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
select lpad('hh', 5, '~') # ~~~hh
rpad(str, n, pad) 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
select rpad('hh', 5, '~') # hh~~~
trim(str) 去掉字符串头部和尾部的空格
select trim(' hello ') # hello
substring(str, start, len) 返回字符串从start开始的len个长度的字符串
select substring('hello mysql', 1, 5) # hello
ceil(x) 向上取整
select ceil(1.5) # 2
select ceil(1.1) # 2
floor(x) 向下取整
select floor(1.5) # 1
select floor(1.1) # 1
mod(x, y) 返回x/y的模
select mod(3, 4) # 3%4 = 3
rand() 返回0~1内的随机值
select rand()
round(x, y) 求参数x的四舍五入的值,保留y位小数
select round(2.345, 2) # 2.35
curdate() 返回当前日期
select curdate()
curtime() 返回当前日期
select curtime()
now() 返回当前日期和时间
select now()
year(date) 获取指定date的年份
select year('2023-02-10') # 2023
month(date) 获取指定date的月份
select month('2023-02-10') # 2
day(date) 获取指定date的日期
select day('2023-02-10') # 10
date_add(date, INTERVAL expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值
select date_add('2023-02-10', INTERVAL 70 DAY) # 2023-04-21
datediff(date1, date2) 返回起始时间date1和结束时间date2之间的天数
select datediff('2023-02-10', '2023-03-10') # -28
if(value, t, f) 如果value为true,则返回t,否则返回f
select if(true, 'a', 'b') # a
ifnull(value1, value2) 如果value1不为空,返回value1,否则返回value2
select ifnull(null, 'a') # a
select ifnull('b', 'a') # b
select ifnull('', 'a') # ''
case when [val] then [res1] … else [default] end 如果val1为true,返回res1,… 否则返回default默认值
# 查询emp表中的员工姓名和工作地址(北京/上海 ----> 一线城市, 其他 ------> 二线城市)
select name, (case address when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址' from emp
case [expr] when [val1] then [res1] … else [default] end 如果expr的值等于val1,返回res1,否则返回default默认值
# 分数>=85 展示优秀 >=60 展示及格 否则不及格
select id, name, (case when math >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) as '数学' from score
隐式内连接查询
select 字段列表 from 表1, 表2 where 条件...
# 例 查询每一个员工的姓名,及关联的部门的名称
select emp.name, dept.name from emp, dept where emp.dept_id = dept.id
// 给表起别名,这是就不能使用表名了,只能使用别名
select e.name, d.name from emp e, dept d where e.dept_id = d.id
显示内连接查询
select 字段列表 from 表1 [inner] join 表2 on 连接条件...
# 例 查询每一个员工的姓名,及关联的部门的名称
select e.name, d.name from emp e join dept d on e.dept_id = d.id
左外连接查询
# 相当于查询表1的全部数据 包含表1和表2交集部分的数据
select 字段列表 from 表1 left [outer] join 表2 on 条件...
右外连接查询
# 相当于查询表2的全部数据 包含表1和表2交集部分的数据
select 字段列表 from 表1 right [outer] join 表2 on 条件...
自连接查询
# 相当于查询表2的全部数据 包含表1和表2交集部分的数据
select 字段列表 from 表1 别名A join 表1 别名B on 条件...
自连接查询
# 把多次查询的结果合并形成新的查询结果集 加上all直接合并,不加会对结果进行去重
# 对于联合查询的多张表列数必须保持一致,字段类型也需保持一致
select 字段列表 from 表1... union [all] select 字段列表 from 表2...
常用操作符
in # 在指定的集合范围之内,多选一
not in # 不在指定的集合范围内
any # 子查询返回列表中,有任意一个满足即可
some # 与any相同,使用some的地方都可以使用any
all # 子查询返回列表中的所有值都必须满足
查询当前提交方式
# 1 自动提交 0 手动提交
select @@autocommit
设置提交方式
set @@autocommit = 0 # 手动提交
开启事务
start transaction 或 begin
提交事务
commit
回滚事务
rollback
查看事务隔离级别 (隔离级别参照文末事务隔离级别表)
select @@transaction_isolation
设置事务隔离级别
# session 当前窗口有效 global 全局有效
set [session|global] transaction isolation level 隔离级别
原子性(Atomicity) 事务是不可分割的最小操作单元,要么全部成功,要么全部失败
一致性(Consistency) 事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation) 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(Durability) 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
脏读:一个事务读取到另一个事务还没有提交的数据
不可重复读: 一个事务先后读取同一条记录,但两次读取的数据不同
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现已经存在了
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | 会发生 | 会发生 | 会发生 |
read committed | 不会发生 | 会发生 | 会发生 |
repeatable Read(默认) | 不会发生 | 不会发生 | 会发生 |
serializable | 不会发生 | 不会发生 | 不会发生 |
类型 | 大小 (byte) | 描述 |
---|---|---|
tinyint | 1 | 小整数值 |
smallint | 2 | 大整数值 |
mediumint | 3 | 大整数值 |
int或integer | 4 | 大整数值 |
bigint | 8 | 极大整数值 |
float | 4 | 单精度浮点数值 |
double | 8 | 双精度浮点数值 |
decimal | 小数值 (精确点数) | |
char | 0-255 | 定长字符串 |
varchar | 0-65535 | 变长字符串 |
tinyblob | 0-255 | 不超过255个字符的二进制数据 |
tinytext | 0-255 | 短文本字符串 |
blob | 0-65 535 | 二进制形式的长文本数据 |
text | 0-65 535 | 长文本数据 |
mediumblob | 0-16 777 215 | 二进制形式的中等长文本数据 |
mediumtext | 0-16 777 215 | 中等长文本数据 |
longblob | 0-4 294 967 295 | 二进制形式的极大文本数据 |
longtext | 0-4 294 967 295 | 极大文本数据 |
date | 0-4 294 967 295 | YYYY-MM-DD |
time | 0-4 294 967 295 | HH:MM:SS |
year | 0-4 294 967 295 | YYYY |
datetime | 0-4 294 967 295 | YYYY-MM-DD HH:MM:SS |
timestamp | 0-4 294 967 295 | YYYY-MM-DD HH:MM:SS(时间戳) |
运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between … and … | 在某个范围之内 |
in(…) | 在in之后的列表中的值,多选一 |
like 占位符 | 模糊匹配 (_匹配单个字符,%匹配任意个字符) |
is null | 是null |
and 或 && | 并且 (多个条件同时成立) |
or 或 || | 或 (多个条件有一个成立) |
not 或 ! | 非,不是 |
运算符 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
权限 | 说明 |
---|---|
all, all privileges | 所有权限 |
select | 查询数据 |
insert | 插入数据 |
update | 修改数据 |
delete | 删除数据 |
alter | 修改表 |
drop | 删除表/数据库库/视图 |
create | 创建数据库/表 |
约束 | 说明 | 关键字 |
---|---|---|
非空约束 | 限制该字段数据不能为空 | not null |
唯一约束 | 该字段数据不能重复 | unique |
主键约束 | 主键是一行数据的唯一标识,非空唯一 | primary key |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | default |
检查约束 | 保证字段值满足某一个条件 | check |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | foreign key |
自增约束 | 插入时不用管该字段,会自动增长 | auto_increment |
行为 | 说明 |
---|---|
no action | 不允许删除/更新 |
restrict | 不允许删除/更新 |
cascade | 同样删除/更新外键所在表中的数据 |
set null | 删除子表中的数据时,当前表的外键被设置为null |