【mysql复习】——单表查询知识复习

很喜欢一句话:这个世上只有一种真正的英雄主义,就是你认清了生活的真相,却仍然热爱它;

目录

条件查询(查询满足条件的数据)

注意点:

        在学习数学公式以及排序等关键字时,首先你要明白他们使用在语句的那个位置,格式要求等等;

数据排序(order by 字段)

关键字书写顺序

select ...

from ...

where ...

group by ... 

order by ...

执行顺序

from ...

where ...

group by ...

having ...

select ...

order by ...

常见函数

常见的单行处理函数

分组函数

注意点:

分组查询(可分组 )

重点结论:

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

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

注意点

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

单表查询总结



条件查询(查询满足条件的数据)

常见的条件查询(查询语句后面添加where + 条件):

  1. =(等于)、<>或!=(不等于)、大于等于等等

  2. between .... and .... (处于两个值之间的)

    • 注意:必须遵循左小右大原则且闭区间

  3. is null、is not null

    • 数据库中的null不能使用等号来衡量,他的实际意义是没有值、什么都没有,因此不能有(=null)这种语法

       where  salary is null;
  4. 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);
  5. in(包含,相当于当个or)、not in

     //找出工资大于2500并且编号是10或20的;
     where sal > 2500 and deptno in (10,20)

    注意:此处的in不是区间,而是集合;

  6. like (模糊查询),%或下划线匹配;

    注意:%匹配任意字符;下划线只能匹配一个字符;

     //名字中含有A
     where dname like '%A%';
     //第二个字母是A
     where dname like '_A%';
     //找出名字中带有下划线的
     where name like '%_%';//这样就会查出所有
     where name like '%\_%'//转义字符

注意点:

        在学习数学公式以及排序等关键字时,首先你要明白他们使用在语句的那个位置,格式要求等等;

数据排序(order by 字段)

常见排序方式:

  1. asc 升序

  2. 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 ...

常见函数

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

常见的单行处理函数
  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 where sal>3000  group by ename,job having sal>30;
//这个having加的没有意义,我只想在此处强调where和having可以联合使用以及优先级;

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

单表查询总结

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

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

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

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

猜你喜欢

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