mysql之查询关键字 筛选|分组|去重|排序|分页|正则|判断
目录
- 查询关键字
- 1、查询关键字之select与from
- 2、查询关键字之where筛选
- 3、查询关键字之group by 分组
- 聚合函数
- 修改结果名:as
- 4、查询关键字之having过滤
- 5、查询关键字之distinct去重
- 6、查询关键字之order by排序
- 7、查询关键字之limit分页
- 8、查询关键字之regexp正则表达式
- 9、查询关键字之exists判断
查询关键字
前期准备(可以拿来练习):
创建表:
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、获取每个部门的员工姓名和薪资
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语句