数据库基本概念解析目录
1: 什么是数据库
2: 数据库的种类
3: 什么是关系型数据库
4: 什么是非关系型数据库
5: 关系型数据库存储数据的特点
6: MySQL数据库的存储位置及如何更改存储位置
数据库就是服务器提供的N种服务的一种,用来存储数据
1: 数据的存储方式(软件开发过程中的)
1-1: 内存
产生方式: 使用计算机的程序时产生
优势:内存存储/访问数据是最快的(此种存储方式可以用来优化访问速度)
缺点: 数据是临时存储的,程序关闭或PC关机,内存中的数据消失
1-2: 数据库服务器(对数据安全要求较高的机构,例如银行,公安等)
1-3: 第三方的云服务器(研究一下阿里云服务器,主要用来学习使用的云服务器)
阿里云,腾讯云,华为云
开发项目首选第三方云服务器,成本低
2: 数据库服务器(主要用来了解数据库服务器的概念,作用等)
2-1: 数据库服务器是通过一定的形式(有规律的存储,方便后面操作数据)存储数据
2-2: 常见数据库的类别: 关系型数据库,非关系型数据库
3:关系型数据库(主要使用的数据库服务类型,数据之间的关联是操作数据的基础)
3-1: 关系型数据库的逻辑结构
Server database datatable
关系型数据库服务 关系型数据库 数据表 三者之间是一对多的关系
关系型数据库服务是通过安装数据库软件完成的
关系型数据库是关系型数据库服务器提供的服务
数据表是关系型数据库中存储数据的形式
3-2: 关系型数据库中数据表中的数据是行和列的关系
3-3: 常见的关系型数据库:MySQL数据库,
4: MySql数据库(以他为例学习关系型数据库)
4-1: 开源的中小型数据库,可以用于各种操纵系统(mac,linux等)
4-2: MariaDB数据库于MySQl数据相同的使用形式(相同的作者尽心开发的,
但是MariaDB数据更新快)
4-3: 命令行工具命令
.exe是可执行文件
MySQL数据库的启动文件MySQLd.exe文件,位置: MySQL数据库安装目录bin目录下
MySQL数据库命令
登录: MySQL.exe -h127.0.0.1 -P3306 -uroot -p
简写: MySQL -uroot 这种形式因为root用户默认没有密码
退出: quit
数据库层:
show databases;
use 数据库名; 进入数据库
create database 数据库名 charset = utf8; 创建数据库
drop 数据库名; 删除数据库
drop database if exists 数据库名; 如果存在指定数据库会删除数据库
4: 非关系型数据库(微信小程序会涉及,使用的越来越多)
7: SQL命令
7-1: 结构化查询语言: 用于操作关系型数据(MySQL数据库是其中一个)操作: CRUD
7-2:SQL命令的执行方式
1: 交互模式:客户端中执行命令, 临时性的操作数据
2: 脚本形式: 客户端中执行,批量的操作数据
脚本模式的实现方式
1: 编写SQL命令的文本
2: 进入shell命令行界面--执行MySQL -Uroot<将SQL脚本拖拽到此处 回车
3: 脚本命令中注释的命令不在执行,注释的方式 #SQL命令 或者 /* SQL命令
即: SQL命令的语言规范
4: 脚本文件存储的文件格式是UTF-8
1: 什么是数据库
数据库就是存储/管理数据仓库。
2: 数据库的种类以及不同种数据库的常见数据库
1: 数据库种类: 关系型数据库与 非关系型数据
2: 常见关系型数据库: Oracle,Mysql,SqlServer
3: 常见非关系型数据库: Hive,Hbase(这两种数据库常用于大数据数据存储)
3: 什么是关系型数据库
关系型数据库的数据之间关系的属于强耦合关系
4: 什么是非关系型数据库
非关系型数据库的数据之间的关系属于松散关系
5: 关系型数据库存储数据的特点
1:关系型数据库以行和列的形式存储数据
2:关系型数据库这一系列的行和列被称为表,一组表组成了数据库。
3: 关系型数据库存储的单个数据又叫记录
6: MySQL数据库的存储位置及如何更改存储位置
在MySQL安装目录下data目录下的配置文件my.ini中会进行默认配置
数据库事务概念解析目录
1: 什么是数据库的事务
2: 数据库事务的特点
3: 数据库事务的隔离级别
4: 手动开启/结束MySQL数据库事务的方法
1: 什么是数据库的事务
1: 数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行
要么完全地不执行
2: 数据库会自动管理事务,MySQL数据库默认开启事务,每条SQL语句都有一个事务
3: 数据库事务在 关系型数据库与非关系型数据库都有
2: 数据库事务的特点
1: 数据库事务的特点(简称为ACiD)
1:原子性 2:一致性 3:隔离性 4:持久性
2: 原子性:一个事务中的所有操作要么全部完成, 要么全部不完成
注意:事务执行过程中如果发生错误,会发生事务回滚(Rollback)
3: 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏
4: 隔离性:数据库允许多个并发事务, 隔离性可以防止多个事务并发执行时由于交叉执行而导
致数据的不一致。
注意:操作数据库的执行者是线程
5: 持久性:事务处理结束后,对数据的增加/修改/删除就是永久的
3: 数据库事务的隔离级别(4种级别)
1:读未提交(Read uncommitted) 安全性最差,可能发生并发数据问题,性能最好(不常用)
2:读提交(read committed) Oracle默认的隔离级别(与MySQL默认级别相比 性能 更好)
3:可重复读(repeatable read)MySQL默认的隔离级别,安全性较好,性能一般 (与 Oracle默认级别相比 安全性 更好)
4:串行化(Serializable) 表级锁,读写都加锁,效率低下,安全性高,不能并发(不常用)
4: 手动开启/结束MySQL数据库事务的方法
1: 开启事务的两种方式:start transaction;/begin; 开启事务在执行SQL语句之前开启
2: 结束事务的两种方式:commit rollback
3: commit 表示提交事务, 提交事务后,对数据库中的新增/修改/删除会永久生效
rollback 表示事务回滚, 事务回滚到SQL语句执行之前, 即: 对数据库中任何操作都不会生效
数据库中的数据类型目录
1: 字符
2: varchar字符串
3: 大文本
4: 数字
5: 日期
6: 图片
1: 字符
char长度固定,不足使用空格填充,最多容纳2000个字符。
若知道字符的固定长度,使用char类型,因为查询速度快
2: varchar字符串
varchar长度不固定,最多容纳4000个字符,
varchar(11)存储abc,只占3位。查询稍慢,但节省空间,长度11,存储三位,剩下 的8个位置不会被占用
3: 大文本
以utf8编码计算的话,一个汉字在u8下占3个字节
4: 数字
1:tinyint,int整数类型
2:float,double小数类型
3:numberic(5,2) decimal(5,2)—也可以表示小数,表示总共5位, 其中可以有两位小数
4:decimal和numeric表示精确的整数数字
特殊点:如果字段的数据类型是int,在创建新表的时候,该字段可不用标明字段长度
5: 日期
1:date 包含年月日
2:time时分秒
3:datetime包含年月日和时分秒
4:timestamp时间戳,不是日期,而是从1970年1月1日到指定日期的毫秒数
6: 图片
二进制数据,可以存放图片、声音,容量4g。
数据库中只存储图片在磁盘中的文件路径
图片存储在磁盘中
数据库字段命名规则
1:字段名必须以字母开头,尽量不要使用拼音
2:长度不能超过30个字符(不同数据库,不同版本会有不同)
3:不能使用SQL的保留字,如where,order,group
4:只能使用如下字符az、AZ、0~9、$ 等
5:Oracle习惯全大写:USER_NAME,mysql习惯全小写:user_name
6:多个单词用下划线隔开,而非java语言的驼峰规则
数据库中字段约束解析目录
1: 什么是字段约束
2: 字段约束的种类
3: 主键约束解析
4: 非空约束解析
5: 唯一约束
6: 外键约束(foreign key)
7: 默认约束 default 默认值
8: 检查约束 check()
1: 什么是字段约束
1: 字段约束使用在创建数据表时,对字段属性进行约束
2: 字段约束的作用:保证输入字段中的数据符合我们的规定
2: 字段约束的种类
1: 主键约束 2: 非空约束 3: 唯一约束 4: 外键约束 5: 默认约束 6: 检查约束
3: 主键约束解析
1: 主键约束的特点: 数据唯一 不能为空
2: 添加主键约束的语法: primary key auto_increment
3: 使用主键约束的时间: 创建数据表时
4: 主键自增策略:
1: 表中主键通常是int类型的数据,为了方便维护,设置主键自增
2: 主键设置主键自增后,主键初始值为1,每添加一条记录,主键自动加一
3:添加主键的方式:1:SQL语句 ,2:可视化工具的的主键添加
4: 非空约束解析
1: 非空约束的特点: 字段值不可为空,可以重复
2:非空约束的语法:not null
5: 唯一约束
1: 唯一约束的特点:字段值唯一,可以为空
2:唯一约束的语法:unique
6: 外键约束(foreign key)
1: 外键约束的作用:通过两个表的主键,把两张表关联起来
2: 外键约束的使用位置:创建子表时,一般在最后一行
3: 外键约束的语法:foreign key (子表主键名称) references 主表名(主表主键名称)
特殊点: 1: 若主表中主键字段的某条记录没有,那么子表也不可创建该条记录的关联关系
2: 若要删除子表中的记录,需要先删除主表中的关联关系
3:若要删除主表,需要先删除子表,否则无法删除
7: 默认约束 default 默认值
1: 默认约束的概念/作用:给指定字段设置默认值
2: 默认约束的使用位置: 创建数据表时,在指定字段后添加默认约束
3: 默认约束的语法:default 默认值
8: 检查约束 check()
1: 检查约束的概念:用来检查数据是否合规,且可能因为数据库版本较低会不生效
2: 检查约束的使用位置: 创建数据表时,一般在最后几行
3: 检查约束的语法:
create table ha(
id int primary key auto_increment,
age int,
check(age > 0 and age <= 100)
);
数据库常用操作解析目录
1: 创建数据库
2: 删除数据库
3: 查看所有数据库
4: 查看当前数据库
5: 创建数据表
6: 删除数据表
7: 修改数据表
8: 所有数据 表 的语法
9:查看单张表的结构:
1: 创建数据库
创建数据库语法:create database 数据库名 Default character set utf8;
创建数据库语法解析:
Default character set utf8的作用:指定新建库的编码格式,防止中文乱码
2: 删除数据库
删库语法:drop database 数据库名;
注意:删除库会把库永久删除,所以需要注意删除操作
3: 查看所有数据库
show databases
4: 查看当前数据库
select database();
5: 创建数据表
第一步: 进入指定数据库 use 数据库名
第二步: 创建数据表
创建数据表的语法:
drop table if exists 表名;如果表存在则删除
create table 数据表名( 字段1名 字段数据类型 字段长度,//第一行通常设置主键 字段2名 字段数据类型 字段长度 //最后一个字段的字段长度 后不要 加“逗号” );
6: 删除数据表
第一步: 进入指定数据库 use 数据库名
第二步: 删除数据表
删除数据表的语法:drop table 数据表名;
7: 修改数据表
第一步: 进入指定数据库 use 数据库名
第二步: 修改数据表
修改数据表语法: alter table 表名 add column 字段名称 字段数据类型( 字段长度)
8: 所有数据 表 的语法:
show tables;
9:查看单张表的结构:
desc 表名;
SQL查询语句中的条件查询解析目录
1: 查询语句中的条件查询关键字
2: where关键字解析
3: like关键字解析
4: limit关键字解析
5: order by关键字解析
6: between and关键字解析
7: null关键字解析
8: distinct关键字解析
9: group by 关键字
10: 同一个查询语句中出现多个查询关键字如何处理
1: 查询语句中条件查询的关键字
查询语句中条件查询关键字一共有7个
分别是 1: where 2: like 3: limit 4: order by 5: between and 6: null 7: distinct
2: where关键字解析
1: where 关键字用来过滤数据
使用where关键字,进行过滤数据
2: 语法案例: select * from dept where deptno = 1
查询dept表中deptno字段等于1的所有数据
3: Where关键字中SQL查询语句的执行顺序:
第一步:确定查询那个表 第二步:确定过滤条件 第三步:确定查询那个字段
注意: 1: Where关键字后的过滤条件不能使用列别名
2:一条查询语句中只能有一个where关键字,并列的过滤条件之间用and连接
或者关系的过滤条件之间用 or 连接,这种过滤条件的个数没有限制
3: like关键字解析
1: like是模糊查询的关键字
2: 模糊查询的种类:
1:select * from dept where dname like "o%"
2:select * from dept where dname like "%o"
3:select * from dept where dname like "o%o"
注意:1:%是通配符也叫占位符,通配符%代表0到n个字符, 通配符下划线_代表1个 字符
2: "%o",以o结尾的数据 , "o%",以o开头的数据 , "%o%"数据中有o就行的数据
3:模糊查询的数据没有等号 where dname like "%o"
4:使用模糊查询需要配合where关键字进行使用
4: limit关键字解析
1: limit是分页查询的关键字,用来限制分页查询后,每页的记录数
2: 分页查询的SQL语句
1:select * from emp limit 2;取指定表中的前两条数据
2:select * from emp limit 2,3;从表中第三条记录开始,取3条数据
注意:1:当limit有两个参数时,第一个参数是开始位置,第二个参数分页后每页的记录个数
第一个参数的起点是0,
2:分页技术与过滤条件配合使用时,先使用过滤条件,在使用分页技术
原因:是SQL语句的执行顺序决定的
3:若有查询语句中有多个关键字,分页技术一般在查询语句的最后,且与前面的
关键字之间不使用任何符号,空格隔开即可
5: order by关键字解析
1: order by 是进行排序的关键字
2: 排序的种类 1:升序(默认是升序) 2:降序
select * from emp order by 字段名
6: between and关键字解析
1: between and 是用来查询指定字段的指定区间的关键字
2: SQL语句案例: select * from emp where sal between 5000 and 10000
解析:1:需要配合where关键字进行使用
2:包含指定区间的边界,即:指定的区间包括5000,10000
7: null关键字解析
1: 使用null的种类:1:is null 2:is not null
select * from emp where comm is null
select * from emp where comm is not null
2: 解析:1:null 使用时使用 is 来联系与字段之间的关系,而不是等号
2:配合Where 关键字进行使用,只能配合where关键字进行使用吗?
8: distinct关键字解析
1: distinct是去重关键字,作用是: 去除重复的记录行
2: 解析:select DISTINCT loc from dept
特殊点:1:顺序不可乱即:关键字在前,指定字段在后 2:关键后跟指定字段名,多个字段用逗号隔开
9: group by 关键字
1: group by 是分组关键字
2: 如果查询的数据需要分类分别,且查询时出现聚合列和非聚合列
通常按照非聚合列进行分组
3: 什么是聚合列: 就是聚合函数参数中的列
4: 查询语句中的 group by 与 where/having 的组合使用
1: group by 与 where 同时使用时,where 表示的过滤条件在前group by 分组操作在后,
即先过滤在分组:相对高效
注意:group by 与 where 同时使用时,where后不可使用聚合函数
2: group by和 having 的同时使用时,having表示的过滤条件在后group by 分组操作在前,
即先分组在过滤:相对低效
注意:过滤条件中使用聚合函数 ,必须使用group by与having 的组合
3:group by ,where,having 三者可以同时使用
顺序是:where 普通过滤条件 group by 分组的标准 having 使用聚合函数的过滤条件
10: 同一个查询语句中出现多个查询关键字如何处理
1:不同关键字代表不同过滤条件,不同的关键字之间用空格隔开即可
2:在同一条查询语句中使用不同关键字时,不同关键字之间的执行顺序不一样,
此时需要考虑使用关键字的顺序
SQL语句中函数解析目录
1: SQL语句中函数的种类
2: SQL语句中基础函数
3: SQL语句中聚合函数
4: SQL语句中出现聚合函数的处理方式
1: SQL语句中函数的种类
SQL语句中函数的种类:1:基础函数 2:聚合函数
函数使用的位置:使用在SQL查询语句中
SQL语句中函数的参数就是指定字段名
2: SQL语句中基础函数(11种基础函数)
1: 使用基础函数的语法: select 查询的指定字段,基础函数(基础函数的参数)from 表名
2: 基础函数名称及作用
1:lower--将指定字段的数据转小写,并显示查询结果
语法: select 'ABC',lower('ABC') from dept;
2:upper--将指定字段的数据转大写,并显示查询结果
3:length--数据的长度
注意:底层使用了UTF-8编码,一个字母占一个字节,一个汉字占三个字节
4:subst---截取指定字段后的值
substr(dname,3):截取Dname字段的值,从第三个字符开始截取,截取到最后
substr(dname,3,5):截取Dname字段的值,从第三个字符开始截取,截取到
第5个字符,头尾都包含
5:concat---指定字段后追加指定字符
concat(指定字段,拼接的字符),该方式是在指定字段后直接拼接
6:replace--替换指定字段的指定字符
replace(指定字段,指定字段中被替换的字符,用来替换的字符)
7:ifnull---如果指定字段中有null值,就替换指定值
ifnull(comm,10),如果comm字段中有null的数据,就替换成10
8:round & ceil & floor---对于小数的处理
round四舍五入,ceil向上取整,floor向下取整
1: round(指定字段名)四舍五入
round(指定字段名,1)四舍五入并保留一位小数
2:ceil(字段名)向上取整, floor(字段名)向下取整
向上取整就是舍掉小数,不管小数部分是多少,得数=原来的数的整数部分+1
向下取整就是舍掉小数,不管小数部分是多少,得数=原来的数的整数部分
9:uuid():返回UUID
SELECT UUID()
10:时间函数
1: select now() -- 年与日 时分秒
2: select curdate() --年月日
3: select curtime() --时分秒
4: 查询具体的年/月/日/时/分/秒的函数
year() & month() & day() & hour() & minute() & second()
5: select now(),year(now()),month(now()),day(now()) from emp ;
是查询现在时间 对应的 单独的 年月日
6: select now(),hour(now()),minute(now()),second(now()) from emp ;
是查询现在时间 对应的 单独的 时分秒
总结:查询单独的年月日时分秒,需要使用组合函数,例 year(now())
11:转义字符
反斜杠 (\) 表示转译的作用
即: 将SQL语句中有特殊作用的符号转译为符号本身
3: SQL语句中聚合函数(5种)
1: 聚合函数的种类:1:max最大值,2:min 最小值,3:sum 求和, 4:avg 平均数,5:count 个数
1:max()最大值 / min()最小值
解析:select max(sal), min(sal) from emp --求指定字段的最大值/最小值
2:sum() 求和/avg() 平均数
解析:select sum(sal), avg(sal) from emp --求指定字段的总和/平均值
3:count()个数
1:select count(*) from emp --低效 作用:查询指定表中的记录的个数
2:select count(1) from emp --效果和*一样,但比*高效,查询个数最常使用的形式 作用:查询指定表中的记录的个数
3:select count(comm) from emp --慢,只统计非NULL的 作用:根据字段名查询指定表中的记录的个数
4: SQL语句中出现聚合函数且需要分组的处理方式
1: 如果查询的数据需要分类分别,且查询时出现聚合列和非聚合列
通常按照非聚合列进行分组
2: 什么是聚合列: 就是聚合函数参数中的列
3: 查询语句中的 group by 与 where/having 的组合使用
1: group by 与 where 同时使用时,where 表示的过滤条件在前group by 分组操作在后,
即先过滤在分组:相对高效
注意:group by 与 where 同时使用时,where后不可使用聚合函数
2: group by和 having 的同时使用时,having表示的过滤条件在后group by 分组操作在前,
即先分组在过滤:相对低效
注意:过滤条件中使用聚合函数 ,必须使用group by与having 的组合
3:group by ,where,having 三者可以同时使用
顺序是:where 普通过滤条件 group by 分组的标准 having 使用聚合函数的过滤条件
SQL的执行顺序,由上往下 执行次序依次靠后
(1) FROM [left_table] 选择表
(2) ON <join_condition> 链接条件
(3) <join_type> JOIN <right_table> 链接
(4) WHERE <where_condition> 条件过滤
(5) GROUP BY <group_by_list> 分组
(6) AGG_FUNC(column or expression),... 聚合
(7) HAVING <having_condition> 分组过滤
(8) SELECT (9) DISTINCT column,... 选择字段、去重
(9) ORDER BY <order_by_list> 排序
(10) LIMIT count OFFSET count; 分页
常见的SQL语句优化
1:查询SQL语句中查询具体字段,尽量不要使用 *
使用 * 可能不会使用索引进行查询
2:避免在where过滤条件中使用or来连接过滤条件
使用or可能会使索引失效,从而全表扫描
3: 数据库的字符串类型数据尽量使用varchar,不使用char
varchar是可变字符串,会根据数据实际长度进行存储数据,不会浪费空间
4: 尽量使用数值替代字符串类型,可以提高查询效率
5: 查询尽量避免返回大量数据
查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。
如若返回数据很多,通常采用分页查询的方式
6: 使用索引指令 explain,查看SQL语句是否最优
7: 优化模糊查询,模糊查询SQL可能会使索引失效
优化方式: 尽量使用以什么为开头的模糊查询
8: 优化索引,优化方式: 索引表中索引个数不要超过5个
索引的本质是一个数据表,索引每次进行修改/删除/增加都会更新索引表,若个数很多,会消耗大量的时间和资源
索引不适合建在有大量重复数据的字段
9: 限定where过滤条件的个数, 避免返回无用的数据
10: 避免在where过滤条件中使用字段表达式操作/<>/!=不等于操作符
可能会时索引失效
11: 尽量进行批量插入操作,MySQL独有的,可以增加插入SQL语句的效率
12: 删除数据多,采用分批删除的方式,若一次删除数据过多,可能会造成锁表
13: 进行多表联查时,数据表的个数不要超过3个,若数据表个数过多,效率十分低
数据库最费劲的就是程序链接的释放。
假设链接了两次,每次做上百万次的数据集查询,查完就结束,
这样就只做了两次;相反建立了上百万次链接,申请链接释放反复重复,
就会额外花费很多实际,这样系统就受不了了,慢,卡顿
尽量使用union all替代union
union和union all的区别是,union会自动去掉多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复
union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序
union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION
数据库索引解析目录
1: 什么是索引
2: 索引的种类
3: 创建索引的方法
4: 查看索引的语法
5: 删除索引的语法
6: 使用索引的语法
7: 索引的优缺点
1: 什么是索引
1: 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。
2: 索引本身是一张表, 索引表保存了主键与索引字段,并指向实体表的记录
目前索引都采用BTree树方式构建
3: 索引是数据库的优化
2: 索引的种类
1: 单值索引:一个索引只包括一个列,一个表可以有多个列
2: 唯一索引:唯一索引只包含一个列,唯一索引列的值要求必须唯一,但允许为为空
注意:主键会自动创建唯一索引
3:复合索引:一个索引同时包括多列
3: 创建索引的语法
1:创建普通索引语法:create index 索引名 on 表名(字段名);
语法翻译成:给指定表中的指定字段创建普通索引
索引名的通常命名规则:字段名_index
2:创建唯一索引语法:alter table 表名 add unique(指定字段名)
要求:唯一索引要求指定字段中的记录不可重复,可以为空
语法翻译成:给指定表中的指定字段创建唯一索引
3:创建复合索引语法:alter table 表名 add index fuhe(指定字段名1,指定字段名2, 等)
1:复合索引的最左特性,除了最左边的字段,其他字段的索引特效可能会失效
2:最左特性:最左特性只针对复合索引
因为最左特性,复合索引有可能失效,失效的表现形式:在查询时如果没 有使用最左边的字段,索引加速查询的效果可能失效
3:创建复合索引时,有几个字段就会创建几个索引,并不是创建了一个索 引,且这几个字段单独的索引之间有关联关系
4:创建复合唯一索引语法:alter table 表名 add index fuhe(指定字段名1,指定字段名2,等)
4: 查看索引的语法
show index from 表名; 会展示指定表中创建好的所有索引
5: 删除索引的语法
alter table 表名 drop index 索引名
6: 使用索引的语法
1: 使用索引的位置: 查询SQL语句之前
2: 使用索引的指令: explain
3: 使用索引的语法案例
explain
select dname from dept;
注意:explain后没有分号,
作用:1:使用这种方式可以用来检验索引有无生效
2:如果使用了索引,可以看到使用的索引的信息
4: 使用索引关键字后返回的type的含义
1: ALL 全表扫描,没有优化,最慢的方式
2: index 索引全扫描
3: range 索引范围扫描,常用语<,<=,>=,between等操作
4: ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
5: eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
7: 索引的优缺点
7.1: 索引的优点
1: 索引事先对数据进行了排序,所以极大提高了查询效率
2: 大量降低数据库的IO磁盘读写成本,极大提高了检索速度
7.2: 索引的缺点
1: 索引是一张表,所以需要占用空间, 索引占用空间较多,
所以索引一般以文件的形式存放在磁盘中。
2: 索引表中的内容与业务表中的部分数据是重复,浪费空间
3: 数据量大的前提下, 索引提高了查询的速度
但是如果对数据库中的记录进行增、删、改的操作后,需要更新索引表
更新索引表会耗费大量时间
数据库中多表联查的目录:
1: 表的关联关系的种类
2: 什么是多表联查
3: 多表联查的方式
4: 笛卡尔积方式解析
5: join方式解析
6: 子查询的方式解析
7: 多表联查的缺点
1: 表的关联关系的种类
表关联概念:表与表之间的关联关系
表与表的关系分为四种:
1:一对一 one to one QQ和QQ邮箱,员工和员工编号
2:一对多 one to many 最常见,部门和员工,用户和订单
3:多对一 many to one 一对多反过来,员工和部门,订单和用户
4:多对多 many to many 老师和学生,老师和课程
2: 什么是多表联查
多变联查是指基于两个和两个以上的表的查询,并把数据展示出来
注意: 多表联查也可使用过滤条件进行过滤数据,过滤条件使用的两张表中相同字段
3: 多表联查的方式
1:笛卡尔积
2:join的方式,内连接,左连接,右连接
3:子查询方式
4: 笛卡尔积方式解析
1: 什么是笛卡尔积
将两个及以上的表数据都拼接起来,查询指定字段信息
笛卡尔积又称直积,一般笛卡尔积没有实际的业务意义,但多表查询都是先生成笛卡尔积,
再进行数据的筛选过滤
2: 笛卡尔积的语法
笛卡尔积的语法:select * from 表1名称,表2名称,表**名名称 过滤条件
例:1,基本结构SELECT * from dept,emp;
2,添加过滤条件1:select * from dept,emp where dept.deptno = emp.deptno;
注意:1,笛卡尔积的方式,查询的多个表之间用逗号隔开,
2,多表联查与单表查语法一样,两张表的关联关系用where来表示
3,过滤条件中,两张表的字段进行关联关系,需要具体表的具体字段
且具体的字段是两张表都有的字段
5: join方式解析
1: join方式的种类
1:内连接: inner join(inner 可以不写,默认就是inner)
2:外连接: 1:左连接,left join(左连接最常使用)
2:右连接,right join
2: join方式不同种类的区别
1:内连接 , inner join:取左右两个表中,都满足了条件的记录
即:INNER JOIN两边都对应有记录的才展示,其他去掉
2:左连接,left join:取 左 表中的所有记录 和 右 表满足了条件的记录
其中 右 表中不满足条件的记录用null填充
解析:右表不满足的条件的记录是指左表中的记录按照关联条件进行取 值,左表有的关联条件,右表没有
3:右连接,right join:取 右 表中的所有记录 和 左 表满足了条件的记录
其中 左表中不满足条件的记录用null填充
3: join方式的语法结构
select * from 表1名称 join 表2名称 on 两张表的关联条件 where 过滤条件
例:select dept.dname from emp join dept on dept.deptno = emp.deptno where emp.ename = "jack"
解析:该语句的执行顺序 1:先进入from后的第一个表 2:在按照 on 后的关联关系确定 join 后面表 要查询的字段 3:进入 join 后面的表并查询确定好的关联关系 4:按照过滤条件进行过滤 5:显示查询结果
该语句结构解析:1:from 后的结构就是有那些表
2:on 后的结构就是两张表的关联关系
3:where 后的结构因为过滤条件不同,所以不固定
6: 子查询的方式解析
1: 什么是子查询
子查询又叫嵌套查询,是普通查询语句的嵌套
2: 子查询的步骤:1:先根据过滤条件查出两张表的对应关联条件的记录
2:将第一步查询的结果作为过滤条件,进行查询最终的结果
3: 案例:列出research部门的所有员工的信息?
子查询第一步:select deptno from dept where dname = "research"
子查询第二步:select * from emp where deptno = (子查询第一步的代码/子查询第
一步返回的数据)
注意:若子查询第一步返回的数据超过 1 行,子查询第二步接收子查询第一步返回 的数据应该使用 in ,而不是等号
7: 多表联查的缺点
使用多表联查进行查询时,会在内存中先构建一个结果集,然后再进行数据的过滤。
这个结果集构建过程和所使用的内存资源,包括过滤时的判断,都是既耗费资源,又浪费时
间的, 所以尽量不使用多表联查