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