基本概念
1. 简介
- **数据库的英文单词**:DateBase简称DB- **定义**:用于存储和管理数据的仓库- **SQL**:结构化查询语言(Structured Query Language)
2. 特点
- 持久化存储数据,其实就是一个文件系统- 方便存储和管理数据- 使用了同意的方式操作数据库 -- SQL
3. 数据库软件
- **Oracle** :收费(真的好贵)- **MySQL**:免费开源- **Microsoft SQL Serve**r:微软公司的(按排名来的,应该也收费)- 注:Oracle公司就是甲骨文公司,先将SUN公司收购了(进而导致JAVA和MySQL都落到了他的手中,在MySQL6.x版本之后,这个开源软件也将开始收费)<br />- **软件的启用和禁用**(打开服务选项,在上边按键就可找到相应字母开头的服务)- **快捷键**:win + X 调出菜单 ---> 选择搜索 ---> 输入cmd回车 ---> 输入services.msc回车- **快捷键**:直接在cmd中输入net start mysql可以启动数据库(相应的将start改为stop可停)- 这三个数据库不要随便动<br />
使用方法
1. SQL通用语法
杂项
- **注释方法**- **单行注释**: -- 注释内容(后边含有一个空格) 或 # 注释内容 (在可视化软件中,注释内容是绿色的)- **多行注释**:/* 注释 */<br />
通用查询
- 端口相关- 查询数据库端口:登录mysql之后 show global variables like 'port';
2. 语法分类
DDL:操作数据库,表
- **C(Create):创建**- **创建数据库:**create datebase 数据库名称- **创建数据库,判断不存在,再创建:**create datebase if not exists 数据库名称- **创****建数据库,并指定字符集:**create datebase 数据库名称 character set 字符集名称- **复制表****:**create table 表名 like 被复制的表名- **创建表****:**create table 表名(列名1 数据类型1,列名2 数据类型2,...列名n 数据类型n);(注意最后一行不需要加逗号)- **数据库类型**:<br />- 注:- 使用unsigned注明数据类型是非负的(除char外)- **R(Retrieve):查询**- **查询所有数据库的名称:**show databases;- **查询数据库的字符集+创建语句:**show create database;- **查询****某个数据库中所有表名称****:**show tables;- **查询****表****结构****:**desc 表名;- **U(Update):修改**- **修改数据库的字符集**:alter database 数据库名称 character set 字符集名称- **修改表名****:**alter table 表名 rename to 新的表名;- **修改表的字符集****:**alter table 表名 character set 字符集名称;- **添加一列****:**alter table 表名 add 列名 数据类型;- **修改列名称 类型****:**alter table 表名 change 列名 新列名 新数据类型;<br /> alter table 表名 modify 列名 新数据类型;- **D(Delete):删除**- **删除数据库:**drop database 数据库名称- **判断数据库存在,存在再删除:**drop database if exists 数据库名称- **删除表****:**drop table 表名(drop table if exists 表明----存在再删除)- **删除列**:alter table 表名 drop 列名;- **使用数据库:**- **查询正在使用的数据库名称:**select database();(注意这个小括号)- **使用数据库**:use 数据库名称
DML:增删改表中的数据
- **A--添加数据:**- **语法:**insert into 表名(列名1,列名2...列名n)values(值1,值2...值n);- **注意:**- 表名要和值一一对应- 如果表名后不定义列名,默认给所有列添加值 <br />insert into 表名 values(值1,值2,...值n);- 除了数字类型,其他类型需要使用单引号(单双都可以)引起来- **B--删除数据:**- **语法:**delete from 表名 where 条件 (这里的条件类似于id=xxx)- **注意:**- 如果不加条件则删除表中所有记录- 如果要删除表中所有的记录- delete from 表名 ---不推荐使用。有多少条记录就会重复多少次- Truncate Table 表名 ---推荐使用,直接删除然后拷贝一个新表- **C--修改数据**- **语法:**update 表名 set 列名1=值1,列名2=值2,....where 条件;- **注意:**如果不添加任何条件,则会将表中所有记录全部修改
DQL:查询表中的数据
- **语法:**- **select ** 字段列表- **from** 表名列表- **where** 条件列表- **group by** 分组列表- **having** 分组之后的条件- **order by** 排序- **limit **分页限定- **基础查询:**- **多个字段的查询**:select 字段名1,字段名2,...from 表名;- **注意**:如果查询所有的字段,可以使用*代替字段列表- **去除重复:**- **distinct**(将distinct放在select后边)- **计算列(进行四则运算)**- **直接在字段名处**写上两个字段名的四则运算(xxx)- **ifnull(表达式1,表达式2)**:null参与的运算,计算结果都是null- 表达式1:那个字段需要判断是否为null- 表达式2:是null时需要替换成的东西- **起别名:**- 直接在字段后边加上 as 别名(这里不写as也是可以的)- **条件查询:**- **where子句后跟条件**- **运算符(where后跟的条件)**- **基础运算符:(这里的==用=表示)**- **between...and:(查询一定范围)<br />**- **IN():(查询特定数值)<br />**- **IS NULL :(判断变量是不是空,不能使用=)<br />**- **模糊查询****:**- **_ 代表一个未知字符,% 代表未知数量未知字符,中间镶入文字即可**- **姓名中包含:******- **姓名数量:******- **排序查询:**- **语法****:**order by (排序字段1 排序方式1,排序字段2 排序方式2,...)- **排序方式:ASC:**升序,默认的 **DESC**:降序- **注意:**如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件- 排序示例:- **聚合函数:**将一列数据作为一个整体,进行纵向的计算。- **语法:**- **count:**计算个数- **max:**计算最大值- **min:**计算最小值- **sum:**计算和- **avg:**计算平均值- **使用:**- **count:(非空判断使用,其实直接使用主键计数即可)<br />**- **剩余函数:******- **分组查询:**- **语法:**group by 分组字段;- **注意:**- **分组之后查询的字段**:分组字段,聚合字段;- **where和having的区别**:- where在分组之前进行限定,如果不满足条件,就不参与分组- having在分组之后进行限定,如果不满足就不会被查询出来- where后不可以跟聚合函数,having可以进行聚合函数的判断- **分组使用**- **平均分插入<br /><br />**- **分组条件使用(条件加载表名后)<br /><br />**- **having语句筛选:(直接在最后添加,接上)<br /><br />**- **可以将字段重命名,然后用新明代替count(原名字)<br />**- **分页查询**- **语法:limit开始的索引,每页查询的条数**- **公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数**- **使用<br />**- **注意:limit分页操作是一个MySQL的“方言”
DCL:授权类
- **查询用户**- - **创建用户**<br />- - **删除用户**- - **修改密码**- - **忘记管理员密码**- - 用户权限授予- - - 撤销权限- 
约束
- **概念:**对表中的数据进行限定,保证数据的正确性,有效性和完整性- **分类:**- **主键约束:**primary key- **非空约束:**not null- **唯一约束:**unique- **外键约束:**foreign key- **检查约束:**check- **非空约束:(不能是null)**- **创建表时添加约束**- ****- **单独添加和删除约束**- ****- **唯一约束:(这个数值只能出现一次,类似于手机号,但是null可以多次出现)**- **创建表时添加约束**- ****- **单独添加和删除唯一约束(****这个与前者不同,删除的时候有点特殊****)**- ****- **第二种方法
**
- **主键约束:(非空且唯一,一个表只有一个)**- **创建表时添加主键约束**- ****- **单独添加和删除(****也是直接用drop关键字****)**- ****- **一次添加多个<br />**- **给主键添加自动增长(会接着上一条数据增长)**- **

**
- **外键约束:(让表与表产生关系,从而保证数据的正确性)**- **创建表时添加外键**- ****- **删除外键**- ****- **创建表后添加外键**- ****- **alter table 表名 add constraint 外键名称 foreign key(外键字段名称)references 主表名称(主表列名称)**- **演示**- ****- **检查约束:**(每次添加数据时检查数据是否符合条件)- 创建表时添加- - 单独添加- - **级联:(让几个列产生关联,一个信息个更改影响到另一个相关联的信息)**- **注意:**- 级联定义必须在外键定义之后,两者一同出现- 级联分为级联更新和级联删除都是比较危险的操作- 如果已经定义了外键约束,需要先删除外键再重新添加级联- 
3. 索引相关
- 简介- 索引其实是在一个字段上加上目录,让数据的搜索更加的容易(炒鸡的迅速)- 在一个表中搜索信息时只能使用一个索引,如果多个字段都标记了索引,那么会使用最严格的那个- 可以建立多级索引(比如三个字段合并建立一个索引)- [索引的详细介绍](https://blog.csdn.net/xrt95050/article/details/5556411)
数据库的设计
1. 多表关系
- 分类:
- **一对一(了解):**- **如**:人和身份证- **分****析**:一个身份证只能对应一个人,一个人只有一个身份证- **一对多(多对一):**- **如**:部门和员工- **分析**:一个部门有多个员工,一个员工只能对应一个部门- **多对多:**- **如**:学生和课程- **分析**:一个学生可以选择很多门课程,一个课程也可以包含很多学生
实现关系:
- **一对多(多对一):**- **如:**部门和员工。- **实现方式:**在多的一方建立,指向一的一方的主键。- **多对多:**- **如:**学生和课程。- **实现方式:**多对多关系实现需要借助第三张表,中间至少包含两个字段。- 中间表<br />- **一对一:**- **如:**人和身份证。- **实现方式:**一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
2. 数据库设计的范式
分类
- **第一范式(1NF)****:**每一列都是不可分割的原子数据项- **第二范式(2NF):**在1NF的基础上,非码属性必须完全依赖于码(在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 ;- 例如:学号 -- > 系名,系名 -- > 班主任- **码:**- 如果在一张表中,一个属性或者属性组,被其他所有属性所依赖,则称这个属性(属性组)为该表的码;- **例如**:一个学号就可- **主属性**:码属性组中的所有属性- **非主属性**:除码属性组之外的所有属性- **第三范式(3NF):**2NF基础上,任何非主属性不依赖于其他非主属性(消除传递依赖)
3. 多表查询
内连接查询
- **隐式内连接**(t1,t2是起的别名,使用where条件进行筛选)- - **显式内连接**(就是换了个语句,结果跟前者相同,inner可以省略)- - **注意**:- 从哪些表中查询数据- 条件是什么- 查询哪些字段
- 外连接查询
- **左外连接:**- **语法**:select 字段列表 from 表1 left join 表2 on 条件- 查询的是左表所有的数据以及其交集的部分。- **右外连接:**- **语法**:select 字段列表 from 表1 right join 表2 on 条件- 查询的是右表的数据以及其交集的部分- **注意:**- 查询的时候那个表的名字在代码的左边,查出来之后也是在左边- 一般只使用左外连接
子查询
- **概念:**查询中西昂套查询,称镶套查询为子查询。- **使用**:(其实很简单,就是对函数返回值的利用)- ****- **子查询的结果是单行单列:**- **子查询可以作为条件,运用运算符去使用<br />**- **子查询结果是多行单列的:**- **子查询可以作为条件,使用运算符 in 来判断<br />**- **子查询的结果是多行多列的:**- **子查询可以作为一张虚拟表(与另一张表联合查询)<br />**- **注意:**所有子查询都可以使用普通语句实现
事务
1. 事务的基本介绍
- **概念**:- 如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功,要么同时失败- **操作**:- **开启事务**:setAutoCommit(false) (设置事务不自动提交)- - **回滚:**rollback- **提交**:commit- **注意**:使用时回滚在最后,开启在最前,提交在中间- **数据提交问题:**- **自动提交:**- Mysql是自动提交的,一次增删改提交一次- **手动提交:**- 需要先开启事务,再提交- **修改事务的默认提交方式:**- **查看:select [@@autocommit;](#) **- **修改:set [@autocommit](#) = 0;**- **注:1代表是自动提交,0是手动提交(最后加个commit即可)**
2. 事务的四大特征
- **原子性:**是不可分割的最小操作单位,要么同时成功,要么同时失败- **持久性:**当事务提交或回滚后,数据库会持久化的保存数据- **隔离性:**多个事务之间。相互独立- **一致性:**事务操作前后,数据总量不变
3. 事务的隔离级别
- **概念:**多个事务之间隔离的,相互独立的,但是如果多个事务同时操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。- **存在的问题:**- **脏读:**一个事务,读取到另一个事务中没有提交的数据- **不可重复读(虚读):**在同一个事务中,两次读取到的数据不一样- **幻读:**一个事操作数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改- **隔离级别:**- **read uncommitted:**读未提交- **产生的问题**:脏读,不可重复读,幻读- **read committed:**读已提交(oracle默认)- **产生的问题:**不可重复读,幻读- **repeatable read:**可重复读- **产生的问题:**幻读(Mysql默认)- **serializable:**串行化- 可以解决所有问题- **注意: **- **隔离级别从小到大安全性越来越高,但是效率越来越低**- **数据库查询隔离级别**- **select [@@tx_isolation](#) **- **数据库设置隔离级别**- **set global transaction isolation level 级别字符串**- **设置之后需要重新启动数据库才生效**
**
