MySQL微讲解(四)
MySQL微讲解(四)
查询关键字
1.having过滤
having与where的功能一模一样,都是对数据进行筛选,where是用在分组之前,having用在分组之后,为了区分两者,我们将where说为筛选,having称之为过滤
# 统计每个部门年龄在30岁以上的员工的平均薪资,并且保留平均薪资大于10000的部门
1.先获取每个部门年龄在30岁以上的员工的平均薪资
select post,avg(salary) from emp where age > 30 group by post;
2.在第一步的基础上过滤出平均薪资大于10000的数据
select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
# 针对聚合函数,如果还需要在其他地方继续作为条件使用的可以先使用别名
select post,avg(salary) as avg_salary from emp where age > 30 group by post having avg_salary > 10000;
2.distinct去重
# 去重的前提是数据必须一模一样才可以,如果数据有主键肯定无法去重
select distinct age from emp; # 对年龄数据进行去重
3.order by排序
# 1.薪资按照高低排序
select * from emp order by salary; # 默认是升序
select * from emp order by salary asc; # 升序的关键字,也可以不写
select * from emp order by salary desc; # 降序的关键字
# 2.先按照年龄升序排列,如果年龄相同,在按照薪资降序排列
select * from emp order by age,salary desc;
# 3.统计各部门年龄在10岁以上的员工平均薪资,并且保留平均工资大于1000的部门并按照从大到小的顺序排列
select post,avg(salary) from emp where age > 10 group by post having avg(salary)>1000 order by avg(salary) desc;
4.limit分页
分页就是限制展示条数
# 1.限制只展示五条数据
select * from emp limit 5;
# 2.分页效果
select * from emp limit 6,5;
# 3.查询工资最高的人的详情信息
select * from emp order by salary desc limit 1;
5.regexp正则
select * from emp where name regexp '^j.';
select * from emp where name regexp '^j.*(n|y)';
多表查询
# 1.子查询
子查询就相当于一步一步的解决问题,将一条SQL语句的查询结果加括号当做另一条SQL语句的查询条件
# 2.连表查询
连表查询的思路就是将多张表拼接到一起,形成一个大表,然后基于单表查询获取数据
# 代码演练
create table z_1(
id int primary key auto_increment,
name varchar(255)
);
create table z_2(
id int primary key auto_increment,
name varchar(255),
gender enum('male','female','others') default 'male',
age int,
dep_id int
);
insert into z_1 values(200,'技术'),(201,'安保'),(202,'黑客'),(203,'间谍'),(205,'魔法师');
insert into z_2(name,age,dep_id) values('oscar',21,200),('jason',18,201),('tony',28,201),('jerry',26,202)
,('kevin',38,203),('jack',48,204);
1.子查询
# 使用子查询,获取oscar所在的部门名称
我们可以先获取oscar的部门编号,然后在将该结果作为条件进行查询即可
1.获取oscar的部门编号
select dep_id from z_2 where name = 'oscar';
2.将1的结果作为条件进行查询
select name from z_1 where id = (select dep_id from z_2 where name = 'oscar');
2.连表查询
# 使用连表查询获取oscar所在的部门编号
使用连表查询我们应该先把两张表拼接到一起,组合成一张表然后我们在查询
select * from z_1,z_2 where z_1.id = z_2.dep_id; # 把两张表拼接成一张表
'''
注意:如果一条SQL语句中涉及到多张表的字段名称编写,建议使用表名前缀作区分
'''
# 连接表操作的四个关键字
1.inner join # 内连接
select * from z_1 inner join z_2 on z_1.id = z_2.dep_id; # 只连接两张表中有对应关系的数据
2.left join # 左连接
select * from z_1 left join z_2 on z_1.id=z_2.dep_id; # 以左表为基准,展示所有的数据,没有对应的则用null填充
3.rignt join # 右连接
select * from z_1 right join z_2 on z_1.id=z_2.dep_id; # 以右表为基准,展示所有的数据,没有对应的则用null填充
4.union # 全连接
select * from z_1 left join z_2 on z_1.id=z_2.dep_id union select * from z_1 right join z_2 on z_1.id=z_2.dep_id; # 左右两边表全部展示,没有对应的就用null填充
所以这一题我们可以这这么做:select z_1.name from z_1 inner join z_2 on z_1.id=z_2.dep_id where z_2.name = 'oscar';
这里是IT小白陆禄绯,欢迎各位大佬的指点!!!