-
概述
-
P80.课程介绍:
- 数据库:存储和管理数据的仓库
- SQL:操纵做关系型数据库的编程语言
- 数据库管理系统:DBMS,操纵和管理数据库的大型软件
- 课程介绍:数据的的设计,数据库的操作,数据库的优化-索引
-
P81.MySQL-概述-安装配置
- 图文详述:MySQL的下载、安装、配置、使用_mysql下载-CSDN博客
- 语法:mysql -u用户名 -p密码[-h数据库服务器IP地址 -p端口号]
-
P82.数据模型&SQL简介
- 关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
- 特点:格式统一,便于维护;使用SQL语言操作,标准统一,可用于复杂查询
- SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。
- 可单行,可多行,以分号结尾
- 可以用空格/缩进增强语句的可读性
- MySQL数据库的SQL语句不区分大小写
- 注释:单行:--注释内容 或 #注释所有(MySQL特有);多行:/*注释内容*/
- SQL分类:
- DDL:数据定义语言
- DML:数据操作语言
- DQL:数据查询语言
- DCL:数据控制语言
- 关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
-
DDL
-
P83.DDL-数据库操作
- DDL,数据定义语言,用来定义数据库对象(数据库,表)。
- 查询:show databases
- 创建:creat database (if not exists)数据库名
- 删除:drop database (if exists)数据库名
- 使用:use 数据库名
- 注意事项:上属语法中的database,也可以替换成schema.
-
P84.DDL-图形化工具
- ......IDEA中有
-
P85.DDL-表结构操作-创建
- creat table 表名(
字段1 字段类型 [约束] [ comment 字段1注释],
......
字段n 字段类型 [约束] [ comment 字段n注释]
)[ comment 表注释];
- 约束:作用于表中字段上的规则,用于限制存储在表中的数据。目的是为了保证数据库中数据的正确性、有效性和完整性。
- 外键约束:foreign key ,让两张表的数据建立连接,保证数据的一致性和唯一性
- 默认约束:default ,保存数据是,如果未指定该字段值,则采用默认值
- 主键约束:primary key ,一行数据的唯一标识,要求非空且唯一
- 唯一约束:unique ,保证字段是唯一的,不重复的
- 非空约束:not null ,限制字段不能为空
-
P86.DDL-表结构操作数据类型
- MySQL中主要分为三类:数值类型、字符串类型、日期时间类型。
- 数值类型:有符号数,无符号数
- 字符串类型:char/varchar...;cha(10):最多占10个字符,不足10个字符,占用10个字符空间,varchar(10)最多只能存10个字符,不足10个字符,按照实际长度呢存储。
- 日期类型:date:年月日;time:时分秒;year:年份;datetime:年月日时分秒;
-
P87.DDL-表结构操作-创建-案例
-
P88.DDL-表结构操作-查询&修改&删除
- 查询
- show tables;查询当前数据库所有表
- desc 表名;查询表结构
- show create table 表名;查询链表语句
- 修改
- 添加字段:alter table 表名 add 字段名 类型(长度)[comment 注释] [约束];
- 修改字段:alter table 表名 modify 新数据类型(长度);
- 修改字段名和字段类型:alter table 表名 change 旧字段名 类型(长度)[comment 注释] [约束];
- 删除字段:alter table 表名drop column 字段名;
- 修改表名:rename table 表名 to 新表名;
- 删除
- 删除表:drop table [if exists] 表名;
- 查询
-
DML
-
P89.DML-添加数据insert
- DML:数据操作语言,用来对数据库中表的数据记录进行增、删、改操作。
- insert语法:
- 指定字段添加数据:insert into 表名(字段名1,字段名2) values (值1,值2);
- 全部字段添加数据:insert into 表名 values (值1,值2,...);
- 批量添加数据(指定字段):insert into 表名(字段名1,字段名2) values (值1,值2)(值1,值2);
- 批量添加数据(全部字段:insert into 表名 values (值1,值2,...)(值1,值2,...);
- 报错情况:
-
- 解决:
https://wenku.csdn.net/answer/36d4b1a2e4d611edbcb5fa163eeb3507
这是一个SQL语法错误,在编写SQL语法的过程中,可能出现格式错误的情况,建议严格检查。
-
P90.DML-修改数据-update
- 修改数据:update 表名 set 字段名1 = 值1,字段名2 = 值2,...[where 条件];
-
P91.DML-删除数据-delete
- 删除数据:delete from 表名 [where 条件];
- 注意事项:delete语句的条件可有可无,若没有条件,则删除整张表的数据;delete语句不能删除某一字段的值(若要此操作,可以用update,将该字段置为null)。
-
DQL
-
P92.DQL-基本查询
- 数据库操作-DQL(数据库查询语言)。关键字:SELECT。
- 基本查询语法:
- 查询多个字段:select 字段1,字段2,字段3 from 表名;
- 查询所有字段(通配符):select * from 表名;
- 设置别名:select 字段1 [as 别名1],字段2 [as 别名2] from 表名;
- 去除重复记录:select distinct 字段列表 from 表名;
-
P93.DQL-条件查询
- select 字段列表 from 表名 where 条件列表;
- 比较运算符,逻辑运算符
-
P94.DQL-聚合函数
- 将一列数据作为一个整体,进行纵向计算。语法:select 聚合函数(字段列表) from 表名。
- 函数和功能:(不对null值进行运算)
- count:统计数量。count(字段);count(常量);count(*)(推荐使用);
- max:最大值
- min:最小值
- avg:平均值
- sum:求和
-
P95.DQL-分组查询
- 语法:select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]
- where和having区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤;
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
- 执行顺序:where>聚合函数>having
-
P96.DQL-排序查询
- 语法:select 字段列表 from 表名 [where 条件列表] [group by 分组字段] order by 字段1 排序方式1,字段2 排序方式2...;
- ASC:升序(默认)
- DESC:降序
-
P97.DQL-分页查询
- 语法:select 字段列表 from 表名 limit 起始索引,查询记录数;
- 注意事项:
- 起始索引是从0开始的,起始索引=(查询页码-1)*每页显示记录数
- 分页查询是数据库的方言,不同的数据库有不同的实现方式,MySQL中是LIMIT
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10
-
P98.DQL-案例
- 函数
- if(表达式,tvalue,fvalue):当表达式为true时,取值为tvalue;当表达式为false时,取值fvlue;
- case expr where value1 then result1 [when value2 then value2...] [else result] end
- 总结
- 函数
-
多表设计
-
P99.多表设计-一对多
- 在数据库表中多的一方,添加字段,来关联一的一方的主键。
-
P100.多表设计-一对多-外键
- 外键语法:-- 创建表时指定:
create table 表名(
...
[constarint] [外键名称] foreign key (外键字段名) references 主表(字段名)
);
-- 建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(字段名);
- 外键约束
- 逻辑外键:在业务层逻辑中,解决外键关联。通过逻辑外键,就可以很方便的解决上述问题。
- 物理外键缺点:
- 影响增、删、改的效率(需要检查外键关系)
- 仅用于单节点数据库,不适用于分布式,集群场景
- 容易印发数据库的死锁问题,消耗性能。
- 物理外键:使用foreign key 定义外键关联的一张表
-
P101.多表设计-一对一&多对多
- 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。
- 实现:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNIQUE)
- 多对多:例如:一个学生可以选修多个课程,一个可能也可以供多个学生选择、
- 多对多实现:建立第三张中间表,中间表至少包含两个外间,分别关联两方主键
-
P102.多表设计-案例-关系分析
- 参考页面原型及需求,设计合理的表结构
- 一对多:在多的一方添加外键,关联另外一方的主键
- 一对一:任意一方,添加外键,关联另外一方的主键
- 多对多:通过中间表来维护,中间表的两个外键,分别关联另外两张表的主键
-
P103.多表设计-案例-表结构
多表查询
-
P104.多表查询-概述
- 多表查询:指从多张表中查询数据
- 笛卡尔积:笛卡尔成绩是指在数学中,两个集合(A集合和B集合)的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)
- 分类:
- 连接查询:
- 内连接:相当于查询A,B交集部分
- 外连接:
- 左外连接:查询左表所有数据(包括两张表交集部分)
- 右外连接:查询右表所有数据(包括两张表交集部分)
- 子查询:
- 连接查询:
-
P105.多表查询-内连接
- 语法:
- 隐式内连接:select 字段列表 from 表1,表2 where 条件...;
- 显式内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
- 语法:
-
P106.多表查询-外连接
- 左外连接:select 字段列表 from 表1 left [outer] jion 表2 on 连接条件...;
- 右外连接:select 字段列表 from 表1 right [outer] jion 表2 on 连接条件...;
-
P107.多表查询-子查询
- 介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询
- 形式:select * from t1 where column1 = (select column1 from t2 ...)
- 子查询外部的语句可以是insert/update/delete/select的任何一个,最常见的是select
- 标量子查询
- 子查询返回的结果是单个值(数字,字符串,日期等),最简单的形式
- 常用的操作符:= <> > >= < <=
- 列子查询
- 子查询返回的结果是一列(可以是多行)
- 常用的操作符:in、not in等
-
P108.多表查询-子查询(行、表)
- 行子查询
- 子查询返回的结果是一行(可以是多列)
-
常用的操作符:=、<>、in、not in等
- 行子查询
-
P109.多表查询-案例1
-
P110.多表查询-案例2
- 内连接:
- 外连接:
- 子查询:
-
事务
-
P111.事务-介绍与操作
- 概念:事务是一组操作的集合,他是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失效
- 注意事项:默认MySQL的事务是自动提交的,也即是说,当执行一条DML语句,MySQL会立即隐式地提交事务。
- 事务控制:
- 开始事务:start transaction;/begin;
- 提交事务:commit
- 回滚事务:rollback
-
P112.事务-四大特性
- 四大特性(ACID):原子性,一致性,隔离性,持久性
-
P113.索引-介绍
- 索引:帮助数据库高效获取数据的数据结构
- 优缺点:
- 优点:提高数据查询的效率,降低数据库的IO成本;通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗。
- 缺点:索引会占用存储空间;索引大大提高了查询效率,同时也降低了insert、update、delete的效率。
-
索引
-
P114.索引-结构
- 结构:我们平常所说的索引,如果没有特别指明,都是指默认的B+Tree结构组织的索引
- B+Tree(多路平衡搜索树)
- 每一个节点,可以存储多个key,(有n个key,就有n个指针)
- 所有的数据都存储在叶子节点,飞叶子节点仅用于索引数据
- 叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询
-
P115.索引-操作语法
- 创建索引:create [unique] index 索引名 on 表名 (字段名,...);
- 查看索引:show index from 表名;
- 删除索引:drop index 索引名 on 表名;
- 注意事项:
- 主键字段,在建表时,会自动创建主键索引。
- 添加唯一约束时,数据库实际上会添加唯一索引。