MySQL关键字书写顺序和执行顺序不同引发的知识误区

抽出时间去学习,凡事从小做起,不怕单调和重复,长期的积累坚持,想不成功,也难。


目录

关键字书写顺序

执行顺序

常见函数

常见的单行处理函数

分组函数

分组查询(可分组 )

重点结论:

在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不行;

你也可以联合两个字段成一个字段看(两个字段联合分组)

注意点

having可以对分组之后的数据进行过滤,但它必须和group by 联合使用(但单独使用时效率低);

单表查询总结

综合案例练习: 


关键字书写顺序

关键字使用的先后顺序是不能改变的;

select ...
from ...
where ...
group by ... 
order by ...

执行顺序

        对于mysql中的语句,其实是有执行顺序的,执行顺序和书写顺序大有不同,而且由于执行顺序和书写顺序的不同,出现了很多的误区以及注意点        ,下文有详细描述

from ...
where ...
group by ...
having ...
select ...
order by ...

常见函数

常见的函数分为单行处理函数(处理几行输出几行),和多行处理函数(处理多行返回一行结果)

常见的单行处理函数
  1. lower() 转换小写 

    select lower(uname) as ename from emp;
  2. upper() 转换大写

  3. substr()取子串,格式:substr(被截取的字符串,起始下标,截取长度)

    注意:起始下标从1开始

     where substr(ename,1,1) = 'A';
  4. length()取长度

  5. trim()去空格

  6. str_to_date() 将字符串转换成日期

  7. date_format()格式化日期

  8. round()四舍五入

  9. rand()生成随机数

  10. ifnull()可以将null转换成一个具体值

分组函数

分组函数又称多行处理函数

  1. count计数、sum求和、avg平均值、max最大值、min最小值

  2. 注意:分组函数必须先分组,然后才能使用,也就是说按照执行顺序,在group by后面才能使用分组函数

       错误演示:
    
       select ename,sal from emp where sal > min(sal);

    理论上这是没问题的,但实际运行中会报错 ;

     正确示例:
    
     select min(sal) from emp;
  3. 如果没有分组,那么就默认一张表就是一组

     select max(salary) from emp;

注意点:

  1. 在数据库中运算时遇见null其结果就是null,但是在分组函数中自动会排除null;

  2. null不是一个值,他表示什么也没有;

  3. 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;

注意点

  1. 加了group by 之后,select后面的字段就不能随意写了,你就只能写group by后面的字段和分组函数;

  2. 分组函数不能写在where后面,这个执行顺序有关,先分组后使用分组函数;

  3. 为什么在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   group by ename,job having sal>3000;

这样的优化看似愚蠢,但实际上一些实际运用中还真有where解决不了的需要having解决的例如:找出每个部门平均薪资,要求显示的平均薪资高于2500的,针对这个需求,就要having解决了

单表查询总结

  1. 可以先从表中查数据,先通过where筛选,然后对筛选后的结果通过having进行过滤;

  2. 对于分组函数,他的语法位置是在select后面;

  3. 在使用group by进行分组查询之后,要格外注意select后面的字段;

  4. 关键字执行顺序,from -- where -- group by -- having -- select -- order by;
     

综合案例练习: 

select * from emp2;
 update emp2 set id=3 where age=33;
 select * from emp;
 select gender,max(age) as '最大年龄' from emp group by gender;
 select name,gender,age from  emp order by age;
 select name,gender,age from emp where name like '小%';
 select name,gender,age from emp where name like '小%'  order by age;
 select name,gender empname,age  empgen  from emp;
 select * from emp where age between 16 and 29 order by age;

猜你喜欢

转载自blog.csdn.net/m0_64231944/article/details/132147385