DQL操作以及SQL执行流程

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. 字符串函数
-- 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 表名;
  1. 数字函数:对数字进行操作
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位小数点为止
  1. 日期与时间函数
select curdate();-- 当前日期
select curtime();-- 当前时间
select now();-- 当前日期+时间
select sysdate();-- 当前日期+时间
select year('日期'),month('日期'),day('日期');-- 获取年月日
  1. 流程控制函数
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
  1. 其他函数
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执行流程详细说明

  1. 客户端向服务器端发送SQL命令和连接参数
  2. 服务器端连接模块连接并验证
  3. 缓存模块解析SQL为Hash并与缓存中Hash表对应。如果有结果直接返回结果,如果没有对应继续向下执行。如果是MySQL 8 是没有查询缓存的。
  4. 解析器解析SQL为解析树,检查关键字相关问题,如果出现错误,报SQL解析错误。如果正确,继续执行
  5. 预处理器对解析树继续处理检查表、列别名等,处理成功后生成新的解析树。
  6. 优化器根据开销自动选择最优执行计划,生成执行计划
  7. 执行器执行执行计划,访问存储引擎接口
  8. 存储引擎访问物理文件并返回结果
  9. 如果开启查询缓存,缓存管理器把结果放入到查询缓存中。
  10. 返回结果给客户端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值