1.DQL查询表中数据
1.1简单查询
select 字段名,字段名,... from 表名;
# 定义别名
select 字段名 as '别名' from 表名;
-- as可以省略
select 字段名 '别名' from 表名;
为字段定义别名,仅改变展示出来的字段名,数据库中的字段名不会发生改变
注意:
1.查询所有字段可以使用*代替所有字段
select * from 表名;
2.查询部分字段,必须手动指定展示出来的字段名
select 字段名1,字段名2 from 表名;
3.查询的字段可以进行数学计算,函数操作
select 字段名+100 from 表名;
1.2条件查询
select 字段 from 表名 where 条件;
# 查询到的数据去重
select distinct 字段 from 表名 where 条件;
执行顺序:
1.从哪个表查询 from
2.按照指定条件过滤 where
3.指定返回的字段值 select
条件:
> < >= <= != <>
and && 多个条件同时成立
between ... and ...区间值(前后包含)
or || 多个条件成立任意一个即可
in(集合) 只要满足条件就会显示、
like 模糊查询
is null 某个值为空
not 取反
1.3模糊查询
select 字段,字段,... from 表名 where 字段 like xxx;
模糊查询中的通配符:
1. %: 0到n个字符
2. _:一个字符
例如:
#1 查询含有‘八’ 字的员工姓名
select * from emp where ename like '%八%';
#2 查询以'孙'字开头的员工信息
select * from emp where ename like '孙%';
#3 查询第二个字为'兔'的员工信息
select * from emp where ename like '_兔%';
1.4排序
将查询出的结果按照指定的要求排序
1.单列排序:按照指定列中的值进行排序
select 字段,字段,... from 表 [where 条件] order by 字段; -- 默认升序
select 字段,字段,... from 表 [where 条件] order by 字段 asc; -- 升序
select 字段,字段,... from 表 [where 条件] order by 字段 desc; -- 降序
2.多列排序:按照指定多个列中的值进行排序,先按照指定的第一个列中的值排序,出现重复再按照指定第二个列中的值排序
select 字段,字段,... from 表 [where 条件] order by 字段1,字段2,...;
1.5函数
将具体的操作封装在方法中,调用方法,完成相关的操作
1.5.1单行函数
对每一行中的数据进行操作,操作多少行返回多少行
- 字符串函数
-- 1.将字母转换为小写
select lower(字段) from 表名;
-- 2.将字母转换为大写
select upper(字段) from 表名;
-- 3.返回占用的字节数,(utf-8编码中,一个中文占用三个字节)
select length(字段) from 表名;
-- 4.字符串拼接
select concat(字段, '要拼接的字符') from 表名;
-- 5.左侧填充
select lpad(字段, 字段总长度, '用来填充的字符') from 表名;
-- 6.右侧填充
select rpad(字段, 字段总长度, '用来填充的字符') from 表名;
-- 7.去除字符串左右的空格
-- 去除左空格
select ltrim(字段) from 表名;
-- 去除右空格
select rtrim(字段) from 表名;
-- 去除左右空格
select trim(字段) from 表名;
-- 8.替换指定的字符
select replace(字段, '被替换的字符', '要替换成的字符') from 表名;
-- 9.字符反转
select reverse(字段) from 表名;
-- 10.字符串截取,从1开始
select substr(字段, 从哪个字符开始, 截取的数量) from 表名;
select substring(字段, 从哪个字符开始, 截取的数量) from 表名;
-- 11.insert(1,2,3,4) 1.指定字符串 2.从哪个开始 3.几个字符 4.替换的新字符
select insert(字段, 从哪个开始, 几个字符, '替换的新字符') from 表名;
- 数字函数:对数字进行操作
select abs(1), abs(-1) from dual;
-- dual虚表,例如直接操作值,值不属于某个表的字段,可以使用虚表,虚表可以省略
abs(a) 返回a的绝对值
ceil(a) a向上取整
floor(a) a向下取整
mod(a,b) 返回a/b的余数
pi() 返回圆周率
pow(a, b) 返回a的b次方
rand() 返回0-1之间的随机数
round(a, b) 返回a四舍五入之后的值,保留b位小数点
truncate(a, b) 返回a被舍去直到剩下b位小数点为止
- 日期与时间函数
select curdate();-- 当前日期
select curtime();-- 当前时间
select now();-- 当前日期+时间
select sysdate();-- 当前日期+时间
select year('日期'),month('日期'),day('日期');-- 获取年月日
- 流程控制函数
if(条件, a, b) 如果条件成立,返回a,条件不成立,返回b
ifnull(a, b) 如果a不为null,返回a,a为null,返回b
nullif(a, b) 如果a=b,返回null,不相等,返回a
case
when 条件1 then a
when 条件2 then b
when 条件3 then c
...
else d
end 如果条件1为真,返回a,如果条件2为真,返回b,如果条件3为真,返回c,...,如果都不为真,返回d
- 其他函数
database() 返回当前数据库
user() 返回当前用户
version() 返回MySQL当前版本
inet_aton('ip地址') 将ip地址转化为数据并返回
inet_ntoa('数据') 将数据转化为ip地址并返回
1.5.2多行函数
对一列中的数据进行操作,最终返回一个结果
作用:通常用于统计
注意:自动忽略空值
max() 返回最大值
min() 返回最小值
sum() 返回和
avg() 返回平均值
count() 统计个数
1.6分组查询
按照指定的字段值进行分组,相同的值分为一组
select 分组字段 from 表名 group by 分组字段 [having 条件];
注意:
where:分组之前执行,不允许使用分组函数
having:分组之后执行,允许使用分组函数
-- limit 限制返回的条数 limit 从哪开始,获取几个
select * from 表名 limit x,y;-- x: 从第几条开始,y:获取几条
如果x=0,则x可以省略
1.7执行过程
执行过程:
1.from 找表
2.where 分组前过滤
3.group by 分组
4.select 返回需要的数据(分组字段,分组的统计)
5.having 分组后过滤
6.order by 排序
7.limit 限制条数
2.SQL执行流程
2.1执行流程图
2.2执行流程详细说明
- 客户端向服务器端发送SQL命令和连接参数
- 服务器端连接模块连接并验证
- 缓存模块解析SQL为Hash并与缓存中Hash表对应。如果有结果直接返回结果,如果没有对应继续向下执行。如果是MySQL 8 是没有查询缓存的。
- 解析器解析SQL为解析树,检查关键字相关问题,如果出现错误,报SQL解析错误。如果正确,继续执行
- 预处理器对解析树继续处理检查表、列别名等,处理成功后生成新的解析树。
- 优化器根据开销自动选择最优执行计划,生成执行计划
- 执行器执行执行计划,访问存储引擎接口
- 存储引擎访问物理文件并返回结果
- 如果开启查询缓存,缓存管理器把结果放入到查询缓存中。
- 返回结果给客户端