基本概念

1. 简介

  1. - **数据库的英文单词**:DateBase简称DB
  2. - **定义**:用于存储和管理数据的仓库
  3. - **SQL**:结构化查询语言(Structured Query Language

2. 特点

  1. - 持久化存储数据,其实就是一个文件系统
  2. - 方便存储和管理数据
  3. - 使用了同意的方式操作数据库 -- SQL

3. 数据库软件

  1. - **Oracle** :收费(真的好贵)
  2. - **MySQL**:免费开源
  3. - **Microsoft SQL Serve**r:微软公司的(按排名来的,应该也收费)
  4. - 注:Oracle公司就是甲骨文公司,先将SUN公司收购了(进而导致JAVAMySQL都落到了他的手中,在MySQL6.x版本之后,这个开源软件也将开始收费)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580834951520-70b8c96a-30c8-495e-a684-0fb1951fb1b4.png#align=left&display=inline&height=366&margin=%5Bobject%20Object%5D&name=image.png&originHeight=366&originWidth=834&size=227510&status=done&style=none&width=834)
  5. - **软件的启用和禁用**(打开服务选项,在上边按键就可找到相应字母开头的服务)
  6. - **快捷键**:win + X 调出菜单 ---> 选择搜索 ---> 输入cmd回车 ---> 输入services.msc回车
  7. - **快捷键**:直接在cmd中输入net start mysql可以启动数据库(相应的将start改为stop可停)
  8. - 这三个数据库不要随便动<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580840566608-c117171c-3136-405e-956f-97fc3cf32e97.png#align=left&display=inline&height=127&margin=%5Bobject%20Object%5D&name=image.png&originHeight=127&originWidth=242&size=14596&status=done&style=none&width=242)

使用方法

1. SQL通用语法

杂项

  1. - **注释方法**
  2. - **单行注释**: -- 注释内容(后边含有一个空格) # 注释内容 (在可视化软件中,注释内容是绿色的)
  3. - **多行注释**:/* 注释 */<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580839795312-b8220e55-e048-4b24-8b25-50e00e102014.png#align=left&display=inline&height=69&margin=%5Bobject%20Object%5D&name=image.png&originHeight=69&originWidth=118&size=5085&status=done&style=none&width=118)

通用查询

  1. - 端口相关
  2. - 查询数据库端口:登录mysql之后 show global variables like 'port';

2. 语法分类

DDL:操作数据库,表

  1. - **CCreate):创建**
  2. - **创建数据库:**create datebase 数据库名称
  3. - **创建数据库,判断不存在,再创建:**create datebase if not exists 数据库名称
  4. - **创****建数据库,并指定字符集:**create datebase 数据库名称 character set 字符集名称
  5. - **复制表****:**create table 表名 like 被复制的表名
  6. - **创建表****:**create table 表名(列名1 数据类型1,列名2 数据类型2,...列名n 数据类型n);(注意最后一行不需要加逗号)
  7. - **数据库类型**:<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580886266530-c657b935-3437-4b70-beea-15713b7c3b8c.png#align=left&display=inline&height=463&margin=%5Bobject%20Object%5D&name=image.png&originHeight=463&originWidth=832&size=419235&status=done&style=none&width=832)
  8. - 注:
  9. - 使用unsigned注明数据类型是非负的(除char外)
  10. - **RRetrieve):查询**
  11. - **查询所有数据库的名称:**show databases
  12. - **查询数据库的字符集+创建语句:**show create database
  13. - **查询****某个数据库中所有表名称****:**show tables
  14. - **查询****表****结构****:**desc 表名;
  15. - **UUpdate):修改**
  16. - **修改数据库的字符集**:alter database 数据库名称 character set 字符集名称
  17. - **修改表名****:**alter table 表名 rename to 新的表名;
  18. - **修改表的字符集****:**alter table 表名 character set 字符集名称;
  19. - **添加一列****:**alter table 表名 add 列名 数据类型;
  20. - **修改列名称 类型****:**alter table 表名 change 列名 新列名 新数据类型;<br /> alter table 表名 modify 列名 新数据类型;
  21. - **DDelete):删除**
  22. - **删除数据库:**drop database 数据库名称
  23. - **判断数据库存在,存在再删除:**drop database if exists 数据库名称
  24. - **删除表****:**drop table 表名(drop table if exists 表明----存在再删除)
  25. - **删除列**:alter table 表名 drop 列名;
  26. - **使用数据库:**
  27. - **查询正在使用的数据库名称:**select database();(注意这个小括号)
  28. - **使用数据库**:use 数据库名称

DML:增删改表中的数据

  1. - **A--添加数据:**
  2. - **语法:**insert into 表名(列名1,列名2...列名nvalues(值1,值2...值n);
  3. - **注意:**
  4. - 表名要和值一一对应
  5. - 如果表名后不定义列名,默认给所有列添加值 <br />insert into 表名 values(值1,值2,...值n);
  6. - 除了数字类型,其他类型需要使用单引号(单双都可以)引起来
  7. - **B--删除数据:**
  8. - **语法:**delete from 表名 where 条件 (这里的条件类似于id=xxx
  9. - **注意:**
  10. - 如果不加条件则删除表中所有记录
  11. - 如果要删除表中所有的记录
  12. - delete from 表名 ---不推荐使用。有多少条记录就会重复多少次
  13. - Truncate Table 表名 ---推荐使用,直接删除然后拷贝一个新表
  14. - **C--修改数据**
  15. - **语法:**update 表名 set 列名1=值1,列名2=值2,....where 条件;
  16. - **注意:**如果不添加任何条件,则会将表中所有记录全部修改

DQL:查询表中的数据

  1. - **语法:**
  2. - **select ** 字段列表
  3. - **from** 表名列表
  4. - **where** 条件列表
  5. - **group by** 分组列表
  6. - **having** 分组之后的条件
  7. - **order by** 排序
  8. - **limit **分页限定
  9. - **基础查询:**
  10. - **多个字段的查询**:select 字段名1,字段名2,...from 表名;
  11. - **注意**:如果查询所有的字段,可以使用*代替字段列表
  12. - **去除重复:**
  13. - **distinct**(将distinct放在select后边)
  14. - **计算列(进行四则运算)**
  15. - **直接在字段名处**写上两个字段名的四则运算(xxx
  16. - **ifnull(表达式1,表达式2)**:null参与的运算,计算结果都是null
  17. - 表达式1:那个字段需要判断是否为null
  18. - 表达式2:是null时需要替换成的东西
  19. - **起别名:**
  20. - 直接在字段后边加上 as 别名(这里不写as也是可以的)
  21. - **条件查询:**
  22. - **where子句后跟条件**
  23. - **运算符(where后跟的条件)**
  24. - **基础运算符:(这里的==用=表示)![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580905201826-41b6e7ef-daf1-4c06-99f9-82515591ca57.png#align=left&display=inline&height=254&margin=%5Bobject%20Object%5D&name=image.png&originHeight=254&originWidth=376&size=96706&status=done&style=none&width=376)**
  25. - **between...and:(查询一定范围)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580905325938-1f0a723e-fb2e-421c-a2c7-821f8bcf0ef4.png#align=left&display=inline&height=147&margin=%5Bobject%20Object%5D&name=image.png&originHeight=147&originWidth=732&size=147873&status=done&style=none&width=732)**
  26. - **IN():(查询特定数值)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580905425202-954c689b-ebdc-4f02-8e30-84f4554c2ff3.png#align=left&display=inline&height=91&margin=%5Bobject%20Object%5D&name=image.png&originHeight=91&originWidth=858&size=110976&status=done&style=none&width=858)**
  27. - **IS NULL :(判断变量是不是空,不能使用=)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580905533350-60681fe0-8890-4ec5-98d6-845cbcea5c64.png#align=left&display=inline&height=192&margin=%5Bobject%20Object%5D&name=image.png&originHeight=192&originWidth=778&size=162673&status=done&style=none&width=778)**
  28. - **模糊查询****:**
  29. - **_ 代表一个未知字符,% 代表未知数量未知字符,中间镶入文字即可**
  30. - **姓名中包含:****![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580906066087-2a379303-7462-4620-9fb0-ae04371d0e5e.png#align=left&display=inline&height=140&margin=%5Bobject%20Object%5D&name=image.png&originHeight=140&originWidth=670&size=122779&status=done&style=none&width=670)**
  31. - **姓名数量:****![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580906099259-db93e4bd-fda3-4bcb-8f03-0bae3929edce.png#align=left&display=inline&height=171&margin=%5Bobject%20Object%5D&name=image.png&originHeight=171&originWidth=659&size=116120&status=done&style=none&width=659)**
  32. - **排序查询:**
  33. - **语法****:**order by (排序字段1 排序方式1,排序字段2 排序方式2,...)
  34. - **排序方式:ASC:**升序,默认的 **DESC**:降序
  35. - **注意:**如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件
  36. - 排序示例:![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580906846751-7e646c52-cb16-461d-b2b7-fb225d2d26de.png#align=left&display=inline&height=182&margin=%5Bobject%20Object%5D&name=image.png&originHeight=182&originWidth=736&size=182801&status=done&style=none&width=736)
  37. - **聚合函数:**将一列数据作为一个整体,进行纵向的计算。
  38. - **语法:**
  39. - **count:**计算个数
  40. - **max:**计算最大值
  41. - **min:**计算最小值
  42. - **sum:**计算和
  43. - **avg:**计算平均值
  44. - **使用:**
  45. - **count:(非空判断使用,其实直接使用主键计数即可)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580907562073-0a2fab8a-11cb-4b4d-ae8b-d9dcb80c7407.png#align=left&display=inline&height=88&margin=%5Bobject%20Object%5D&name=image.png&originHeight=88&originWidth=587&size=78599&status=done&style=none&width=587)**
  46. - **剩余函数:****![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580907600187-5f974d02-ebda-4fce-9d1f-6783d086d33b.png#align=left&display=inline&height=179&margin=%5Bobject%20Object%5D&name=image.png&originHeight=179&originWidth=425&size=115810&status=done&style=none&width=425)**
  47. - **分组查询:**
  48. - **语法:**group by 分组字段;
  49. - **注意:**
  50. - **分组之后查询的字段**:分组字段,聚合字段;
  51. - **wherehaving的区别**:
  52. - where在分组之前进行限定,如果不满足条件,就不参与分组
  53. - having在分组之后进行限定,如果不满足就不会被查询出来
  54. - where后不可以跟聚合函数,having可以进行聚合函数的判断
  55. - **分组使用**
  56. - **平均分插入<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580908102622-a9c674e7-8209-4d1c-b501-dd1c78b58bc7.png#align=left&display=inline&height=68&margin=%5Bobject%20Object%5D&name=image.png&originHeight=68&originWidth=587&size=64589&status=done&style=none&width=587)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580908110914-e3b9fff5-c6c1-4fde-9942-477cff65a51b.png#align=left&display=inline&height=84&margin=%5Bobject%20Object%5D&name=image.png&originHeight=84&originWidth=384&size=56989&status=done&style=none&width=384)**
  57. - **分组条件使用(条件加载表名后)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580909319780-c6faa0ea-6071-4bc9-af0b-7798502c85cc.png#align=left&display=inline&height=65&margin=%5Bobject%20Object%5D&name=image.png&originHeight=65&originWidth=835&size=87667&status=done&style=none&width=835)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580909341463-e7731243-bb09-4e02-8136-7daab76fe592.png#align=left&display=inline&height=83&margin=%5Bobject%20Object%5D&name=image.png&originHeight=83&originWidth=380&size=49147&status=done&style=none&width=380)**
  58. - **having语句筛选:(直接在最后添加,接上)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580909467313-595a6b3f-da93-4c36-baa0-7f5027c34927.png#align=left&display=inline&height=61&margin=%5Bobject%20Object%5D&name=image.png&originHeight=61&originWidth=552&size=46690&status=done&style=none&width=552)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580909500963-c16059db-e6eb-4df2-a1ef-ca8219519dcb.png#align=left&display=inline&height=54&margin=%5Bobject%20Object%5D&name=image.png&originHeight=54&originWidth=375&size=39733&status=done&style=none&width=375)**
  59. - **可以将字段重命名,然后用新明代替count(原名字)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580910880551-7a28c838-5cf1-43bf-b9cc-caea6d6c1609.png#align=left&display=inline&height=51&margin=%5Bobject%20Object%5D&name=image.png&originHeight=51&originWidth=730&size=41918&status=done&style=none&width=730)**
  60. - **分页查询**
  61. - **语法:limit开始的索引,每页查询的条数**
  62. - **公式:开始的索引 = (当前的页码 - 1 * 每页显示的条数**
  63. - **使用<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580911678844-a5831ea8-02c3-4061-80f3-0b07bd8915d5.png#align=left&display=inline&height=222&margin=%5Bobject%20Object%5D&name=image.png&originHeight=222&originWidth=569&size=120928&status=done&style=none&width=569)**
  64. - **注意:limit分页操作是一个MySQL的“方言”

**

DCL:授权类

  1. - **查询用户**
  2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581331720863-2ddf3909-3e5c-43eb-9dba-231c970994c3.png#align=left&display=inline&height=61&margin=%5Bobject%20Object%5D&name=image.png&originHeight=61&originWidth=282&size=40723&status=done&style=none&width=282)
  3. - **创建用户**<br />
  4. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581331350497-cafe346a-b28a-4b5e-9269-19b25f7047b4.png#align=left&display=inline&height=145&margin=%5Bobject%20Object%5D&name=image.png&originHeight=145&originWidth=786&size=170922&status=done&style=none&width=786)
  5. - **删除用户**
  6. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581331754817-f08c8726-17ef-47b9-acf4-89e03174fe48.png#align=left&display=inline&height=86&margin=%5Bobject%20Object%5D&name=image.png&originHeight=86&originWidth=479&size=80417&status=done&style=none&width=479)
  7. - **修改密码**
  8. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581331937938-a7c66a19-c8d3-4a1f-a78c-0bdc8e97a436.png#align=left&display=inline&height=190&margin=%5Bobject%20Object%5D&name=image.png&originHeight=190&originWidth=963&size=289256&status=done&style=none&width=963)
  9. - **忘记管理员密码**
  10. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581332176686-f37ed6ff-13f4-43d6-867d-3429a91bec1c.png#align=left&display=inline&height=374&margin=%5Bobject%20Object%5D&name=image.png&originHeight=374&originWidth=1080&size=453358&status=done&style=none&width=1080)
  11. - 用户权限授予
  12. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581332482138-c83e8c2f-32bd-4472-b324-ab86d5f62fc9.png#align=left&display=inline&height=171&margin=%5Bobject%20Object%5D&name=image.png&originHeight=171&originWidth=799&size=176700&status=done&style=none&width=799)
  13. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581332589766-5edb5c16-b5b0-4081-9ff2-b584950a5870.png#align=left&display=inline&height=93&margin=%5Bobject%20Object%5D&name=image.png&originHeight=93&originWidth=676&size=102859&status=done&style=none&width=676)
  14. - 撤销权限
  15. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581332633083-506d443f-ab3a-4986-8703-b233c1532e89.png#align=left&display=inline&height=93&margin=%5Bobject%20Object%5D&name=image.png&originHeight=93&originWidth=802&size=115918&status=done&style=none&width=802)

约束

  1. - **概念:**对表中的数据进行限定,保证数据的正确性,有效性和完整性
  2. - **分类:**
  3. - **主键约束:**primary key
  4. - **非空约束:**not null
  5. - **唯一约束:**unique
  6. - **外键约束:**foreign key
  7. - **检查约束:**check
  8. - **非空约束:(不能是null)**
  9. - **创建表时添加约束**
  10. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580913158507-6c4297f9-41e5-4d39-a1a2-1f402d52b8a9.png#align=left&display=inline&height=114&margin=%5Bobject%20Object%5D&name=image.png&originHeight=114&originWidth=610&size=58647&status=done&style=none&width=610)**
  11. - **单独添加和删除约束**
  12. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580913208797-ce1289cc-fa91-4704-a321-19c096759a8e.png#align=left&display=inline&height=123&margin=%5Bobject%20Object%5D&name=image.png&originHeight=123&originWidth=628&size=111538&status=done&style=none&width=628)**
  13. - **唯一约束:(这个数值只能出现一次,类似于手机号,但是null可以多次出现)**
  14. - **创建表时添加约束**
  15. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580913659565-56f5c8fb-4047-4dbe-bc24-31d4a023d68d.png#align=left&display=inline&height=164&margin=%5Bobject%20Object%5D&name=image.png&originHeight=164&originWidth=814&size=102407&status=done&style=none&width=814)**
  16. - **单独添加和删除唯一约束(****这个与前者不同,删除的时候有点特殊****)**
  17. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580913972159-80f27e79-3758-4baf-9e4b-dc422c497075.png#align=left&display=inline&height=166&margin=%5Bobject%20Object%5D&name=image.png&originHeight=166&originWidth=789&size=178063&status=done&style=none&width=789)**
  18. - **第二种方法

**

  1. - **主键约束:(非空且唯一,一个表只有一个)**
  2. - **创建表时添加主键约束**
  3. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580914454536-3ad199e2-fd50-4c9b-abda-2a93135ab92b.png#align=left&display=inline&height=100&margin=%5Bobject%20Object%5D&name=image.png&originHeight=100&originWidth=624&size=55751&status=done&style=none&width=624)**
  4. - **单独添加和删除(****也是直接用drop关键字****)**
  5. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580914499114-63405c5c-91a3-495a-a6e6-5b7f72cd8999.png#align=left&display=inline&height=154&margin=%5Bobject%20Object%5D&name=image.png&originHeight=154&originWidth=546&size=112040&status=done&style=none&width=546)**
  6. - **一次添加多个<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581078501479-3cdccd3d-e0ed-4571-a9b7-240c98aa508b.png#align=left&display=inline&height=109&margin=%5Bobject%20Object%5D&name=image.png&originHeight=109&originWidth=686&size=38230&status=done&style=none&width=686)**
  7. - **给主键添加自动增长(会接着上一条数据增长)**
  8. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580915006514-b2ee013e-62b2-46d1-81ca-bfa5fad45e15.png#align=left&display=inline&height=241&margin=%5Bobject%20Object%5D&name=image.png&originHeight=241&originWidth=783&size=153247&status=done&style=none&width=783)**

image.png
**

  1. - **外键约束:(让表与表产生关系,从而保证数据的正确性)**
  2. - **创建表时添加外键**
  3. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580918845100-78c7eb17-95f4-450c-b902-710a050a3f81.png#align=left&display=inline&height=211&margin=%5Bobject%20Object%5D&name=image.png&originHeight=211&originWidth=1146&size=149313&status=done&style=none&width=1146)**
  4. - **删除外键**
  5. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580918880088-743fce91-911a-43ff-836c-1990cb70011a.png#align=left&display=inline&height=38&margin=%5Bobject%20Object%5D&name=image.png&originHeight=38&originWidth=608&size=49739&status=done&style=none&width=608)**
  6. - **创建表后添加外键**
  7. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580918905362-5ae98dc6-44de-4a96-8034-517ec53c7b9b.png#align=left&display=inline&height=37&margin=%5Bobject%20Object%5D&name=image.png&originHeight=37&originWidth=1354&size=99289&status=done&style=none&width=1354)**
  8. - **alter table 表名 add constraint 外键名称 foreign key(外键字段名称)references 主表名称(主表列名称)**
  9. - **演示**
  10. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580922641721-3a4d2703-cee3-4c24-8fc7-4e776944f1a6.png#align=left&display=inline&height=389&margin=%5Bobject%20Object%5D&name=image.png&originHeight=389&originWidth=657&size=90834&status=done&style=none&width=657)**
  11. - **检查约束:**(每次添加数据时检查数据是否符合条件)
  12. - 创建表时添加
  13. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581086593158-dd90f404-20c4-4f0a-a15b-9a79e6cd64cf.png#align=left&display=inline&height=235&margin=%5Bobject%20Object%5D&name=image.png&originHeight=235&originWidth=506&size=23660&status=done&style=none&width=506)
  14. - 单独添加
  15. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581086749751-7b2f92b9-32df-43e4-9627-91d68f0dc46a.png#align=left&display=inline&height=79&margin=%5Bobject%20Object%5D&name=image.png&originHeight=79&originWidth=672&size=8356&status=done&style=none&width=672)
  16. - **级联:(让几个列产生关联,一个信息个更改影响到另一个相关联的信息)**
  17. - **注意:**
  18. - 级联定义必须在外键定义之后,两者一同出现
  19. - 级联分为级联更新和级联删除都是比较危险的操作
  20. - 如果已经定义了外键约束,需要先删除外键再重新添加级联
  21. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580924047650-881255ff-9c8b-45cf-84c1-dbd64d52da9b.png#align=left&display=inline&height=161&margin=%5Bobject%20Object%5D&name=image.png&originHeight=161&originWidth=612&size=66009&status=done&style=none&width=612)

3. 索引相关

  1. - 简介
  2. - 索引其实是在一个字段上加上目录,让数据的搜索更加的容易(炒鸡的迅速)
  3. - 在一个表中搜索信息时只能使用一个索引,如果多个字段都标记了索引,那么会使用最严格的那个
  4. - 可以建立多级索引(比如三个字段合并建立一个索引)
  5. - [索引的详细介绍](https://blog.csdn.net/xrt95050/article/details/5556411)

数据库的设计

1. 多表关系

  • 分类:
    1. - **一对一(了解):**
    2. - **如**:人和身份证
    3. - **分****析**:一个身份证只能对应一个人,一个人只有一个身份证
    4. - **一对多(多对一):**
    5. - **如**:部门和员工
    6. - **分析**:一个部门有多个员工,一个员工只能对应一个部门
    7. - **多对多:**
    8. - **如**:学生和课程
    9. - **分析**:一个学生可以选择很多门课程,一个课程也可以包含很多学生
  • 实现关系:

    1. - **一对多(多对一):**
    2. - **如:**部门和员工。
    3. - **实现方式:**在多的一方建立,指向一的一方的主键。
    4. - **多对多:**
    5. - **如:**学生和课程。
    6. - **实现方式:**多对多关系实现需要借助第三张表,中间至少包含两个字段。
    7. - 中间表<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580926627898-2523ff0b-e386-4145-92ef-33916184ec1c.png#align=left&display=inline&height=230&margin=%5Bobject%20Object%5D&name=image.png&originHeight=230&originWidth=737&size=169001&status=done&style=none&width=737)
    8. - **一对一:**
    9. - **如:**人和身份证。
    10. - **实现方式:**一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。

    2. 数据库设计的范式

  • 分类

    1. - **第一范式(1NF)****:**每一列都是不可分割的原子数据项
    2. - **第二范式(2NF):**在1NF的基础上,非码属性必须完全依赖于码(在1NF的基础上消除非主属性对主码的部分函数依赖)
    3. - **函数依赖:**
    4. - A -- > B,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A
    5. - 例如:学号 -- > 成绩
    6. - **完全函数依赖**:
    7. - A -- > B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值
    8. - 例如:(学号,课程成绩) -- > 学号
    9. - **部分函数依赖**:
    10. - A -- > B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中某一值即可
    11. - 例如:(学号,课程成绩) -- > 学号
    12. - **传递函数依赖:**
    13. - A -- > B,B -- > C,如果通过A属性(属性组)的值,可以唯一确定B属性的值,再通过B属性的值可以确定C属性的值,则称 C 传递函数依赖于 A
    14. - 例如:学号 -- > 系名,系名 -- > 班主任
    15. - **码:**
    16. - 如果在一张表中,一个属性或者属性组,被其他所有属性所依赖,则称这个属性(属性组)为该表的码;
    17. - **例如**:一个学号就可
    18. - **主属性**:码属性组中的所有属性
    19. - **非主属性**:除码属性组之外的所有属性
    20. - **第三范式(3NF):**2NF基础上,任何非主属性不依赖于其他非主属性(消除传递依赖)

    3. 多表查询

  • 内连接查询

    1. - **隐式内连接**(t1,t2是起的别名,使用where条件进行筛选)
    2. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580997247535-56a37aad-949a-4aaa-8a6c-c3e9d0b7f9f0.png#align=left&display=inline&height=164&margin=%5Bobject%20Object%5D&name=image.png&originHeight=164&originWidth=490&size=72845&status=done&style=none&width=490)
    3. - **显式内连接**(就是换了个语句,结果跟前者相同,inner可以省略)
    4. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580997450349-5bbafcb5-a689-4eb4-9dcb-320b62b06fa6.png#align=left&display=inline&height=69&margin=%5Bobject%20Object%5D&name=image.png&originHeight=69&originWidth=895&size=89283&status=done&style=none&width=895)
    5. - **注意**:
    6. - 从哪些表中查询数据
    7. - 条件是什么
    8. - 查询哪些字段
  • 外连接查询
    1. - **左外连接:**
    2. - **语法**:select 字段列表 from 1 left join 2 on 条件
    3. - 查询的是左表所有的数据以及其交集的部分。
    4. - **右外连接:**
    5. - **语法**:select 字段列表 from 1 right join 2 on 条件
    6. - 查询的是右表的数据以及其交集的部分
    7. - **注意:**
    8. - 查询的时候那个表的名字在代码的左边,查出来之后也是在左边
    9. - 一般只使用左外连接
  • 子查询

    1. - **概念:**查询中西昂套查询,称镶套查询为子查询。
    2. - **使用**:(其实很简单,就是对函数返回值的利用)
    3. - **![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580998599796-921ad802-b009-4968-9a19-5f0f5b59e33b.png#align=left&display=inline&height=248&margin=%5Bobject%20Object%5D&name=image.png&originHeight=248&originWidth=984&size=230017&status=done&style=none&width=984)**
    4. - **子查询的结果是单行单列:**
    5. - **子查询可以作为条件,运用运算符去使用<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580999255214-1f12385b-7e6c-4669-84cf-d8d3ac111202.png#align=left&display=inline&height=93&margin=%5Bobject%20Object%5D&name=image.png&originHeight=93&originWidth=957&size=102464&status=done&style=none&width=957)**
    6. - **子查询结果是多行单列的:**
    7. - **子查询可以作为条件,使用运算符 in 来判断<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581000465554-2747eb06-fabe-4934-ad8b-a086dea53726.png#align=left&display=inline&height=158&margin=%5Bobject%20Object%5D&name=image.png&originHeight=158&originWidth=1279&size=235280&status=done&style=none&width=1279)**
    8. - **子查询的结果是多行多列的:**
    9. - **子查询可以作为一张虚拟表(与另一张表联合查询)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1581000778666-15fc1c7c-c570-48ec-b8d4-e4ba5a373254.png#align=left&display=inline&height=133&margin=%5Bobject%20Object%5D&name=image.png&originHeight=133&originWidth=1171&size=156692&status=done&style=none&width=1171)**
    10. - **注意:**所有子查询都可以使用普通语句实现

    事务

    1. 事务的基本介绍

    1. - **概念**:
    2. - 如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功,要么同时失败
    3. - **操作**:
    4. - **开启事务**:setAutoCommit(false) (设置事务不自动提交)
    5. - ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1588864102054-f918eb4c-0e18-4b0b-8a47-71cc179b4b4c.png#align=left&display=inline&height=51&margin=%5Bobject%20Object%5D&name=image.png&originHeight=101&originWidth=888&size=25604&status=done&style=none&width=444)
    6. - **回滚:**rollback
    7. - **提交**:commit
    8. - **注意**:使用时回滚在最后,开启在最前,提交在中间
    9. - **数据提交问题:**
    10. - **自动提交:**
    11. - Mysql是自动提交的,一次增删改提交一次
    12. - **手动提交:**
    13. - 需要先开启事务,再提交
    14. - **修改事务的默认提交方式:**
    15. - **查看:select [@@autocommit;](#) **
    16. - **修改:set [@autocommit](#) = 0;**
    17. - **注:1代表是自动提交,0是手动提交(最后加个commit即可)**

    2. 事务的四大特征

    1. - **原子性:**是不可分割的最小操作单位,要么同时成功,要么同时失败
    2. - **持久性:**当事务提交或回滚后,数据库会持久化的保存数据
    3. - **隔离性:**多个事务之间。相互独立
    4. - **一致性:**事务操作前后,数据总量不变

    3. 事务的隔离级别

    1. - **概念:**多个事务之间隔离的,相互独立的,但是如果多个事务同时操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
    2. - **存在的问题:**
    3. - **脏读:**一个事务,读取到另一个事务中没有提交的数据
    4. - **不可重复读(虚读):**在同一个事务中,两次读取到的数据不一样
    5. - **幻读:**一个事操作数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
    6. - **隔离级别:**
    7. - **read uncommitted:**读未提交
    8. - **产生的问题**:脏读,不可重复读,幻读
    9. - **read committed:**读已提交(oracle默认)
    10. - **产生的问题:**不可重复读,幻读
    11. - **repeatable read:**可重复读
    12. - **产生的问题:**幻读(Mysql默认)
    13. - **serializable:**串行化
    14. - 可以解决所有问题
    15. - **注意: **
    16. - **隔离级别从小到大安全性越来越高,但是效率越来越低**
    17. - **数据库查询隔离级别**
    18. - **select [@@tx_isolation](#) **
    19. - **数据库设置隔离级别**
    20. - **set global transaction isolation level 级别字符串**
    21. - **设置之后需要重新启动数据库才生效**

**