一、MySQL
启动
services start mysqlXXXX
启动MySQL
XXX -> 版本号(如:@5.7)
services stop mysqlXXXX
停止MySQL
XXX同上
mysql -u root(默认用户名) -p
登陆MySQL
mysql -h 主机名 -u root -p
exit
退出MySQL用户
管理
use 数据库名;
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
show databases;
列出 MySQL 数据库管理系统的数据库列表。
show tables;
显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
show columns from 表名;
显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
show index from 数据库;
显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
show table status [from 数据库名] [like ‘表名’] \G;
该命令将输出Mysql数据库管理系统的性能及统计信息。
from 数据库名:显示数据库中的所有表信息
like ‘表名’:数据库中该表名的所有信息
\G:格式化打印
创建数据库
基本操作数据库
- DDL:操作数据库和表
- DML:增删改数据库表中的数据
- DQL:查询数据库表中的数据
- DCL:权限管理
CRUD:
create(创建),retrieve(查询),update(修改),delete(删除)
DDL 操作数据库和表
操作数据库
* 创建数据库
create
* create database 数据库名称;
- 创建数据库,判断在不在
- create database if not exists 数据库名称;
- 创建数据库指定字符集
- create database if not exists 数据库名称 character set 字符集;
- 创建数据库,判断在不在
retrieve
- 查询所有数据库名称
- show databases;
- 查询某个数据库字符集
- show create database 数据库名称;
- 查询所有数据库名称
update
- 修改字符集
- alter database 数据库名称 character set 字符集名称;
- 修改字符集
delete
- 删除数据库
- drop database 数据库名称;
- 判断是否存在并删除
- drop database if not exists 数据库名称;*
- 删除数据库
使用数据库
- 查询数据库名称
- select database()
- 使用数据库
- use 数据库名称*
操作表
create
- 创建表
- create table 表名称(列名 数据类型, 列名 数据类型);
- create table if not exists 表名称(列名 数据类型, 列名 数据类型);
- 复制表
- create table 表名 like 被复制的表名;
- 创建表
retrieve
- 查询所有表名称
- show tables;
- 查询表结构
- desc 表名;;
- 查询所有表名称
update
- 修改表名
- alter table 表名 rename to 新的表名;
- 修改表的字符集
- alter table 表名 character set 字符集名称;
- 添加一列
- alter table 表名 add 列名 数据类型;
- 需改列名称 类型
- alter table 表名 change 列名 新列名 新数据类型;
- alter table 表名 modify 列名 新数据类型;
- 删除列
- alter table 表名 drop 列名;
- 修改表名
delete
- 删除表
- drop table 表名称;
- 判断是否存在并删除
- drop table if not exists 表名称;
- 删除表
DML 增删改数据库表中的数据
添加数据
- 语法
- insert into 表名(列名, 列名, …) values(数据, 数据, …);
删除数据
- 语法
- delete from 表名 [ where 条件 ];
- truncate table 表名; — 删除名,然后在创建一个一模一样的空表
修改数据
- 语法
- update 表名 set 列名=值, 列名=值,…;
DQL 查询数据库表中的数据
- 基本语法
` select 字段名列表 from 表名 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页条件; `
查询语句
查询条件
- 去除重复
- distinct
- ifnull(列名, 默认值)
- 修改显示名称:列名 as 别名 或者 列名 别名
- 条件
- between…and…:在两者之间
- in(..,.):同时满足括号内条件
- like:模糊查询
- 占位符
- _:单个占位字符
- %:多个占位字符
- 占位符
- is null && not is null:为null或不为null
- and &&
- or ||
- not !
- 去除重复
排序查询
- 语法:order by 子句
- order by 排序字段1 排序方式1, 排序字段2 排序方式2,…;
- 排序方式:
- ASC:升序,默认
- DESC:降序
- 语法:order by 子句
聚合函数:将一列数据作为一个整体,进行纵向计算,可以添加别名对其表达
- count:计算个数
- max:计算最大值
- min:计算最小值
- sum:计算和
avg:计算平均值
注意,聚合函数的计算会排除null
- 选择非空列
- ifnull函数
- * 但并不推荐
分组查询
- 语法:group by 分组字段;
- 分组后查询的字段:分组字段,聚合函数,否则没有意义
- where 和 having 的区别:
- where 在分组之前进行限定,如果不满足,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来。
- where 后不可以跟聚合函数,having 可以进行聚合函数的判断。
- 语法:group by 分组字段;
- 分页查询
- 语法:limit 开始的下表,查询的数量
- 公式:开始的索引 = (当前的页码 - 1) * 每页查询的条数;
约束
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
- 分类
- 主键约束:primary key
- 非空且唯一,一张表只能有一个字段为主键,表中记录的唯一标识
- 创建
- create table stu(id int primary key,…);
- 创建表后添加主键
- alter table stu modify id int primary key;
- 删除
- alter table sut drop primary key;
- 自动增长
- 如果某一列是数值类型,使用 auto_increment 可以自动完成值的增加
- 添加自动增长
- alter table stu modify id int auto_increment;
- 删除自动增长
- alter table stu modify id int;
- 非空约束:not null
- 创建表时添加的约束
- create table stu(name varchar(20) not null);
- 创建表后添加非空约束
- alter table stu modify name int not null;
- 删除name的非空约束
- alter table stu modify name int;
- 创建表时添加的约束
- 唯一约束(值不能重复):unique
- 注意:在mysql中,唯一约束限定的值可以有多个null
- 创建表时添加的唯一约束
- create table stu(name varchar(20) unique);
- 创建表后添加唯一约束
- alter table stu modify name int unique;
- 删除唯一约束
- alter table stu drop index 列名;
- 外键约束:foreign key
- 在创建表时添加外键
- create table 表名(…, constraint 外键名称 foreign key (外键列的名称) references 主表名称(主表列名称))
- 删除外键
- alter table 表名 drop foreign key 外键名称
- 创建表后创建外键
- alter table 表名 add constraint 外键名称 foreign key (外键列的名称) references 主表名称(主表列名称)
- 级联操作:一系列联动操作
- 添加级联更新:on update cascade
- alter table 表名 add constraint 外键名称 foreign key (外键列的名称) references 主表名称(主表列名称) on update cascade;
- 级联删除:on delete cascade
- alter table 表名 add constraint 外键名称 foreign key (外键列的名称) references 主表名称(主表列名称) on update cascade on delete cascade;
- 添加级联更新:on update cascade
- 在创建表时添加外键
- 主键约束:primary key
多表之间的关系
- 一对一
- 在一方表中添加唯一外键指向另一张表的主键
- 一对多(多对一)
- 在多的一方建立外键,指向一的一方的主键
- 多对多
- 借助中间表,中间表中至少包含两张表中的主键以及联合主键
范式
设计数据库时使用的一些规范。成递次规范
- 第一范式:每一列都是不可分割的原子数据项
- 能建立数据库关系
- 第二范式:在1NF基础上,非码属性必须完全依赖于候选码(消除非主属性对主码的部分函数依赖)
- 函数依赖:A—>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称为B依赖于A。如学号—>姓名,(学号,课程名称)—>分数
- 完全函数依赖:A—>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中的所有属性值。如(学号,课程名称)—>分数
- 部分函数依赖:A—>B,如果A是一个属性组,则B属性值的确定只需要A属性组中某一些值即可。如(学号,课程名称)—>姓名
- 传递函数依赖:A—>B,B—>C,如果通过A属性(属性组)的值,可以确定唯一B属性的值;再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖与A。如学号—>系名,系名—>系主任
- 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码。如(学号,课程名称)
- 主属性:码属性组中的所有属性
- 非主属性:除过码属性组的属性
- 第三范式:在2NF基础上,任何非主属性不依赖于其他非主属性(消除传递依赖)
- 巴斯克德范式
- 第四范式
- 第五范式
数据库的备份和还原
- 命令行方式
- 备份: mysqldump -u用户名 -p密码 数据库名称 > 保存路径
- 还原:
- 创建数据库
- 执行文件 source 文件路径
- 图形化工具
多表查询
笛卡尔积: A 和 B 的集合。但是需要消除无用数据。
分类:
- 内连接查询:
- 隐式内连接:使用where条件消除无用数据
- select 表1.列名, 表2.列名 from 表1 别名, 表2 别名 where 表1id = 表2id;
- 显示内连接:
- select 字段 from 表名1 inner join 表名2 on 条件;// inner可以省略
- 注意
- 从哪些表插数据
- 条件是什么
- 查询哪些字段
- 隐式内连接:使用where条件消除无用数据
- 外连接查询:
- 左外连接:查询的是左表所有记录及交集部分
- select 字段 from 表1 left outer join 表2 on 条件;// outer可以省略
- 右外连接:查询的是右表所有记录及交集部分
- select 字段 from 表1 right outer join 表2 on 条件;// outer可以省略
- 左外连接:查询的是左表所有记录及交集部分
- 子查询:查询中嵌套查询,称嵌套查询为子查询
- 子查询的结果是单行单列:子查询可以作为条件,使用运算符判断。
- select * from 表 where 列 = (子查询);
- 子查询的结果是多行单列
- 使用运算符 in 判断:select 列 from 表 where 条件 in (子查询);
- 子查询的结果是多行多列
- 子查询可以作为一张虚拟表:select 列 from 表1, (子查询);
- 子查询的结果是单行单列:子查询可以作为条件,使用运算符判断。
事务
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
- 操作:
- 开启事务: start transaction;
- 回滚: rollback;
- 提交: commit;
MySQL数据库中事务默认自动提交
事务提交的两种方式:
- 自动提交
- mysql就是自动提交的,oracle是手动提交的
- 一条DML语句就会自动提交一次事务
- 手动提交
- 需要先开启事务,在提交
- 修改事务的默认提交方式
- 查看事务的默认提交方式:select @@autocommit; — 1代表自动提交,0代表手动提交
- 修改默认提交方式:set @@autocommit=0; — 修改后如果不commit,语句不会生效
- 自动提交
四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
- 持久性:当事务提交或回滚后,数据库会发生持久化保存
- 隔离性:多个事务之间,相互独立
- 一致性:数据操作前后,数据总量不变
隔离级别
多个事务之间是隔离的,相互杜立德。但是多个事务操作同一批数据,就会发生一些问题,设置不同的隔离级别,就可以解决这些问题。
问题:- 脏读:一个事务,读取到另一个事务中没有提交的数据,
- 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样
幻读:一个事务操作(DML)数据表中所有数据,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
隔离级别
- read uncommitted:读未提交
- 产生的问题:脏读、不可重复读、幻读
- read committed:读已提交(oracle默认)
- 产生的问题:不可重复读、幻读
- repeatable read:可重复读(mysql默认)
- 产生的问题:幻读
serializable:串行化
- 可以解决所有的问题
注意:隔离级别从上到下,安全越来越高,效率越来越低
查询隔离级别
- select @@tx_isolation
- 设置隔离级别
- set global transaction isolation level 级别字符串;
DCL 权限管理
管理用户
- 添加用户:
- create user ‘用户名’@’主机名’ identified by ‘密码’;
- 删除用户:
- drop user ‘用户名’@’主机名’;
- 修改用户:
- update user set password = password(‘新密码’) where user = ‘用户名;
- set password for ‘用户名’@’主机名’ = password(‘新密码’);
- 修改root密码
- 1.停止mysql服务
- 2.mysqld —skip-grant-tables;— 使用无验证方式启动mysql服务
- 3.mysql 直接登陆进入修改root密码
- 4.手动接受这个mysql进程,后重启即可
- 查询用户:切换到mysql数据库中的user表中,
- select * from user;
- 添加用户:
授权
- 查询权限
- show grants for ‘用户名’@’主机名’;
- 授予权限
- grant 权限列表 on 数据库.表名 to ‘用户名’@’主机名’;
- grant all on *.* to ‘用户名’@’主机名’;
- 撤销权限
- revoke 权限列表 数据库.表名 from ‘用户名’@’表名’;
- 查询权限