SELECT 字段1,字段2,字段3 FROM 表文件名
1.执行顺序:mysql共有7个查询命令,FROM命令永远是第一个执行的查询命令
2.执行作用:FROM命令相当于一个读取流,分则将硬盘上表文件加载到内存中生成一个【临时表】 供后续查询命令使用
由于查询命令对临时表数据进行操作,因此查询命令执行时,不会修改表文件原有的数据
语句详解:
FROM 表文件名
创建出一个 【临时表1】
临时表名称会与硬盘表文件名称保持一致
SELECT 字段1,字段2,字段3
1.select由于在FROM之后执行的,因此操作的是在内存中生成的【临时表1】
2.select会向指定字段下的所有数据读取出来,在内存中将读取的数据组成一个全新的临时表,得到【临时表2】
临时表一般是隐藏文件,不必在意
SELECT 字段1,字段2 FROM 表文件名 WHERE 字段2=值
FROM==>WHERE>SELECT
SELECT 字段名,函数,子查询
FROM 表文件名
WHERE 逻辑运算
1.循环遍历临时表所有的数据和,每次得到一个数据和,根据数据和信息判断数据和是否需要被定位。
2.在循环完毕后,WHERE命令将所有定位的数据行
读取出来在内存中生成一个临时表进行保存
and
:‘与’ 运算符
&&
or
:‘或’ 运算符
||
示例使用方法===↓↓=↓↓=
select * from 表文件名 字段名 = 某值 and(并且) 逻辑运算符
select * from 表文件名 where 字段名 = 某值 or(或者) 字段名 = 某值 or 字段名 = 某值
or
运算符的运算from 表文件名 where 字段名 in(值,值,值,值,值)
# ============================================ #
where 字段名 in(值,值,值,值,值)
# 相当于:
where 字段名 = 值 or 字段名 = 值 or 字段名 = 值
# 本身in只需要一个或多个值就可以了,所以还可以这样子玩
from 表文件名 where 字段名 in(
select 值,值,值 from 表文件名
)
from 表文件名 where 字段名 not in(值,值,值,值,值)
# ============================================ #
where 字段名 not in(值,值,值,值,值)
# 相当于:
where 字段名 != 值 and 字段名 != 值 and 字段名 != 值
在MySQL中null值,不表示空含义。它表示一个不确定的值,这个值既然是不确定的,因此无法进行任何运算
select * from 表文件 where 字段 = null #无法得到真实数据
from 表文件 where 字段名 is null
select * from 表文件 where 字段 != null #无法得到真实数据
from 表文件 where 字段名 is not null
select * from 表文件名 where 字段 like 值
s%
% 是一个通配符,表示一个长度的任意字符串
%s
%s%
_A%
_下划线是通配符,表示一个任意字符
例如:
# 查找出存在 s字符的所有数据
select * from 表文件名 where 字符 like '%s%'
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
select * from 表文件名 group by 依据
FROM==>WHERE==>GROUP BY==>SELECT
SELECT 字段名,函数名,子查询
FROM 表名称
WHERE 定位数据行条件
GROUP BY 分组字段
WHERE
与 GROUP BY
,那么 GROUP BY
应该再 WHERE
之后GROUP BY
执行时
首先根据分组字段种类,将临时表中的数据行进行分类
然后将具有相同特征的数据行读取出来保存到一个全新的临时表
中
七各查询命令中,只有GROUP BY有机会再执行完毕后,一次生成多个临时表
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生成的
select 字段名1,字段名2,字段名3 from 表文件名 order by 排序依据 desc(降序)
通过统计临时表决定是否删除临时表
select 字段名1,cunt(*) from 表文件名 group by 字段名1 having 依据
执行顺序:
FROM==>WHERE==>GROUP BY==>HAVING==>SELECT
HAVING 命令不能独立出现在查询语句,只能出现在GROUP BY后面
HAVING命令在GROUP BY之后执行的。 它负责将GROUP BY生成临时表中不满足条件的临时表从内存中删除掉
七个查询命令中,只有HAVING命令不会生成临时表,不但不生成,若条件不满足还会删除临时表
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 起始行位置,从起始行开始向下截取的行数
多张表数据行合并到同一个临时表,然后使用【六个查询命令】根据需求对临时表进行定位分组排序等操作。 最终为用户提供需要的数据的查询过程
如何将多张表的信息合并到一张表?
from 一方表 join 多方表
from 多方表 join 一方表
on 条件过滤 where 逻辑运算符
如果【需要被帮助表】中某行数据与【不需要被帮助表】所有的数据行都无法拼接为合法数据 此时依然将这个数据作为一个独立的数据行存入到新的临时表
FROM 需要被帮助的表 LEFT JOIN 不需要被帮助的表
ON 合法数据行定位条件
FROM 不需要被帮助的表 RIGHT JOIN 需要被帮助的表
ON 合法数据行定位条件
select 字段名,函数 from (子查询)
示例:
select 字段名1,字段名2 from(子查询语句) as 自定义表名
where
可以通过子查询得到进行判断数据
示例:
select 字段名1,字段名2 from 表名 where 字段名 判断条件 (子查询语句)
group by
不可以通过子查询得到数据,但是可以通过分组字段进行分组
having
可以通过子查询得到删除临时表时需要的数据
示例:
select 字段名,函数
from 表名
group by 字段名
having 函数 判断条件 (子查询语句)
order by
不可以通过子查询得到数据,只能进行排序字段对表进行排序limit
也不可以通过子查询得到数据。通常就是:int
类型
varchar
与 char
可以规定字符的最大存储个数
ename varchar(3)
3表示ename字符按可以存储3个英文字符或者3个中文字符 描述:
ename varchar(3)
insert into test1 values('abc') // 硬盘 【a】 【b】 【c】
insert into test1 values('de') // 硬盘 【d】 【e】
insert into test1 values('defg') // 报错!超出规定范围
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类型修饰的字段
MySQL允许对TIME
、DATETIME
和 TIMESTAMP
使用小数秒,精度最高可达微秒(6位小数)。要定义包含小数秒日期和时间数据类型的列
示例:
TIME(3)
DATETIME(6)
TIMESTAMP(0)
约束是mysql服务器中提供的一个工具,它确保每一项数据都是有意义
CREATE TABLE test1(
字段名 字段类型,
字段名 字段类型 NOT NULL // 为当前行字段添加非空约束
)
CREATE TABLE test2(
字段名 字段类型,
字段名 字段类型 unique // 为当前行字段添加唯一性约束
)
CREATE TABLE test3(
字段名 字段类型 PRIMARY KEY // 为当前行字段添加主键约束
)
ALTER TABLE 多方表名
ADD CONSTRAINT 外键约束对象名(自定义) foreign key(外键字段名)
REFERENCES 一方表(主键字段)
由于表文件存放数据行会随着时间推移,会越来越多。 where命令在指向时选哟对表文件所有的数据行进行遍历 所以时间越久,数据行越大,where命令执行时消耗时间就会不断增加
在表文件数据行增加时候,不会大幅度降低查询语句执行效率
数据1 【100,80,20,50,90,120,30】 20
数据2 【11,15,19,22,56,66,181】 15
分别从两组数据得到最小值,通过实验可发现:
翻译为人话就是:
create index 索引名 on 表名(字段)
show index from 表名
在为表文件绑定【主键约束】,【唯一性约束】,【外键约束】时 mysql服务器自动将当前字段数据进行排序交给指定索引管理
DROP INDEX 索引名 ON 表名
-在执行计划中,通过type属性展示查询语句执行效率
where
对表文件所有的数据进行遍历,才得到了查询结果
这种级别查询语句,随着数据行增加导致执行速度大幅度降低(对于DBA来说,会极力避免这种级别查询)
where
对表文件所有的数据进行遍历,在select抓取字段内容时,从索引中抓取。
这种级别虽然在抓取数据速度有所提升,但是依然面对随着数据行增加导致执行速度大幅度降低的问题select ename from emp; // all
create index name_index on emp(ename)
select ename from emp; // type,此时对于查询速度提升是非常微小的
(对于DBA来说,会极力避免这种级别查询)
where
不会对表文件数据行进行遍历,而是直接从索引中得到需要定位的数据行行数,将大幅度提升查询效率。这是DBA进行SQL优化时要保证的最低级别。explain select * from 表名 where 判断条件 // all
create index name_index on 表名(字段)
explain select * from 表名 where 判断条件 // range
但是这种级别存在【不稳定性】,当字段内容发生变化时,导致索引失效 mysql 服务器如果发现从索引得到数据行行数达到了表文件总行数的1/3时,此时考虑成本问题将会放弃使用索引
where
不会对表文件数据行进行遍历
而是直接从索引中得到需要定位的数据行行数,同时在这种情况下根据定位条件一次只能得到一个数据行,属性比较稳定执行效率,DBA努力达到的优化程度但是在实际使用过程中,是基本不会用到的
是MySql服务器中的一个对象,用于存储查询语句。 目的提供查询语句使用效率,避免在多处地方重复性开发相同查询语句
将查询语句交给一个视图对象管理
CREATE VIEW 视图对象名 AS 查询语句
通过视图对象调用管理查询语句
SELECT * FROM 视图对象名
视图对象存储一个查询语句,同时视图对象拥有对当前查询语句关联的表文件操作能力
是MySql服务器对于表文件内容管理方式。 目前MySql服务器主要采用两种方式:
查看MySql服务器支持存储引擎种类
show engines;
设置表文件依赖存储引擎
show create table 表名
alter table 表名 engine = myisam
1.在对表文件内容机械能修改时,不会进行备份操作
提高操作执行效率
,但是在操作完毕后无法取消本次操作
执行效率相对较慢
。
但是在执行完毕后,由于有备份的存在,可以使用备份取消当前操作。
这样可以增加数据的安全性
当多个用户同时请求修改某个数据时,通过事务可以保证数据从一个一致性状态变更为另外一个一致性的状态 例如:A用户给B用户转10000元, 需要在A用户帐户中减少10000元,在B用户的帐户中增加10000元,这两个操作应该是一个原子操作,要么两个都修改成功,要么这两个操作都没发生
在MySQL数据库中的InnoDB 存储引擎支持事务, MyISAM 不支持事务
start transaction; // 通知MySql服务器提供一个事务对象,这个事务对象对接下来操作产生所有备份机械能管理
delete from 表名 where 判断条件 // 生成备份文件:表名.bak
rollback; // 通知MySql服务器将本次操作中所有备份信息覆盖道表文件,来取消本次操作
commit; // 通知MySql服务器将本次操作中生成所有的备份信息进行删除,称之为提交操作