MySQL学习笔记(3)之筛选、分组去重、排序、限制与正则

1.where筛选条件

#作用:是对整体数据的一个筛选操作
# 1.查询id大于等于3小于等于6的数据  (与)
select id,name,age from emp where id>=3 and id<=6;
select id,name from emp where id between 3 and 6;  #  两者等价

# 2.查询薪资是20000或者18000或者17000的数据 (或)

select * from emp where salary=20000 or salary=18000 or salary=17000;
select * from emp where salary in (20000, 18000,17000);

# 3.查询id小于3或者id大于6的数据   (非)
select * from emp where id not between 3 and 6;
   查询薪资不在20000 , 18000 , 17000范围的数据
select * from emp where salary not in (20000 ,18000, 17000);I

# 4.查询员工姓名中包含字母o的员工的姓名和薪资  
校糊查询
  1ike
    %匹配任意多个字符
    _匹配任意单个字符
select name,salary from emp where name 1ike '%0%' ;

# 5.查询员工姓名是由四个字符组成的姓名和薪资
select name,salary from emp where name 1ike '____';  # 四个_

select name,salary from emp where name char_length(name) = 4;

# 6.查询岗位描述为空的员工姓名和岗位名针对nu11不用等号 用is

select name,post from emp where post_ comment is NULL ;

 

 2.group by 分组

'''
select * from emp group by post;
# 1按照部门分组分组之后最小可操作单位应该是组还不再是组内的单个数据
上述命令在你没有设置严格模式的时候是可正常执行的,返回的是分组之后每个组的
第一条数据,但是这不符合分组的规范:分组之后不应该考虑单个数据而应该以组为操作
单位(分组之后没办法直接获取组内单个数据)如果设置了严格模式那么上述命令会直接报错
'''
#设置严格模式

set g1oba1 sq1_mode ='strict_trans_tables,only_full_ group_by';

show variables like '%mode';

exit  #退出重新进mysql


#设置严格模式之后分组 默认只能拿到分组的依据
select post from emp group by post;


# 按照什么分组就只能拿到分组其他字段不能直接获取需要借助于一些方法

出现关键字 每个 平均 最高 最低时需要分组  聚合函数max()、 min()、 avg()、 sum() 、count()对null不能计数、

# 1.获取每个部门的最高薪资  
  select post,max(salary) from emp group by post;

#  as给字段和表(临时)起别名,也可以不写     
select post as '部门',max(salary) as '最高薪资' from emp group by post;
select post '部门',max(salary) '最高薪资' from emp group by post; #  最好写上
select t1.id,t1.name from emp as t1;  #  给表起别名

# 2.查询分组之后的部门名称和每个部门下所有的员工姓名
# group_concat不单单可以支持你获取分组之后的其他字段值还支持拼接操作
select post,group_concat(name) from emp group by post;
select post,group_concat(name,'_DSB') from emp group by post;

select post,group_concat(name,':',salary) from emp group by post;  # 多个字段

# concat 不分组的时候用

select concat('NANE:' ,name),concat('SAL:' ,salary) from emp;


#查询每个人的年薪   12薪
select name,salary*12 from emp;

 

分组注意事项

# 1.关键字where和group by同时出现的时候group by必须在where的后面

# 2.where 先对整体数据进行过滤后再分组操作

# 3.聚合函数只能在分组之后使用

select id,name,age from emp where max(salary)> 3000;   ## 不行

select max(salary) from emp;   #不分组默认整体就是一组

#统计各部门年龄在30岁以上的员工平均薪资

  1先求所有年龄大于30岁的员工
  select * from emp where age>30;
  2再对结果进行分组
  select * from emp where age>30 group by post;
  用一句话 select post,avg(salary) from emp where age>30 group by post;

4.having 分组之后的筛选条件

'''

having的语法根where是一致的
只不过having是在分组之后进行的过滤操作
即having是可以直接使用聚合函数的

'''

#统计各部门年龄在30岁以上的员工平均工资并且保留平均薪资大于10000的部门
select post,avg(salary) from emp
where age>30
group by post
having avg(salary) > 1000

);

5.distinct 去重  

'''
一定注意 必须是完全一样的数据才可以去重!!!!
有主键存在的时候肯定去不了重 因为主键不重复
'''

select distinct id,age from emp; # 去不了重
select distinct ag from emp;

6.order by 排序

select * from emp order by salary;  # 默认升序
select * from emp order by salary asc; # 升序
select * from emp order by salary desc; # 降序
select * from emp order by age deasc,salary asc; # 先按age降序 如果age相同则按照salary升序排

7. limit 限制展示条数  (分页效果)

''''
针对数据过多的情况做分页处理
'''
select * from emp limit 3;
select * from emp limit 0,5;  # 第一条到第五条 (第一个参数是起始位置,第二个参数是条数)

8.regexp 正则

1.re模块中常用的方法
  finda11:分组优先展示
    ^j.*(n|y)S
    不会展示所有正则表达式匹配到的内容
    而仅仅展示括号内正则表达式匹配到的内容
  match:从头匹配
  search:从整体匹配
2.贪婪匹配与非贪婪匹配
  正则表达式默认都是贪婪匹配的
  将贪婪变成非贪婪只需要在正则表达式后面加?
  .*  贪婪
  .*? 非贪婪


select * from emp where name regexp '^j.*(n|y)$'; ## 以j开头 n或y结尾 中间无所谓

 

posted @ 2021-04-16 15:34  一米八大高个  阅读(528)  评论(0编辑  收藏  举报