mysql常见的适用语法
几个重要关键字的执行顺序
# 书写顺序
select id,name from emp where id > 3;
# 执行顺序
from ==》 where ==》 select
感觉sql语法很像英语的句子书写。
where 关键字:筛选条件
2.查询员工id在3和6之间。
select * from emp where id >=3 and id<=6;
select * from emp where id between 3 and 6;
3 查询姓名中含有o的员工。
select * from emp where name like "%o%";
4.查询员工姓名是由4个字符组成。
select * from emp where name like '____';
select * from emp where char_length(name) = 4;
5.查询id小于3或者大于6的员工信息
select * from emp where id not between 3 and 6;
6. 查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (20000,18000,17000);
7.查询岗位描述为空的员工姓名和岗位名.针对null不用等号,用is。
select name,post from emp where post_comment is NULL
# group by 分组
# 分组之后,最小的可操作单位应该是组,不是单个数据。
# 按照什么分组就只能拿到分组,其他字段不能直接获取 需要借助一些方法
# 聚合函数:max,min,avg,sum,count
1. 按照部门分组
select post from emp group by post;
1. 获取每个部门的最高薪资:max
select post,max(salary) from emp group by post;
select post as '部门',max(salary) as '最搞薪资' from emp group by post;
# as可以给字段起别名,也可以省略,到那时不推荐。
2.获取每个部门的最低薪资:min
select post,min(salary) from emp group by post;
3.获取每个部门的平均薪资:avg
select post,avg(salary) from emp group by post;
4.获取每个部门的工资总和:sum
select post,sum(salary) from emp group by post;
5.获取每个部门的人数:count
# 不能对含null的字段进行统计。
select post,count(id) from emp group by post;
6.查询分组之后各部门名称和每个部门所有的员工姓名
# group_concat 不单单可以支持获取分组之后的其他字段值,还支持拼接操作
select post,group_concat(name) from emp group by post;
select post,group_concat(name,'_DSB') from emp group by post;
select post,group_concat(name,":",salary) from emp group by post;
分组注意事项:
# 关键字where和group by同时出现的时候group by必须在where的后面。
1. where先对整体数据进行过滤之后在分组操作.
2. 聚合函数只能在分组之后使用,where筛选条件不能使用聚合函数。
3. 不分组默认整体就是一组。
2. 统计各部门年龄在30岁以上的员工平均薪资
select post,avg(salary) from emp where age>30 group by post;
having分组之后的筛选条件
'''
having的语法跟where是一致的
只不过having是在分组之后进行的过滤操作
即having是可以直接使用聚合函数的。
'''
通缉各部门年龄在30岁以上的员工平均工资并且保留平均薪资大于10000的部门。
select post,avg(salary) from emp where age>30 group by post having avg(salary) > 10000;
distinct去重
'''
一定要注意,必须是完全一样的数据才可以去重。
'''
select distinct id,age from emp;
select distinct age from emp;
order by排序
# 默认之后跟着一个asc.默认是升序
select * from emp order by salary; == select * from emp order by salary asc
# 降序
select * from emp order by salary desc;
# 如果要是比的结构相同,那么可以在之后在增加比较条件。
select * from emp order by salary,id;
limit限制展示条数
针对数据过多的情况,通常做分页处理、
select * from emp limit 3; # 只展示3条数据
select * from emp limit 0,5; # 第一个参数是起始位置,第二个参数是展示条数。
正则
select * from emp where name regexp '正则规律';
拼表
select * from emp,dep where emp.dep_id = dep.id;
# 推荐使用这种语法
1. 内连接 inner join
2. 左链接 left join
3. 右链接 right join
4. 全链接 union
1. inner join : 只拼接两张表中共有的数据部分
select * from emp inner join dep on emp.dep_id = dep.id;
2. left join :左表所有的数据都显示出来 没有对应的选项就用null
select * from emp left join dep on emp.dep_id = dep.id;
3. right join : 右表所有的数据都显示出来 没有对应的选项就用null
select * from emp right join dep on emp.dep_id = dep.id;
4. union : 左右两表所有的数据都展示出来。
左表
union
右表
子查询
子查询:就是分步骤解决问题。
将一个查询语句的结果当做另外一个查询语句的条件去做。
select name from emp where dep_id in (200,201);
select id from dep where name='技术' or name = '人力资源';
总结:
表的查询结果可以作为其他表的查询条件
也可以通过其别名的方式把它作为一张虚拟表跟其他表相连。
作业:
1.整理今日内容
2.完成下列分组查询练习题(以课上建表代码为参考)
1. 查询岗位名以及岗位包含的所有员工名字
select post,group_concat(name) from emp group by post;
2. 查询岗位名以及各岗位内包含的员工个数
select post,count(id) from emp group by post;
3. 查询公司内男员工和女员工的个数
select sex,count(id) from emp group by sex;
4. 查询岗位名以及各岗位的平均薪资
select post,avg(salary) from emp group by post;
5. 查询岗位名以及各岗位的最高薪资
select post,max(salary) from emp group by post;
6. 查询岗位名以及各岗位的最低薪资
select post,min(salary) from emp group by post;
7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
select sex,avg(salary) from emp group by sex;
3.练习拼表操作并理解其意义
4.理解子查询思路体会其意义