很喜欢一句话:这个世上只有一种真正的英雄主义,就是你认清了生活的真相,却仍然热爱它;
目录
在学习数学公式以及排序等关键字时,首先你要明白他们使用在语句的那个位置,格式要求等等;
在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不行;
having可以对分组之后的数据进行过滤,但它必须和group by 联合使用(但单独使用时效率低);
条件查询(查询满足条件的数据)
常见的条件查询(查询语句后面添加where + 条件):
-
=(等于)、<>或!=(不等于)、大于等于等等
-
between .... and .... (处于两个值之间的)
-
注意:必须遵循左小右大原则且闭区间
-
-
is null、is not null
-
数据库中的null不能使用等号来衡量,他的实际意义是没有值、什么都没有,因此不能有(=null)这种语法
where salary is null;
-
-
and(并且),or(或者)
where job = "MANAGER" and salary > 3000; where job = "MANAGER" or salary > 3000;
-
and和or同时出现,and优先级高,同时出现可以使用小括号;
//找出工资大于2500并且编号是10或20的; where sal > 2500 and deptno = 10 or deptno =20;//这么写容易出现歧义 where sal > 2500 and (deptno = 10 or deptno =20);
-
-
in(包含,相当于当个or)、not in
//找出工资大于2500并且编号是10或20的; where sal > 2500 and deptno in (10,20)
注意:此处的in不是区间,而是集合;
-
like (模糊查询),%或下划线匹配;
注意:%匹配任意字符;下划线只能匹配一个字符;
//名字中含有A where dname like '%A%'; //第二个字母是A where dname like '_A%'; //找出名字中带有下划线的 where name like '%_%';//这样就会查出所有 where name like '%\_%'//转义字符
注意点:
在学习数学公式以及排序等关键字时,首先你要明白他们使用在语句的那个位置,格式要求等等;
数据排序(order by 字段)
常见排序方式:
-
asc 升序
-
desc降序
order by salary asc, ename asc;
//salary在前,起主导作用,只有salary相同时,才会使用ename升序排列;
关键字书写顺序
关键字使用的先后顺序是不能改变的;
select ...
from ...
where ...
group by ...
order by ...
执行顺序
from ...
where ...
group by ...
having ...
select ...
order by ...
常见函数
常见的函数分为单行处理函数(处理几行输出几行),和多行处理函数(处理多行返回一行结果)
常见的单行处理函数
-
lower() 转换小写
select lower(uname) as ename from emp;
-
upper() 转换大写
-
substr()取子串,格式:substr(被截取的字符串,起始下标,截取长度)
注意:起始下标从1开始
where substr(ename,1,1) = 'A';
-
length()取长度
-
trim()去空格
-
str_to_date() 将字符串转换成日期
-
date_format()格式化日期
-
round()四舍五入
-
rand()生成随机数
-
ifnull()可以将null转换成一个具体值
分组函数
分组函数又称多行处理函数
-
count计数、sum求和、avg平均值、max最大值、min最小值
-
注意:分组函数必须先分组,然后才能使用,也就是说按照执行顺序,在group by后面才能使用分组函数
错误演示:
select ename,sal from emp where sal > min(sal);
理论上这是没问题的,但实际运行中会报错 ;
正确示例:
select min(sal) from emp;
-
如果没有分组,那么就默认一张表就是一组
select max(salary) from emp;
注意点:
-
在数据库中运算时遇见null其结果就是null,但是在分组函数中自动会排除null;
-
null不是一个值,他表示什么也没有;
-
count(某个字段)得到的结果是该数据表中的,该字段不为null的字段个数;
分组查询(可分组 )
实际需求中我们会遇到先需要对数据表进行分组,分完组之后在进行查询;
案例演示:
select ename,job ,sum(sal) from emp group by job;
上面这条语句只能在的MySQL在运行,本身无意义,但在Oracle中会报错,应为Oracle的语法要求相对mysql而言比较严格,
重点结论:
在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不行;
你也可以联合两个字段成一个字段看(两个字段联合分组)
select deptno,job,max(sal) from emp group by deptno,job;
注意点
-
加了group by 之后,select后面的字段就不能随意写了,你就只能写group by后面的字段和分组函数;
-
分组函数不能写在where后面,这个执行顺序有关,先分组后使用分组函数;
-
为什么在select后面可以使用分组函数呢,也和执行顺序有关,select执行在group by后面;
//找出每个部门中薪资最高的,显示的最高薪资要大于3000
select ename,job,max(sal) from emp where sal>3000 group by ename,job;
having可以对分组之后的数据进行过滤,但它必须和group by 联合使用(但单独使用时效率低);
效率低代码演示:
select ename,job,max(sal) from emp group by ename,job having sal>3000;
为解决上面效率低的问题,我们可以采用where和having联合使用,此时条件删选会优先考虑where,where完成不了才会考虑having;
优化后策略:
select ename,job,max(sal) from emp where sal>3000 group by ename,job having sal>30;
//这个having加的没有意义,我只想在此处强调where和having可以联合使用以及优先级;
这样的优化看似愚蠢,但实际上一些实际运用中还真有where解决不了的需要having解决的例如:找出每个部门平均薪资,要求显示的平均薪资高于2500的,针对这个需求,就要having解决了
单表查询总结
-
可以先从表中查数据,先通过where筛选,然后对筛选后的结果通过having进行过滤;
-
对于分组函数,他的语法位置是在select后面;
-
在使用group by进行分组查询之后,要格外注意select后面的字段;
-
关键字执行顺序,from -- where -- group by -- having -- select -- order by;