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