mysql之查询关键字筛选分组去重排序分页正则判断⽬录
查询关键字
前期准备(可以拿来练习):
创建表:
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', # 默认为男的
age int(3) unsigned not null default 28,
hire_date date not null, # 雇佣⽇期
post varchar(50), # 职业
post_comment varchar(100), # 员⼯描述
salary double(15,2), # 薪资
office int, # 门牌号:⼀个部门⼀个屋⼦
depart_id int # 编号
);
插⼊记录:
#三个部门:教学,销售,运营
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('jaso','male',18,'20170301','第⼀讲师',7300.33,401,1), #以下是教学部
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬⾦','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);
1、查询关键字之select与from
select :
控制查询表中的那些字段对应的数据
from :
控制查询的表
eg : select * from t1;
解释:查询t1表所有字段中的所有数据信息
eg : select name from t1;
解释:查询t1表中name字段的所有数据信息
2、查询关键字之where筛选
定义:where其实就是对数据进⾏筛选
关键字: where
实例:
1、查询id⼤于定于3⼩于等于6的数据
select * from emp where id >=3 and id <=6;
select * 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);
在练习下⾯的实例之前先补充⼀个知识点:
模糊查询:
定义:只查询需要数据所含有的部分字母.
⽐如:查询名字中含有杰字的⽤户信息
关键字: like
关键符号:
% : 匹配任意个数的任意字符
_ : 匹配单个个数的任意字符
3、查询员⼯姓名中包含o字母的员⼯姓名和薪资
select name,salary from emp where name like '%o%';
4、查询员⼯姓名为四个字符组成的员⼯姓名和薪资
select name,salary from emp where name like '____'; # 由四个_组成代表四个字符
也可以使⽤: char_length()查询字符长度
select name,salary from emp where char_length(name) = 4;
5、查询id⼩于3或者⼤于6的数据
select * from emp where id < 3 or id > 6;
select * from emp where id not between 3 and 6; # not 取反
6、查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (20000,18000,17000); # not 取反
7、查询岗位描述为空的员⼯与岗位名针对null不能⽤等号,只能⽤is
select name,post from emp where post_comment = null; # 报错
select name,post from emp where post_comment is null;
select name,post from emp where where post_comment is not null;
3、查询关键字之group by 分组
分组定义:按照某个指定的条件将单个单个的数据分为⼀个个的整体
关键字: group by 条件
eg : 班级按照作为横向分组
班级按照年龄进⾏分组
班级按照年龄进⾏分组
应⽤场景:求每个部门的平均薪资
求男⽣的平均薪资
求⼥能的平均薪资
注意:分组之后不在以单个个体为研究对象,也⽆法直接再获得单个个体的数据,研究对象应该为分组的整体分组之后默认只能直接获取到分组的依据其他字段数据⽆法直接获取
如果需要实现上述要求需要修改sql_mode
set global sql_mode='only_full_group_by';
注:不能直接获取,但是可以通过某些⽅法间接获取。
在做实战案例前先补充⼀点额外知识点:
聚合函数
max() # 最⼤值
min() # 最⼩值
sum() # 求和
count() # 计数
avg() # 平均值
# 上述聚合函数都是在分组之后使⽤⽤于操作整体数据
修改结果名:as
在查看结果的时候可以给字段起别名
select post as '部门',max(salary) as '最⾼薪资' from emp group by post;
省略as:
select post '部门',max(salary) as '最⾼薪资' from emp group by post;
as可以省略但是为了语义更加明确建议不要省略
了解上述两个⼩知识点我们再来看⼀下实例:
1、获取每个部门的最⼤薪资与最低薪资
select post as '部门',max(salary) as '最⾼薪资' from emp group by post;
select post as '部门',min(salary) as '最⾼薪资' from emp group by post;
2、统计每个部门的⼈数
select post,count(id) as '部门⼈数' from emp group by post;
注意:count()只是计数不是针对括号内的id字段
统计各年龄段的员⼯⼈数:
select age,count(age) as '各年龄段' from emp group by age;
3、获取每个部门的员⼯姓名
select post,group_concat(name) from emp group by post;
补充:group_concat⽤于分组之后获取分组以外的字段数据并⽀持拼接
concat ⽤户分组之前的拼接操作
concat_ws 当多个字段链接符相同的情况下推荐使⽤
实例:1、获取每个部门的员⼯姓名和薪资
distinct查询select post,group_concat(name,'|',salary) from emp group by post;
2、获取分组之前所有的员⼯姓名和薪资
select id,concat(name,'|',salary) from emp;
3、获取分组之前所有员⼯的名字性别薪资年龄
使⽤concat : select id,concat(name,'|',sex,'|',salary,'|',age) from emp;
使⽤concat_ws : select id,concat_ws('|',name,sex,salary,age) from emp;
# 效果是⼀样的
4、查询关键字之having过滤
where与having都是⽤来筛选数据的
但是where⽤于分组之前的筛选,having⽤于分组之后的筛选
为了认为的区分开我们将where⽤筛选来形容 having⽤过滤来形容
实例:
# 统计各部门年龄在30岁以上的员⼯平均⼯资,并且保留平均⼯资⼤于10000的部门
我们可以先分开解析⼀下:
1、查看整张表的内容: select * from emp;
2、统计年龄在30岁以上的:select * from emp where age > 30;
3、给各个部门分组:select post from emp group by post;
4、计算各部门的平均薪资:select post,avg(salary) from emp group by post
5、各部门30岁以上的平均薪资:select post,avg(salary) from emp where age > 30 group by post;
6、使⽤having加上限制条件并且平均⼯资⼤于10000 :
select post,avg(salary) from emp where age > 30 group by post having avg(salary)>10000; 5、查询关键字之distinct去重
定义:去重的前提是存在⼀摸⼀样的数据,如果针对于主键肯定⽆法去重
关键字:distinct
实例:
1、针对于主键:
select distinct id,age from emp; # ⽆效果
select distinct id,distinct age from emp; # 报错
select distinct age,name from emp; # ⽆效果
2、查看有⼏个年龄段的员⼯:
select distinct age from emp;
6、查询关键字之order by排序
定义:使数据升序或者降序
关键字:(asc升序(默认)) (desc降序) # 关键字需要⽤在指定字段之后
实例:
1、以员⼯薪资从低到⾼排序
select * from emp order by salary asc; # asc为默认参数可以不写
2、以员⼯薪资从⾼到低排序
select * from emp order by salary desc; # 如果使⽤降序则必须写desc
order by 排序⽀持多个字段组合(第⼀个不⾏就⽤第⼆个)
解释:因为⽤很多重复的数据⽐如年龄有很多重复的重复的数据是⽆法排序的
⽐喻:如果同年龄段(因为同年龄段的肯定不⽌⼀个⼈)的⽆法排序就是⽤薪资来排序
实例:
1、以各年龄段薪资升序查看:
select * from emp order by age,salary;
2、也可以(asc,desc)结合使⽤
以各年龄段薪资降序来查看:
select * from emp order by age asc,salary desc;
7、查询关键字之limit分页
定义:在查看的数据太多情况下,使⽤分页来限制每次查看数据的数量。
关键字: limit
⽤法:limit 数字
1、limit后只跟⼀个数字:从头开始展⽰多少⾏
select * from emp limit 5; # 从头开始展⽰5⾏
2、limit后跟两个数字:第⼀个数字为起始位,第⼆个数字为从起始位开始展⽰多少⾏
select * from emp limit 5,5; # 从第5⾏开始展⽰5⾏
实例:
1、求薪资最⾼的员⼯所有数据
分析:可以使⽤order by使薪资降序排序
在使⽤limit 1 展⽰⼀⾏
select * from emp order by salary desc limit 1;
8、查询关键字之regexp正则表达式
定义:使⽤正则表达式来限制查条件,到符合条件的数据。
关键字:regexp
⽤法:regexp '正则表达式'
实例:
1、取指定员⼯信息
select * from emp where name regexp '^j.*(n|y)$';
解释:取员⼯姓名为:开头为j结尾为n或者y中间是任意字符的所有信息
9、查询关键字之exists判断
定义:exists关键字表⽰存在。在使⽤在使⽤exists关键字时,内层查询语句不返回查询的记录,⽽是返回⼀个真假值,True或False。
当返回为True时,外层查询语句将进⾏查询、
返回值为False时,外层查询语句不进⾏查询。
⽤法:sql语句 exists(判断语句)
判断语句为True则执⾏sql语句如果返回为False则不执⾏.
实例:
select * from emp where exists (select id from emp where id > 3);
解释:括号内判断语句为True有结果则会执⾏exists前的sql语句select * from emp where exists (select id from emp where id > 20);解释:括号内判断语句为False没有结果则不会执⾏exists前的sql语句
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论