关于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.获取每个部门的最低薪资

select post,min(salary) from emp group by post;

 

 

 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;

 

 

关键字having过滤

1.统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门

select post,avg(salary) from emp where age>30 group by post having avg(salary)>10000

 

 

 where 在数据的筛选,having 主要用于数据的筛选,基本都在尾端. 分组之后才可以使用.

查询关键字distinct去重

去重,前提是数据是一模一样的才可以,主要主键不同后面的数据肯定不同.

通常会在distinct后面加个关键字段,比如 gender ,post 等

 

 

 如果直接select distinct from emp  是没有意义的,因为每条数据都是不一样的 得到的表和原表是相同的.

查询关键字order by排序

对薪资进行排序:

select * from emp order by salary; #默认为升序  asc 是升序的关键字 不写则默认

 

 

 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);

 

 查询关键字limit分页

select * from emp limit 5;  # 一个数字表示条数

select * from emp limit 5,10;  # 第一个数字表示起始位置 第二个数字表示条数

 

  1.查询工资最高的人的详细信息

select *from emp order by salary desc limit 1;

查询关键字regexp正则

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  ; 

 

posted @ 2021-09-07 14:33  查无此人cxc  阅读(107)  评论(0编辑  收藏  举报