SQL命令
分类
- DDL 数据定义语言 数据库的创建和删除、数据表的创建、删除和修改 关键字:create / drop / alter
- DML 数据操作语言 数据库表中数据的增删改
- DQL 数据查询语言 数据表中数据的查询
- DCL 数据控制语言 创建用户分配权限
- 事务
DDL
1. DDL 数据定义语言数据库的创建和删除、数据表的创建、删除和修改
· 库操作
1. 查看所有库:show databases
2. 创建数据库:create database if not exists 库名;
3. 删除数据库:drop database if exists 库名;
4. 查看数据库命令:show create database 库名;
· 表操作
1. 创建表:
create table if not exists 表名(
列名1 类型 【约束】,
列名2 类型 【约束】,
......
)
2. 查看表结构:desc 表名;
3. 删除表:drop table if exists 表名;
4. 表修改
① 修改表名:alter table 原表名 rename 新表名
② 修改列表:alter table 表名 change 【column】 原列名 新列名 类型 【约束】;
③ 修改列的类型:alter table 表名 modify 【column】 列名 新类型 【约束】;
④ 添加列:alter table 表名 add 【column】列名 类型 【约束】;
⑤ 删除列:alter table 表名 drop 【column】列名;
5. 约束操作
① 主键删除
alter table 表名 drop primary key; # 表级删除
alter table 表名 modify column 字段名 类型 ; # 列级删除
② 主键添加
alter table 表名 add primary key(列名);# 表级添加
alter table 表名 modify column 字段名 类型 primary key # 列级添加
③ 非空删除
alter table 表名 modify column 列名 类型 null;
④ 非空添加
alter table 表名 modify column 列名 类型 not null;
⑤ 默认删除
alter table 表名 modify column 列名 类型;
⑥ 默认添加
alter table 表名 modify column 列名 类型 default '';
⑦ 唯一删除
alter table 表名 drop index 列名;
⑧ 唯一添加
alter table 表名 add unique(列名); # 表级添加
alter table 表名 modify column 列名 类型 unique; # 列级添加
⑨ 外键添加
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(从表字段) REFERENCES 主表(主表主键);
⑩ 外键删除
ALTER TABLE stu DROP FOREIGN KEY 外键名;
ALTER TABLE stu DROP INDEX 外键名;
MySQL常见类型:
整型:tinyint/smallint/int/bigint
浮点型:double(n, m)/float(n, m)/decimal(n, m)
n 代表:整数和小数总位数
m 代表:小数的位数
字符型:
char(n) 定长字符串 n可以不写 默认1 性能高
varchar(n) 变长字符串 n必须写 最大长度 性能低
日期类型:
date 年月日
datetime 年月日 时分秒 8个字节 1900 ~ 9999
time 时分秒
timestamp 年月日 时分秒 4个字节 1970 ~ 2038
MySQL约束
约束是限制 表中数据的 一种要求
约束:
1. 默认约束 default '内容'
2. 非空约束 not null
3. 主键约束 primary key 唯一 不能为null 一个表有且仅有一个主键
4. 唯一约束 unique 唯一 可以为null null可以多个
5. 外键约束 建立两表之间的关系,一个表的某一列 来源于另一个表的主键值
DML
1. 增(插入)
语法:
insert into 表名(列名1, 列名2,...) values(值1, 值2,....)
insert into 表名(列名1, 列名2,...) values(值1, 值2,....),(值1, 值2,....),(值1, 值2,....)....
注意事项:
1. 列名和值要一一对应
2. 插入值的类型 匹配列名的类型
3. 整型 浮点型值可以不加引号,字符类型和日期类型 必须加引号
4. 不区分单双引号
5. 如果约束有默认约束和可以为空的列 值可以不写 对应列也不写
6. 如果表中所有列都给数据 列名可以省略不写
2. 删
语法:
delete from 表名 where 条件
全部删除
truncate table 表名;
【delete和truncate区别】
① delete可以加where truncate 不可以
② delete删除可以回滚 truncate 不可以
③ delete 删除自增字段时 下次添加自增效果仍然以删除之前自增
truncate 删除自增字段再次添加重新开始
④ delete 一条一条数据删除 truncate 删除整个表 然后再创建新表
truncate效率高
3. 修改
语法:
update 表名 set 列名1=新值, 列名2=新值,... where 条件
注意:
1. where 条件要加 否则修改所有数据
DQL
数据查询语言,查询数据库表中的数据。查询的结果为虚拟表
基础查询
语法:select 查询列表 from 表名;
特点:
1. 查询列表可以是 常量、变量、函数、表达式、字段名或者组合
2. 查询数据来源于表 加 from 否则不加
3. 查询列表为虚拟表的列名
条件查询
语法:
select 查询列表 from 表名 where 条件;
特点:
1. 条件形式 有多种:
条件表达式:> < >= <= !=或者<> =
逻辑表达式:and(&&) or(||) not(!)
模糊表达式:like / between...and... / not null
排序查询
语法:
select 查询列表
from 表名
where 条件
order by 排序列表 asc|desc;
特点:
1. order by 必须写在where后
2. 排序列表:单字段名、表达式、函数、别名、多字段名或者组合
3. asc 升序(默认) desc降序
常见函数
1. 单行函数:传递一个参数返回一个结果
字符函数:
length(); 获取字符长度
upper(); 转大写
lower(); 转小写
lpad(); 左填充
rpad(); 右填充
substr(); 截取字符串
trim(); 去除两侧空格
concat(); 拼接字符串
数值函数:
ceil(); 向上取整
floor(); 向下取整
abs(); 绝对值
round(); 四舍五入
rand(); 随机数 0-1
mod(); 取余
truncate(); 截取数值
日期函数:
now(); 获取当前的日期+时间
curdate(); 获取当前的日期
curtime(); 获取当前的时间
year()/ month()/day()
date_format(); 格式化日期
流程控制
1. if()
2. 等价于 if(){}else if(){}else if(){}....else{}
case
when 条件1 then 值1
when 条件2 then 值2
.....
else
end
2. 多行函数:传递一组参数返回一个结果
sum(); 求和
avg(); 平均值
max(); 最大值
min(); 最小值
count(); 个数
特点:
1. 分组函数中可以传递列名、表达式
2. 多行函数自动忽略null值
3. 多行函数支持类型
sum avg 只支持数值类型
max min count支持任意类型
分组查询
语法:
select 查询列表 ----- ④
from 表名 ------ ①
where 分组之前条件 ------ ②
group by 分组字段 ------ ③
having 分组后条件 ------ ⑤
order by 排序列表 asc|desc; ----- ⑥
特点:
1. 分组查询查询列表中只能查询到分组函数和分组字段
2. 分组查询执行顺序 后执行可以使用前执行的别名
分页查询
语法:
select 查询列表
from 表名
where 分组前条件
group by 分组字段
having 分组后条件
order by 排序列表 asc|desc
limit 偏移量, 个数
特点:
1. 偏移量 跳过前面的个数
2. 个数 一页要查询的个数
连接查询
又叫多表查询,查询的内容来自于多个表,此时需要将多个表连接起来查询
表之间的关系
① 一对一的关系 如:妻子和丈夫 将从表中的主键与主表中的主键建立外键关系
② 一对多和多对一 如:员工和部门 或者 学生和班级
③ 多对多 如:学生和科目 需要使用中间表,两表与中间表建立外键关系
连接查询
内连接查询
1. 隐式内连接(sql92)
语法:
select 查询列表
from 表1 别名1, 表2 别名2,...
where 连接条件
and 分组前条件
group by 分组字段
having 分组后条件
order by 排序列表 asc|desc
limit 偏移量, 个数
特点:
1. 连接条件一定要加 否则出现笛卡尔乘积现象 n*m
2. 通过where添加连接条件
3. from后的表名顺序可以随意调整 不影响结果
4. 根据连接条件分类
① 等值内连接
② 非等值内连接
③ 自连接
5. n表连接 连接条件至少n-1个
2. 显示内连接(sql99)
语法:
select 查询列表
from 表1 别名1
inner join 表2 别名2 on 连接条件 ....
where 分组前条件
group by 分组字段
having 分组后条件
order by 排序列表 asc|desc
limit 偏移量, 个数
特点:
1. 连接条件需要添加
2. on后加连接条件
3. 表的顺序可以随意调换 不影响结果
4. 根据连接条件分类
① 等值内连接
② 非等值内连接
③ 自连接
5. n表连接 连接条件至少n-1个
外连接查询(sql99)
语法:
select 查询列表
from 表1 别名1
left|right outer join 表2 别名2 on 连接条件....
where 分组前条件
group by 分组字段
having 分组后条件
order by 排序列表 asc|desc
limit 偏移量, 个数
特点:
1. 分为左外连接 和 右外连接
2. left outer 左外连接指 左表为主表(所有数据查询) 右表为副表(有对应主表的数据查询)
查询结果 = 主表中所有数据、副表中有对应关系的数据 以及与主表中没有对应关系的显示为null
3. right outer 右外连接指 右表为主表(所有数据查询) 左表为副表(有对应主表的数据查询)
查询结果 = 主表中所有数据、副表中有对应关系的数据 以及与主表中没有对应关系的显示为null
4. 表之间的顺序不能随意调换,否则会影响结果
子查询
一个查询语句中嵌套了另一个完整的查询语句,被嵌套的语句称为子查询或内查询,外面的语句称为主查询或外查询
语法:
select (子查询)
from (子查询)
where (子查询)
特点:
1. 子查询写在小括号中
2. 子查询优先主查询执行 主查询用到子查询的结果
3. 子查询的结果
① 单行子查询 子查询的结果只有一个 搭配符号:= > < >= <= <>
② 多行子查询 子查询结果有多个 搭配符号:in / all / any
原则:
能用单表 不使用多表 能用多表不用子查询
DCL
DCL 数据控制语言 创建不同的用户指定不同的权限
事务
-
理解 完成某个功能的整个过程,称为一个事务。mysql数据默认一个命令是一个事务
-
作用 多个语句同生共死:只要所有语句都成功了 才成功 只要有一个语句失败了 恢复到执行之前的状态
-
使用:
4. 事务的特性
① 原子性 事务是不可分割的
② 一致性 数据的一致性
③ 持久性 事务完成之后数据是持久化存储的
④ 隔离性 事务与事务之间的隔离
隔离级别:低 ---> 高
1. 读未提交 READ UNCOMMITTED
引发问题:脏读
解决:提高隔离级别
2. 读已提交 READ COMMITTED
引发问题:不可重复读
解决:提升隔离级别
3. 可重复读 REPEATABLE READ
引发问题:幻读
4. 串行化