数据库的整体框架
DQL:
数据查询语言(凡是带有select 关键字的都是查询语句)
select…
DML:
数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert 增
delete 删
update 改
DDL:
数据定义语言(凡是带有 create drop alter 的都是DDL)
DDL 主要操作的是表的结构,不是表中的数据
TCL:
事物控制语言
包括:
事物提交 commit
事物回滚 rollback
DCL:
数据控制语言
例如 授权 grant 撤销权限 revoke
导入数据库
mysql > source +路径(不能带中文)
DDL
1、 数据库的创建:
create database [ if not exists] 数据库名称 [cahracter set 字符集];
2、查看数据库
show databases; -- 查看所有的数据库
show create database 数据库名称; --查看数据库定义信息
select database(); -- 查看当前正在使用的数据库
use 数据库名称 --使用数据库(切换数据库)
3、删除数据库
drop database 数据库名称
4、修改数据库
alter database 数据库名称 character set 字符集; --修改数据库字符集
5、表的创建
create table 表名(字段名1 类型, 字段名2 类型.... );
6、查看表
show tables; -- 查看当前数据库中所有表
desc 表名 -- 查看表结构的字段信息
show create table 表名 -- 查看创建表的信息
7、删除表
drop table [if exists] 表名;
8、修改表
---------------表--------------=
rename table 表名1 to 表名2; -- 修改表名
alter table 表名 character set 字符集 -- 修改字符集
-----------字段------------------
alter table 表名 add 字段名 类型; -- 添加字段
alter table 表名 modify 字段名 新的类型 -- 修改表的字段类型
alter table 表名 change 字段1 字段2 类型 -- 修改字段名
alter table 表名 drop 字段名 -- 删除字段
DML
1、添加数据
insert into 表名(字段1,字段2...) values(字段值1,字段值2...) -- 在表中添加数据
---------------简化格式------------------
insert into 表名 values(字段值1,字段值2...) -- 全字段插入,字段值必须与字段顺序一致
2、修改数据
update 表名 set 字段名 = 新的值 , 字段名= 新的值.... -- 无条件更新全表(慎用)
update 表名 set 字段名= 新的值, 字段名 =新的值... where 条件 -- 按照条件更新表中的数据
3、删除数据
delete from 表名 -- 无条件删除全表(慎用)
delete from 表名 where 条件 -- 带条件删除
-----------truncate 和 delete----------
truncate table 表名 -- 先把整张表删除, 再重新创建一个新表,新表结构和原来一样
delete from 表名 -- 是将表中的数据一条一条删除,不影响表的结构
DQL
1、查询数据
select 字段名1,字段名2.... from 表名; -- 查询指定列的数据
select * from 表名 -- 查询所有列数据
select 字段1 as 别名.... from 表名 as 别名; -- 可以进行别名查询
select distinct 字段1,字段2.... from 表名 -- 去重查询
select 字段[+ - * / % ] 其他字段或固定值 from 表名 -- 查询结果参与运算
-----------蠕虫复制-----------
create table 表1 like 表2 -- 创建与表2一样的表1
insert into 表1 select* from 表2 -- 将表2的值全部赋给表1
insert into 表1 select* from 表1 -- 重复复制表1
2、条件查询
select 字段1,字段2....from 表 where 条件
---------范围查询-------------
select 字段1,字段2....from 表 where 字段 In(数据1,数据2...)
select 字段1,字段2....from 表 where 字段 between 值1 and 值2
------------模糊查询-----------
select 字段1,字段2....from 表 where 字段名 like '通配符字符串' -- % 0到 任意多个 _表示一个字符
------------排序查询------------
select 字段1,字段2....from 表 [where 条件] order by 字段[asc 升序|desc 降序] -- 单列排序
select 字段1,字段2....from 表 [where 条件] order by 字段1[asc 升序|desc 降序] ,字段2 -- 组合排序
3、聚合函数
count(字段) -- 按照列统计行数据,
sum(字段) -- 计算指定列的数值之和,非数值计算为0
max(字段) -- 计算指定列的最大值
min(字段) -- 计算指定列的最小值
avg(字段) -- 计算指定列的平均值
语法: select 聚合函数(字段) from 表名
4、分组排序
select 字段, 聚合函数(字段) from 表 where 条件 group by 字段 [having 条件]
5、分页查询
select *from 表名 where 条件 limit offset, pageSize --offset 本页起始位置 pageSize 要查询的记录数
----------分页查询的执行顺序-------
select 字段1,字段2,... from 表名 where 条件① group by 字段1,字段2 ②
having 条件 ③ order by 字段 ④ limit offset,row_count ⑤;
约束
1、主键约束 primary key (唯一, 非空)
create table 表名(id int primary key, 其他字段...); -- 主键定义
alter table 表名 add primary key(字段) -- 给字段添加主键(原来没有)
alter table 表名 drop primary key; -- 删除主键
字段名 字段类型 primary key auto_increment -- 主键自动增加
alter table 表名 auto_increment = 起始值 -- 让主键从给定的值自增(不常用)
2、唯一约束 unique (字段值唯一)
create table 表名(字段名 字段类型 unique, .....); -- 唯一定义
alter table 表名 add unique(字段) -- 给字段添加唯一性(原来没有)
3、非空约束 not null (列值不能为null)
create table 表名(字段名 字段类型 not null, .....); -- 非空定义
alter table 表名 modify 字段类型 not null -- 给字段添加非空性
***** 非空+唯一约束 与主键约束区别?
1、主键约束在表中只能存在一个,但非空+唯一可以存在多个
2、主键可以添加自增约束,非空+唯一约束不能
3、主键约束底层维护了一个主键索引,而唯一约束底层维护的是唯一索引
4、默认值约束 default (添加默认值)
create table 表名(字段名 字段类型 default 默认值, .....); -- 默认约束定义
alter table 表名 modify 字段 类型 default 默认值 -- 给字段添加默认值
表关系与外键约束
1、表关系
1、一对一
2、一对多
-- 1 为主表 多为从表
-- 在从表添加一个字段,存在主表主键的值 --> 外键字段
-- 从表字段的值只能是主表中主键存在的值
3、多对多
2、外键约束
create table 表名(
字段,
外键字段 int,
constraint 外键名(约束名) foreign key(当前外键字段名) references主表名(主表主键);
); -- 外键约束创建
alter table 表名 add constraint 外键名 foreign key(当前外键字段名) references主表名(主表主键); -- 添加外键
alter table从表名 drop foreign key 外键名称; -- 删除外键约束
**操作注意事项
1、添加数据时
先主后从
2、删除数据时
先从后主
3、修改数据时
如果主表的主键被从表引用了,不能修改此主键的值
外键的级联
级联:就是在修改或者删除主键时可以同时对从表的外键进行修改删除
在后添加:
on update cascade; 更新
on delete cascade; 删除
多表查询
1、笛卡尔积
select *from 表1,表2....;
--消除笛卡尔积 从表.外键 = 主表.主键
2、内连接查询
select 列名 from 左表,右表 where 从表.外键 = 主表.主键 -- 隐式内连接
select 列名 from 左表[inner] join 右表 on 从表.外键 = 主表.主键 -- 显示内连接
3、外链接查询
select 列名 from 左表 left join 右表 on 从表.外键 = 主表.主键 -- 左外连接
select 列名 from 左表 right join 右表 on 从表.外键 = 主表.主键 -- 右外连接
4、子查询
--子查询就是将一个查询的结果做为另一个查询的条件,形成查询语句的嵌套,嵌套的SQL查询就是子查询,子查询语句需要使用括号括起来。
-- 单行单列
-- 如果子查询是单行单列,父查询使用比较运算符:> < =
--多行单列
-- 如果子查询是多行单列,可以认为是一个数组,父查询使用in、any 、all关键字
-- 多行多列
-- 如果子查询是多行多列,子查询可以认为它是一张虚拟表,可以使用表连接再次进行多表查询
-- **如果要访问子查询表的字段,需要为子查询表取别名,否则无法访问表中的字段
事务 Transaction
1、事务的操作
start transaction -- 开启事务
commit -- 提交事务
rollback -- 回滚事务
2、事务的四大特性ACID
-- 原子性(Atomicity)
-- 原子是不可分割的最小操作单位,事务要么同时成功,要么同时失败。
-- 一致性(Consistency)
-- 事务操作前后,数据总量不变
-- 隔离性(Isolation)
-- 多个用户并发的访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发的事务之间要 相互隔离
-- 持久性(Durability)
--当事务提交或回滚后,数据库会持久化的保存数据
3、事务隔离级别
并发访问的问题 | 含义 |
---|---|
脏读 | 一个事务读取到了另一个事务中尚未提交的数据。 |
不可重复读 | 一个事务中多次读取时数据是不一致的,这是事务update时引发的问题; |
幻读(虚读) | 一个事务内读取到了别的事务插入或者删除的数据,导致前后读取记录行数不同。这是insert或delete时引发的问题 |