1. SQL查询命令详解
SELECT 字段1,字段2,字段3 FROM 表文件名
1.1 FROM命令
1.执行顺序:mysql共有7个查询命令,FROM命令永远是第一个执行的查询命令
2.执行作用:FROM命令相当于一个读取流,分则将硬盘上表文件加载到内存中生成一个【临时表】
供后续查询命令使用
由于查询命令对临时表数据进行操作,因此查询命令执行时,不会修改表文件原有的数据
语句详解:
-
FROM 表文件名
创建出一个 【临时表1】
临时表名称会与硬盘表文件名称保持一致 -
SELECT 字段1,字段2,字段3
1.select由于在FROM之后执行的,因此操作的是在内存中生成的【临时表1】
2.select会向指定字段下的所有数据读取出来,在内存中将读取的数据组成一个全新的临时表,得到【临时表2】
1.2 临时表
1.2.1 临时表的定义
- 临时表是由查询命令在执行时,在内存中生成的表文件
临时表一般是隐藏文件,不必在意
- 每一个查询命令在执行时,实际上操作都是上一个查询命令生成的临时表
1.2.2 临时表生命周期
-
在当前查询命令执行完毕后,MySQL服务器自动将上一个查询命令生成的临时表从内存中销毁。
-
用户最终看到的临时表只能是查询语句中,最后一个查询生成的临时表
1.2.3 七个查询命令与临时表之间关系
-
7个查询命令中,只有FROM命令不需要操作临时表,FROM负责将硬盘上表文件加载到内存中生成的一个临时表
剩下6个查询命令操作的都是上一个查询命令生成的临时表 -
7个查询命令中,只有GROUP BY命令在执行完毕后,才有机会在内存中生成多个临时表。
其他5个查询命令在执行完毕后,只能在内存中生成一个临时表 -
7个查询命令中,只有HAVING命令在执行完毕后,不会生成新临时表。负责将GROUP BY生成的临时表中不满足条件的临时表从内存中进行删除处理
1.3 WHERE命令
SELECT 字段1,字段2 FROM 表文件名 WHERE 字段2=值
- 执行顺序:
FROM==>WHERE>SELECT
- 书写顺序:
SELECT 字段名,函数,子查询
FROM 表文件名
WHERE 逻辑运算
1.3.1 WHERE作用
1.循环遍历临时表所有的数据和,每次得到一个数据和,根据数据和信息判断数据和是否需要被定位。
2.在循环完毕后,WHERE命令将所有定位的数据行
读取出来在内存中生成一个临时表进行保存
1.3.2 ‘与’ 和 ‘或’ - and 和 or
and
:‘与’ 运算符
- 相当于
&&
or
:‘或’ 运算符
- 相当于
||
示例使用方法===↓↓=↓↓=
select * from 表文件名 字段名 = 某值 and(并且) 逻辑运算符
select * from 表文件名 where 字段名 = 某值 or(或者) 字段名 = 某值 or 字段名 = 某值
1.3.3 in 运算符
- 该运算符在筛选字段名相同情况下可以简化
or
运算符的运算
from 表文件名 where 字段名 in(值,值,值,值,值)
# ============================================ #
where 字段名 in(值,值,值,值,值)
# 相当于:
where 字段名 = 值 or 字段名 = 值 or 字段名 = 值
# 本身in只需要一个或多个值就可以了,所以还可以这样子玩
from 表文件名 where 字段名 in(
select 值,值,值 from 表文件名
)
1.3.4 not in 运算符
- 该运算符翻译过来就是:不是或者不能
from 表文件名 where 字段名 not in(值,值,值,值,值)
# ============================================ #
where 字段名 not in(值,值,值,值,值)
# 相当于:
where 字段名 != 值 and 字段名 != 值 and 字段名 != 值
1.4 MySQL中的null值
在MySQL中null值,不表示空含义。它表示一个不确定的值,这个值既然是不确定的,因此无法进行任何运算
1.4.1 is null 运算符
- 该运算符是MySQL专门给null值查询创建的关键字
select * from 表文件 where 字段 = null #无法得到真实数据
from 表文件 where 字段名 is null
1.4.2 is not null 运算符
- 查询**【不为null】**
select * from 表文件 where 字段 != null #无法得到真实数据
from 表文件 where 字段名 is not null
1.5 模糊查询
- like 模糊查询
select * from 表文件名 where 字段 like 值
-
以s开头的字符串【前置条件模糊查询】:
s%
% 是一个通配符,表示一个长度的任意字符串
-
以s结尾的字符串【后置条件模糊查询】:
%s
-
某字符串中包含了s :
%s%
-
字符串中第二个字符是A :
_A%
_下划线是通配符,表示一个任意字符
例如:
# 查找出存在 s字符的所有数据
select * from 表文件名 where 字符 like '%s%'
1.6 聚合函数
- 用于对临时表指定字符按下【所有内容】进行统计的函数
- 包含方法为:
max(字段)
、min(字段)
、sum(字段)
、avg(字段)
、count(字段)
-
max(字段): 返回指定字段下最大值
select max(字段名) from 表文件名 where 字段名 = 值
-
max(字段): 返回指定字段下最小值
select min(字段名) from 表文件名 where 字段名 = 值
-
sum(字段): 返回指定字段下所有数据相加之和
select sum(字段名) from 表文件名 where 字段名 = 值
-
avg(字段): 返回指定字段下所有的数据平均值
select avg(字段名) from 表文件名 where 字段名 = 值
-
count(字段): 返回指定字段下内容不等于null的数据个数
select avg(字段名) from 表文件名
count(*) //统计临时表下所有数据行个数,不考虑数据是否存在null
1.7 group by 命令 - 分组
- 分组查询命令
select * from 表文件名 group by 依据
- 执行顺序
FROM==>WHERE==>GROUP BY==>SELECT
- 示例
SELECT 字段名,函数名,子查询
FROM 表名称
WHERE 定位数据行条件
GROUP BY 分组字段
- 如果同时出现
WHERE
与GROUP BY
,那么GROUP BY
应该再WHERE
之后
1.7.1 执行原理
GROUP BY
执行时
首先根据分组字段种类,将临时表中的数据行进行分类
然后将具有相同特征的数据行读取出来保存到一个全新的临时表
中
七各查询命令中,只有GROUP BY有机会再执行完毕后,一次生成多个临时表
1.7.2 多字段分组
SELECT 字段名,字段名 FROM 表文件名 GROUP BY 多字段
规则:
1.多字段分组时,分组字段出现顺序对于最终查询结果是没有任何影响的。
GROUP BY 字段1,字段2 # GROUP BY 字段2,字段1 两者结果是一样的
2.多字段分组时,GROUP BY 一次只能对一个分组字段进行分组
GROUP BY 字段1,字段2 # 该语句需要执行两次,一次分字段1,一次分字段2
3.多字段分组时,从第二个分组字段开始,操作的是上一个分组字段生成的临时表
GROUP BY 字段1,字段2 # 当执行GROUP BY 字段2时,操作的临时表由GROUP BY 字段1生成的
1.8 order by 命令 - 排序
- sql命令的查询,默认是升序排序
select 字段名1,字段名2,字段名3 from 表文件名 order by 排序依据 desc(降序)
1.9 having 命令
- 通过统计临时表决定是否删除临时表
select 字段名1,cunt(*) from 表文件名 group by 字段名1 having 依据
- 执行顺序:
FROM==>WHERE==>GROUP BY==>HAVING==>SELECT
HAVING 命令不能独立出现在查询语句,只能出现在GROUP BY后面
- 执行原理:
HAVING命令在GROUP BY之后执行的。
它负责将GROUP BY生成临时表中不满足条件的临时表从内存中删除掉
七个查询命令中,只有HAVING命令不会生成临时表,不但不生成,若条件不满足还会删除临时表
1.10 limit 命令
- MySQL服务器中,表文件字段位置从1开始计算,表文件数据行位置从0开始计算
select * from 表文件名 order by 依据字段 desc limit 0,1
- 执行顺序:
FROM ==> WHERE ==> GROUP BY ==> HAVING ==> SELECT ==> ORDER BY ==> LIMIT
示例:
SELECT 字段,函数,子查询
FROM 表
WHERE 定位数据行条件【逻辑运算/特殊运算符】
GROUP BY 分组字段,多个分组字段以 ‘,’ 号隔开
HAVING 对临时表进行删除判断条件
ORDER BY 排序字段
LIMIT 起始行位置,从起始行开始向下截取的行数
- 执行原理:
从临时表中指定位置的数据行开始,向下截取指定数量的数据行。
将截取出来的数据行保存到一个全新的临时表
2. 联表
2.1 多表查询
- 概述:
多张表数据行合并到同一个临时表,然后使用【六个查询命令】根据需求对临时表进行定位分组排序等操作。
最终为用户提供需要的数据的查询过程
- 关键点:
如何将多张表的信息合并到一张表?
2.2 连接查询合并方案
- 首先确保两张表之间存在【隶属关系】,才可以使用连接查询合并方案
- 将两张表数据行沿着水平方向进行拼接,最终可以得到一个拥有【完整隶属关系】新数据行
2.3 联合查询合并方案 / 内连接
- 不需要两张表之间之间存在【隶属关系】
- 将两张表中数据行沿着垂直方案进行堆上
from 一方表 join 多方表
from 多方表 join 一方表
on 条件过滤 where 逻辑运算符
2.4 外连接过滤方案
- 需要被帮助表:
- 不要被帮助表:
- 执行原理:
如果【需要被帮助表】中某行数据与【不需要被帮助表】所有的数据行都无法拼接为合法数据
此时依然将这个数据作为一个独立的数据行存入到新的临时表
2.4.1 左外连接过滤方案 / 左外连接查询
FROM 需要被帮助的表 LEFT JOIN 不需要被帮助的表
ON 合法数据行定位条件
2.4.2 右外连接过滤方案 / 右外连接查询
FROM 不需要被帮助的表 RIGHT JOIN 需要被帮助的表
ON 合法数据行定位条件
3. 子查询:
select 字段名,函数 from (子查询)
- from 将硬盘上表文件加载道内存中生成一个临时表
指向内存中已经存在的临时表,此时可以借助于子查询提供这个临时表
示例:
select 字段名1,字段名2 from(子查询语句) as 自定义表名
where
可以通过子查询得到进行判断数据
示例:
select 字段名1,字段名2 from 表名 where 字段名 判断条件 (子查询语句)
group by
不可以通过子查询得到数据,但是可以通过分组字段进行分组
having
可以通过子查询得到删除临时表时需要的数据
示例:
select 字段名,函数
from 表名
group by 字段名
having 函数 判断条件 (子查询语句)
order by
不可以通过子查询得到数据,只能进行排序字段对表进行排序limit
也不可以通过子查询得到数据。
4. 数据类型
4.1 整数类型
通常就是:int
类型
4.2 字符串类型
- 分类:
varchar
与char
4.2.1 varchar(m) :定长可变字符串
可以规定字符的最大存储个数
ename varchar(3)
3表示ename字符按可以存储3个英文字符或者3个中文字符
描述:
- 定长:当前字段可以存储的字符个数是固定的
- 可变:字段在硬盘上存储字符空间可以根据实际情况进行【缩小】
!可变的字段值只能是比设置最大值的小或者相等;
实际值 <= m
ename varchar(3)
insert into test1 values('abc') // 硬盘 【a】 【b】 【c】
insert into test1 values('de') // 硬盘 【d】 【e】
insert into test1 values('defg') // 报错!超出规定范围
4.2.2 char(m):定长不可变字符串
sex char(1) // 1表示可以存储1个英文字符或者1个中文字符
- 不可变:字段在硬盘上存储空间是固定的
sex char(3)
insert into test1 values('abc') // 硬盘 【a】 【b】 【c】
insert into test1 values('de') // 硬盘 【d】 【e】 【空格】
针对char类型字段数据读取时,MySql服务器自动将字符串中结尾处空格去掉
若是插入字符串以空格结尾,不要添加道由char类型修饰的字段
4.3 日期与时间类型
MySQL允许对TIME
、DATETIME
和 TIMESTAMP
使用小数秒,精度最高可达微秒(6位小数)。要定义包含小数秒日期和时间数据类型的列
示例:
TIME(3)
DATETIME(6)
TIMESTAMP(0)
4. 约束
约束是mysql服务器中提供的一个工具,它确保每一项数据都是有意义
4.1 非空约束
- 要求管理的字段不能存储null值
CREATE TABLE test1(
字段名 字段类型,
字段名 字段类型 NOT NULL // 为当前行字段添加非空约束
)
4.2 唯一性约束
- 要求管理的字段存储值不能有重复,但是可以存储null值
CREATE TABLE test2(
字段名 字段类型,
字段名 字段类型 unique // 为当前行字段添加唯一性约束
)
4.3 主键约束
- 管理主键字段,要求主键字段内容不能为null同时也不能出现重复值
CREATE TABLE test3(
字段名 字段类型 PRIMARY KEY // 为当前行字段添加主键约束
)
4.4 外键约束
- 管理外键字段,要求外键字段的值应该来自于关联的一方表中主键字段的值,但是可以存储null值
ALTER TABLE 多方表名
ADD CONSTRAINT 外键约束对象名(自定义) foreign key(外键字段名)
REFERENCES 一方表(主键字段)
5. 索引
5.1 查询速度问题
由于表文件存放数据行会随着时间推移,会越来越多。
where命令在指向时选哟对表文件所有的数据行进行遍历
所以时间越久,数据行越大,where命令执行时消耗时间就会不断增加
5.2 索引作用
在表文件数据行增加时候,不会大幅度降低查询语句执行效率
- 索引工作原理:
数据1 【100,80,20,50,90,120,30】 20
数据2 【11,15,19,22,56,66,181】 15
分别从两组数据得到最小值,通过实验可发现:
- 从数据2得到最小值消耗时间相对较少
- 从数据1进行判断时,首先将数据进行一次排序,然后根据排序顺序定位最小值
- 由于数据2实现排好了顺序,因此直接从第一位抓取数据,避免排序过程,因此执行效率高
翻译为人话就是:
- 事先将字段中内容进行排序,在WHERE命令进行定位时,避免在表中所有的数据行进行遍历将会提升查询速度
5.3 索引管理:
- 将字段内容交给某个索引进行管理
create index 索引名 on 表名(字段)
- 查询表文件关联的索引
show index from 表名
在为表文件绑定【主键约束】,【唯一性约束】,【外键约束】时
mysql服务器自动将当前字段数据进行排序交给指定索引管理
- 删除表文件指定索引
DROP INDEX 索引名 ON 表名
6. 执行计划
- 命令格式:exlian 查询语句
6.1 作用
- 展示当前查询得到结果是否通过索引来进行定位
DBA通过执行计划了解在本次查询过程,是否使用预先创建好的索引
6.2 执行计划对于查询语句执行效率判断
-在执行计划中,通过type属性展示查询语句执行效率
- 如下介绍属性由:5.2.1 》 代表执行效率分类:【慢----快】
6.2.1 ALL
where
对表文件所有的数据进行遍历,才得到了查询结果
这种级别查询语句,随着数据行增加导致执行速度大幅度降低
(对于DBA来说,会极力避免这种级别查询)
6.2.2 type
where
对表文件所有的数据进行遍历,在select抓取字段内容时,从索引中抓取。
这种级别虽然在抓取数据速度有所提升,但是依然面对随着数据行增加导致执行速度大幅度降低的问题
select ename from emp; // all
create index name_index on emp(ename)
select ename from emp; // type,此时对于查询速度提升是非常微小的
(对于DBA来说,会极力避免这种级别查询)
6.2.3 range
where
不会对表文件数据行进行遍历,而是直接从索引中得到需要定位的数据行行数,将大幅度提升查询效率。这是DBA进行SQL优化时要保证的最低级别。
explain select * from 表名 where 判断条件 // all
create index name_index on 表名(字段)
explain select * from 表名 where 判断条件 // range
但是这种级别存在【不稳定性】,当字段内容发生变化时,导致索引失效
mysql 服务器如果发现从索引得到数据行行数达到了表文件总行数的1/3时,此时考虑成本问题将会放弃使用索引
6.2.4 ref
where
不会对表文件数据行进行遍历
而是直接从索引中得到需要定位的数据行行数,同时在这种情况下根据定位条件一次只能得到一个数据行,属性比较稳定执行效率,DBA努力达到的优化程度
6.2.5 const
- 根据主键字段上索引进行定位,是执行效率最快的。
但是在实际使用过程中,是基本不会用到的
7. 视图
7.1 定义
是MySql服务器中的一个对象,用于存储查询语句。
目的提供查询语句使用效率,避免在多处地方重复性开发相同查询语句
7.2 命令
- 将查询语句交给一个视图对象管理
CREATE VIEW 视图对象名 AS 查询语句
- 通过视图对象调用管理查询语句
SELECT * FROM 视图对象名
7.3 额外功能
视图对象存储一个查询语句,同时视图对象拥有对当前查询语句关联的表文件操作能力
- 通过视图对象对关联表文件数据行进行查询
- 通过视图对象对关联表文件数据行进行删除
- 通过视图对象对关联表文件数据行进行更新
7.4 视图作用
-
提高了查询语句复用性,避免了在多出地方重复进行查询语句开发行为
-
隐藏业务中涉及表关系,开发人员通过视图进行操作时是不会知道其具体操作的表
8. 存储引擎
8.1 定义
是MySql服务器对于表文件内容管理方式。
目前MySql服务器主要采用两种方式:
- INNODB (安全性)
- MyIsam (执行速度)
8.2 管理命令
- 查看MySql服务器支持存储引擎种类
show engines;
- 设置表文件依赖存储引擎
show create table 表名 alter table 表名 engine = myisam
8.3 MyIsam 存储引擎特征
1.在对表文件内容机械能修改时,不会进行备份操作
提高操作执行效率
,但是在操作完毕后无法取消本次操作
- MyIsam存储引擎 :使用三个文件存储表文件信息
- test1.frm: 存储表文件文件信息
- test1.myd: 存储表文件数据行信息
- test1.myi: 存储表文件字段关联的索引信息
8.4 INNODB 存储引擎:
-
在对表文件的内容进行修改时,首先进行一次备份
在进行相关操作,因此执行效率相对较慢
。
但是在执行完毕后,由于有备份的存在,可以使用备份取消当前操作。
这样可以增加数据的安全性
-
INNODB存储引擎:使用一个文件存储表文件信息
test1.from: 存储表文件字段信息,
存储表文件数据行信息,
存储表文件字段关联的索引信息
9. 事务:
- 事务是MySql服务器提供一个管理对象,用于对当前表文件备份进行管理
当多个用户同时请求修改某个数据时,通过事务可以保证数据从一个一致性状态变更为另外一个一致性的状态
例如:A用户给B用户转10000元, 需要在A用户帐户中减少10000元,在B用户的帐户中增加10000元,这两个操作应该是一个原子操作,要么两个都修改成功,要么这两个操作都没发生
在MySQL数据库中的InnoDB 存储引擎支持事务, MyISAM 不支持事务
9.1 ACID特性:
- 原子性(Atomicity) :把事务中所有的操作看作是一个整体,事务对数据的修改要么完全提交要么回滚
- 一致性(Consistency) :在事务完成时,必须使所有的数据从一个一致性状态变更为另外一个一致性状态
- 隔离性(Isolation) :一个事务中的操作语句对数据所做的修改必须与其他事务所做的修改相隔离.
- 持久性(Durability) :在事务完成后,所做的修改是永久的
9.2 使用指令
start transaction; // 通知MySql服务器提供一个事务对象,这个事务对象对接下来操作产生所有备份机械能管理
delete from 表名 where 判断条件 // 生成备份文件:表名.bak
rollback; // 通知MySql服务器将本次操作中所有备份信息覆盖道表文件,来取消本次操作
commit; // 通知MySql服务器将本次操作中生成所有的备份信息进行删除,称之为提交操作