MySQL数据库相关知识
数据库的基本概念
-
数据库的英文单词 : DataBase 简称 : DB
-
什么是数据库?
- 用于存储和管理数据的仓库
-
数据库的特点
- 持久化存储数据的,其实数据库就是一个文件管理系统
- 方便存储和管理数据
- 使用了统一的方式操作数据库 – SQL
-
常见的数据库软件
- MySQL : 开源免费的数据库,小型的数据库,已经被Oracle收购了,MySQL6.x版本也开始收费
- Oracle : 收费的大型数据库,Oracle公司的产品,Oracle收购SUN公司,收购MySQL.
- DB2 : IBM公司的数据库产品,收费的,常用在银行系统中
- SQLServer : Microsoft 公司收费的中型的数据库,C#,.net等语言常使用
- SyBase : 已经淡出历史舞台,提供了一个非常专业的建模工具PowerDesigner
- SQLLite: 嵌入式的小型数据库,应用在手机端.
MySQL数据库软件
SQL
- 什么是SQL?
概念: Structured Query Language : 结构化查询语言
其实就是定义了操作所有关系型数据库的规则,每一种数据库操作的方式存在不一样的地方,称为方言. - SQL通用语法
- SQL语句可以以单行或者多行书写,以分号结尾.
- 可使用空格和缩进来增强语句的可读性.
- MySQL 数据库的SQL语句不区分大小写,关键字建议使用大写.
- 三种注释
- 单行注释 : – 注释内容 或 # 注释内容
- 多行注释 : /* 注释内容 */
- SQL分类:
- DDL(操作数据库,表) : create , drop , alter 等
- DML(增删改表中的数据):insert ,delete ,update 等
- DQL(查询表中的数据) : select ,where
- DCL(授权) : grant , revoke 等
DDL : 操作数据库,表
- 操作数据库 : CRUD
- C(Create) : 创建
- 创建db1数据库,判断是否存在,并指定字符集为gbk/utf-8
- create db1 if not exists character set gbk/utf-8;
- 创建db1数据库,判断是否存在,并指定字符集为gbk/utf-8
- R(Retrieve) : 查询
- 查询素有数据库的名称
- show databases;
- 查询某个数据库的字符集 : 查询某个数据库的创建语句
- show create database 数据库名称.
- 查询素有数据库的名称
- U(Update) : 修改
- 修改数据库的字符集 : alter 数据库 character set utf8/gbk;
- D(Delete) : 删除
1.判断数据库,存在再进行删除 : drop database if exists 数据库名称 - 使用数据库
- use database 数据库名称.
- C(Create) : 创建
- 操作表 : CRUD
- C(Create) : 创建
- 语法 :
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
…
列名n 数据类型n
)
create table tab1 like tab2; - 数据类型
- int : 整数类型
- double : 小数类型
- date : 日期,只包含年月日, yyyy-MM-dd
- datetime : 日期,包含年月日时分秒 yyyy-MM-dd HH-mm-ss
- timestamp: 包含年月日时分秒 yyyy-MM-dd HH-mm-ss, 如果将来不给这个字段赋值,或者赋值为null,则默认使用当前的系统时间来自动填充.
- varchar : 字符串类型(20)
- 创建表
create table student(
name varchar(20),
age int,
gender varchar(10),
birthday timestamp,
score double(4,1)
);
- 语法 :
- R(Retrieve) : 查询
- 查询某个数据库中所有的表名称
- show tables
- 查询表结构
- desc 表名
- 查询某个数据库中所有的表名称
- U(Update) : 修改
- 修改表名
alter table 表名 rename to 新的表名 - 修改表的字符集
alter table 表名 character set 字符集名称; - 添加一列
alter table 表名 add 列名 数据类型 - 修改列名称 类型
alter table 表名 change 列名 新列名 新数据类型
alter table 表名 modify 列名 新数据类型 - 删除列
alter table 表名 drop 列名
- 修改表名
- D(Delete) : 删除
- drop table 表名
- drop table if exists 表名;
- C(Create) : 创建
DML 增删改表
- 添加数据:
* 语法 : insert into 表名(列名1,列名2,…列名n) values(值1,值2,…值n);
* 注意 :
1. 列名和值要–对应.
2. 如果表名后,不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,…值n)
3. 除了数字类型,其它类型需要使用引号(单双都可以引起来). - 删除数据
- 语法 : delete from 表名 []
- 注意:
- 如果不加条件,则删除表中所有记录
- 如果要删除所有记录
- delete from 表名; – 不推荐使用,有多少条记录就会执行多少次删除操作.
- truncate table 表名 – 推荐使用,效率更高,先删除表,然后再创建一张一样的表.
- 修改数据
- update 表名 set 列名1 = 数据 1 ,列名2 = 数据 2 ,…[where 条件]]
- 注意 : 如果不加条件,则会把所有表中所有数据进行修改.
DQL : 查询表中的记录
-
语法 :
select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
-
基础查询
- 多个字段的查询
select name, -- 姓名 age -- 年龄 from student; -- 学生表
- 去除重复
select distinct address from student;
- 计算列
select name, math, english, math+ ifnull(english,0) from student;
- 起别名
select name, math, english, math+ ifnull(english,0) 总分 from student;
- 多个字段的查询
-
条件查询
- where子语句后跟条件
- 运算符
1. > , < , <= , >= , = <> 2. between ... and 3. in (集合) 4. like 1. 占位符 : _: 单个占位符 % : 多个任意占位符 5. is null 6. and 或 && 7. or 或 || 8. not 或 ! 9. 默认 : sex char(1) default '男';
-
排序查询
- 语法 : order by 子句
* order by 排序字段1,排序字段2 - 排序方式 :
* ASC : 升序,默认的
* DESC : 降序 - 注意 : 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件.
- 语法 : order by 子句
-
聚合函数 : 将一列数据作为一个整体,进行纵向的计算.
- count : 计算个数 – select count(id) from student.
- max ; 计算最大值
- min : 计算最小值
- sum : 计算和 – select sum(math) from student.
- avg : 计算平均值
- 注意 : 聚合函数得计算,排除null值
- 解决方案 :
- 选择不包含非空的列进行计算
- IFNULL函数
-
分组查询 :
- 语法 : group by 分组字段 ;
- 示例 :
select sex, avg(math) ,count(id) personNum from student where math > 75 having personNum > 2 ;
- 示例 :
- 注意 :
- 分组之后查询的字段 : 分组字段,聚合函数
- where 和 having 的区别?
- where 在分组之前进行限定,如果不满足条件,则不参与分组,having在分组之后进行限定,如果不满足结果,则不会被查询出来.
- where 后边不能跟聚合函数,having可以进行聚合函数的判断.
- 语法 : group by 分组字段 ;
-
分页查询
- 语法 : limit 开始的索引,每页查询的条数
- 公式 : 开始的索引 = (当前的页码数 - 1 ) * 每页显示的条数
约束
- 概念 : 对表中的数据进行限定,保证数据的正确性,有效性和完整性.
- 分类 :
- 主键约束 : primary key
- 注意
- 含义 : 非空且唯一
- 一张表只有一个字段为主键
- 主键就是表中记录的唯一标识
- 创建 : id varchar(10) primary key.
- 删除主键 : alter table drop primary key
- 自动增长 : auto_increment
- 联合主键 : primary key (uid,rid);
- 注意
- 非空约束 : not null
- 创建时添加约束 : name varchar(20) not null, – name列的值不能为空
- 创建后添加约束 : alter table stu modify name varchar(20) not null, – name列的值不能为空
- 删除约束 : alter table stu modify name varchar(20) – 修改name列的值可以为空
- 唯一约束 : unique
- 添加约束: phone varchar(20) unique – 表示手机号不能重复
- 注意 : null值在手机号码列是可以重复的.
- 删除约束 : alter table stu drop index phone;
- 外键约束 : foreign key
- 在创建表时,可以添加外键
- 语法
create table 表名(
…
外键列
constraint 外键名称 foreign key (外键列名称) reference 主表名称(主表列名称)
);
- 语法
- 删除外键 : alter table stu foreign key 外键名称
- 添加外键 alter table stu add constraint stu_clas_fk foreign key (clas_id) reference class(id);
- 级联操作 :
- 语法 : 添加外键时 添加级联更新和级联删除
- alter table stu add constraint stu_clas_fk foreign key (clas_id) reference class(id) on update casecade on delete casecade;
- 在创建表时,可以添加外键
- 主键约束 : primary key
数据库的设计
- 多表之间的关系
- 分类
- 一对一 :
- 如 : 人和身份证
- 分析 : 一个人只有一个身份证,一个身份证只能对应一个人
- 一对多(多对一) :
- 如 : 部门和员工
- 分析 : 一个部们有多个员工,一个员工只能对应一个部门
- 多对多
- 如 : 学生和课程
- 分析 : 一个学生可以选择很多门课程,一个课程也可以被很多学生选择.
- 一对一 :
- 实现关系 :
- 一对多(多对一) :
- 如 : 部门和员工
- 实现方式 : 在多的一方建立外键,指向一的一方的主键.
- 多对多
- 如 : 学生和课程
- 实现方式 : 多对多关系实现需要借助第三张中间表,中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键.
- 一对一
- 如 : 人和身份证
- 实现方式 : 一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键.
- 一对多(多对一) :
- 分类
- 数据库设计的范式
- 概念 : 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
- 分类 :
- 第一范式(1NF).: 每一列都是不可分割的原子数据项
- 第二范式(2NF) : 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
- 几个概念 :
- 函数依赖 : A – > B , 如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A.
例如 : 学号 --> 姓名 (学号,课程名称) --> 分数 - 完全函数依赖 : A–>B , 如果A是一个属性组,则B属性值确定需要A属性组中的所有属性值.
例如:(学号,课程名称) --> 分数 - 部分函数依赖 : 如果A是一个属性组,则B属性值确定需要A属性组中的某一个属性值.
- 传递函数依赖 : A–>B , B–>C, A属性的值确定B属性的值,B属性的值能确定C属性的值.
例如 : 学号 --> 系名 --> 系主任 - 码 : 如果在一张表中,一个属性或属性组,被其它所有属性所完全依赖,则称这个属性(属性组)为该表的码.
例如 : 表中的码为 : (学号,课程名称)- 主属性 : 码属性组中的所有属性
- 非主属性 : 除过码属性组的属性
- 函数依赖 : A – > B , 如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A.
- 几个概念 :
- 第三范式(3NF) : 在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
数据库的备份和还原
- 命令行 :
- 语法 : mysqldump -u用户名 -p密码 数据库名 > 保存的路径
- source 保存的路径.
多表查询
- 查询语法 :
select 列名列表 from 表名列表 where ...
- 笛卡尔积 ;
- 有两个集合A,B. 取这两个集合的所有组成情况
- 要完成多表查询,需要消除无用的数据
- 多表查询的分类 :
- 内连接查询 :
- 隐式内连接 : 使用where条件消除无用的数据
如 : 查询员工表的名称,性别,部门表的名称 select t1.name, -- 员工表的姓名 t1.gender, -- 员工表的性别 t2.name -- 部门表的名称 from emp t1, dept t2 where t1.dept_id = t2.id;
- 显式内连接
- 语法 : select 字段列表 from 表名1 [ inner ] join 表名2 on 条件.
- 内连接查询注意事项:
- 从哪些表中查询数据
- 条件是什么
- 查询哪些字段
- 隐式内连接 : 使用where条件消除无用的数据
- 外连接查询 :
1. 左外连接 :
1. 语法 : select 字段列表 from 表1 left [ outer ] join 表2 on 条件 ;
2. 查询的是左表所有数据以及其交集部分
2. 右外连接 :
1. 语法 : select 字段列表 from 表1 right [ outer ] join 表2 on 条件 ;
2. 查询的是右表所有数据以及其交集部分 - 子查询 :
- 概念 : 查询中嵌套查询,称嵌套查询为子查询
- 如 : 查询工资最高的员工信息
select * from emp where salary = (select max(salary) from emp);
- 子查询不同情况
- 子查询的结果是单行,单列的
- 子查询可以作为条件,使用运算符去判断. 运算符 : > < =;
- 子查询的结果是多行单列的 :
- 子查询可以作为条件,使用运算符in来判断
- 子查询的结果是多行多列的 :
- 子查询可以作为一张虚拟表参与查询
- 子查询的结果是单行,单列的
- 编写SQL思路
- 首先确定查询的内容在哪个表
- 查询的条件
- 需要使用哪种查询方式
- 编写sql
- 内连接查询 :
事务
- 事务的基本介绍
- 概念 :
- 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
- 操作 :
- 开启事务 : start transaction;
- 回滚 : rollback;
- 提交 : commit;
- MySQL数据库中事务默认自动提交
- 自动提交 :
- mysql就是自动提交的
- 一条DML(增删改)语句会自动提交一次事务
- 手动提交
- Oracle 数据库默认是手动提交事务
- 需要先开启事务,再提交
- 修改事务的默认提交方式 :
- 查看事务的默认提交方式 : select @@autocommit ; – 1 代表自动提交. – 0 代表手动提交
- 修改默认提交方式 : set @@autocommit = 0 ;
- 自动提交 :
- 概念 :
- 事务的四大特征 :
- 原子性 : 是不可分割的最小操作单位,要么同时成功,要么同时失败.
- 持久性 : 当事务提交或回滚后,数据库会持久化保存数据
- 隔离性 : 多个事务之间,相互独立
- 一致性 : 事务操作前后,数据总量不变
- 事务的隔离级别 :
- 概念 : 多个事务之间隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题.
- 存在问题 :
- 脏读 : 一个事务,读取到另一个 事务中没有提交的数据
- 不可重复读(虚读) : 在同一个事务中,两次读取到的数据不一样
- 幻读 : 一个事务操作(DML)数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
- 隔离级别 :
- read uncommitted : 读未提交
- 产生的问题 : 脏读,不可重复读,幻读
- read commited : 读已提交 (Oracle默认)
- 产生的问题 : 不可重复读,幻读
- repeatable read : 可重复读 (MySQL默认)
- 产生的问题 : 幻读
- serializable : 串行化
- 可以解决所有的问题
- 注意 : 隔离级别从小到大安全性越来越高,但是效率越来越低
- 数据库查询隔离级别 :
- select @@tx isolation
- 数据库设置隔离级别 :
- set global transaction isolation level 级别字符串.
- read uncommitted : 读未提交
DCL
- DCL : 管理用户,授权
- 管理用户
- 添加用户
- 语法 : create user ‘用户名’ @‘主机名’ identified by ‘密码’;
- 修改用户
- 语法 : update user set password = passwword(‘新密码’) where user = ‘用户名’;
- 删除用户
- 语法 : drop user ‘用户名’ @‘主机名’;
- 查询用户
- 添加用户
- 权限
- 查询权限
- 语法 : show grants for ‘用户名’@‘主机名’;
- 授予权限
- 语法 : grant 权限列表 on 数据库名.表名 to ‘用户名’@‘主机名’;
- 授予全部权限,全部表 : grant all on . to ‘用户名’@‘主机名’;
- 撤销权限
- 语法 : revoke 权限列表 on 数据库名.表名 from ‘用户名’@‘主机名’;
- 查询权限
- 管理用户