关于MySQL数据查询
where
group by
having
distinct
orderby
limit
regexp
数据准备
插入记录
insert into emp(name,gender,age,hire_date,post,salary,office,depart_id) values ('jason','male',18,'20170301','张江第一帅形象代言',7300.33,401,1), #以下是教学部 ('tom','male',78,'20150302','teacher',1000000.31,401,1), ('kevin','male',81,'20130305','teacher',8300,401,1), ('tony','male',73,'20140701','teacher',3500,401,1), ('owen','male',28,'20121101','teacher',2100,401,1), ('jack','female',18,'20110211','teacher',9000,401,1), ('jenny','male',18,'19000301','teacher',30000,401,1), ('sank','male',48,'20101111','teacher',10000,401,1), ('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门 ('呵呵','female',38,'20101101','sale',2000.35,402,2), ('西西','female',18,'20110312','sale',1000.37,402,2), ('乐乐','female',18,'20160513','sale',3000.29,402,2), ('拉拉','female',28,'20170127','sale',4000.33,402,2), ('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门 ('程咬金','male',18,'19970312','operation',20000,403,3), ('程咬银','female',18,'20130311','operation',19000,403,3), ('程咬铜','male',18,'20150411','operation',18000,403,3), ('程咬铁','female',18,'20140512','operation',17000,403,3);
以及插入表
create table emp( id int primary key auto_increment, name varchar(20) not null, gender enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_comment varchar(100), salary double(15,2), office int, #一个部门一个屋子 depart_id int );
where
1.查询id大于等于3小于等于6的数据
select * from emp where id between 3and 6 或者也可以写成 select * from emp where id >=3 and id<=6
2.查询薪资是20000或者18000或者17000的数据
select * from emp where salary=20000 or salary=18000 or salary=17000或者
select * from emp where salary in(20000,18000,17000);
3.模糊查询
关键字 like
关键符号
%:匹配任意个数的字符
_:匹配单个数的字符
4.查询员工姓名中包含o字母的员工姓名和薪资
select name,salary from emp where name like '%o%';不要忘记加"
5.查询员工姓名是由四个字符组成的员工姓名与其薪资
select name,salary from emp where name like____或者
select name,salary from emp where char_length(name)=4;
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;
当使用=null时因为与关键字重复 查询到的数据为空
group by 分组
就是把一个一个的个体 按照指定的条件做分组,
1.按照部门分组
如果写的是select * from emp group by post 是这样的 5.7以上版本输入之后 为报错
但很明显 这个问题研究的点是部门,不应该拿到单个的数据 分组之后默认只能拿到分组的依据 不能获得单个的数据
应该写成 select post from emp group by post;
在查询相关工作中判断需不需要分组 最为典型的关键字就是 每个
max 最大值
min 最小值
avg 平均值
sum 求和
count 计数
1.获取每个部门的最高工资
select post ,max(salary) from emp group by post
翻译过来的意思就是 获得分组之后的post 获取到post 的工资最高值
2.获取每个部门的最低薪资
3.获取每个部门的平均薪资
select post,avg(salary) from emp group by post;
4.获取每个部门的薪资总和
select post,sum(salary) from emp group by post ;
5.获取每个部门的员工人数(使用主键值)
select post,count(id) from emp group by post;
where 在数据的筛选,having 主要用于数据的筛选,基本都在尾端. 分组之后才可以使用.
去重,前提是数据是一模一样的才可以,主要主键不同后面的数据肯定不同.
通常会在distinct后面加个关键字段,比如 gender ,post 等
如果直接select distinct from emp 是没有意义的,因为每条数据都是不一样的 得到的表和原表是相同的.
select * from emp order by salary desc; # 降序
统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
select post,avg (salary) from emp where age >10 group by post having avg (salary) >1000 order by avg (salary);
select * from emp limit 5,10; # 第一个数字表示起始位置 第二个数字表示条数
1.查询工资最高的人的详细信息
select *from emp order by salary desc limit 1;
select * from emp where name regexp '^j.*(n|y)$';
# 查询姓名是以字母j开头 n或者y结尾的数据
查询练习题
1. 查询岗位名以及岗位包含的所有员工名字
select name,post from emp;
2. 查询岗位名以及各岗位内包含的员工个数4
select post,count(id) from emp group by post;
3. 查询公司内男员工和女员工的个数
select gender,count(id) from emp group by gender;
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 gender,avg(salary) from emp group by gender;
8、统计各部门年龄在30岁以上的员工平均工资
select post,avg(salary) from emp where age >30 group by post ;