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小白陆禄绯,欢迎各位大佬的指点!!!

posted @ 2022-05-06 23:13  陆禄绯  阅读(19)  评论(0编辑  收藏  举报