查询数据为主
- 前提准备
- 关键字where
- 关键字group by
- 聚合函数
- 关键字having过滤
- 关键字dictinct
- 关键字order by
- 关键字limit
- 关键字regexp正则(了解)
前提
生成实验数据
# 生成表 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 );
插入实验数据
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);
关键字where
功能:
对整个个表数据的进行一次初步筛选操作
语法:
select 字符名 from 名 where 筛选条件
例1:查询id大于等于3小于等于6的数据
select * from emp where id between 3 and 6;
例2:查询薪资是20000或者18000或者17000的数据
select * from emp where salary=20000 or salary =17000 or salary=18000; # 其他写法 select * from emp where salary in (20000,18000,17000);
模糊查询
关键字:like
关键符号:%:匹配任意个数的任意字符
_:一横表示匹配一个字符,多个横表示匹配多个字符
例1:查询员工姓名中包含o字母的员工姓名和薪资
select name,salary from emp where name like \'%o%\';
例2:查询员工姓名是由四个字符组成的员工姓名与其薪资
select name,salary from emp where name like \'____\'; # 其他方法,其他语言的运用 select name,salary from emp where char_length(name)=4;
例3:查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (17000,18000,20000);
例4:查询岗位描述为空的员工名与岗位名 针对null不能用等号,只能用is
select name,post from emp where post_comment is NULL; # 报错 select name,post from emp where post_comment=NULL;
关键字group by分组
功能:
把所有个体通过某种条件组合为某种整体
语法:
select 字符名 from 表名 group by 条件字符名;
例1::按照部门分组
select * from emp group by post; # 报错 \'\'\' 在严格模式下会直接报错,因为在分组之后,无法获得内部单个个体的所有数据,为了获取信息,需要接祖一些其他方法 \'\'\' # 严格模式设置 set global sql_mode="strict_trans_tables,only_full_group_by"; select post from emp group by post;
聚合函数
主要用于分组之后的数据处理
- max:最大值
- min:最小值
- avg:平均
- sum:求和
- count:计数
例1:获取每个部门的最高工资
select post,max(salary) from emp group by 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:获取每个部门的员工人数
# 使用count优先选择主键 select post,count(id) from emp group by post;
关键字having过滤
功能:
功能与where相同,通过条件筛选需要的数据内容
语法:
select 字符名 from 表名 group by 分组字符名 having 条件;
having与where的区别
where用于分组之前的筛选
having用于分组之后的过滤
例1:统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门
select post,avg(salary) from emp
where age>30
group by post
having avg(salary)>10000;
关键字distinct
功能:
顾名思义此关键字适用于去重
语法:
select distinct post from emp; \'\'\' 去重的前提是数据必须完全相同 \'\'\'
# 默认为升序 select * from emp order by salary;
# asc是升序关键字 不写则默认 select name,salary from emp order by salary asc;
# desc是降序的意思,在这里不是显示 select name,salary from emp order by salary desc;
例:统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
select post,avg(salary) from emp
# 年龄大于10
where age>10
# 按部门分组
group by post
# 平均工资大于1000
having avg(salary)>1000
# 按平均工资分配
order by avg(salary);
关键字limit
功能:
用于对数据进行分页处理 控制展示信息节省资源
语法:
select * from emp limit 5; # 一个数字表示条数,显示5行
# 第一个数字表示起始位置 第二个数字表示显示个数 起始行不显示
select * from emp limit 3,3;
例1:查询工资最高的人的详细信息
select name,salary from emp order by salary desc limit 1;
关键字regexp正则(了解)
功能:
使用特殊符号的组合,在表中来获取符合条件的数据内容
语法:
# 查询姓名是以字母j开头 n或者y结尾的数据 select name from emp where name regexp \'^j.*(n|y)$\';
小练习
1. 查询岗位名以及岗位包含的所有员工名字
select name,post from emp;
2. 查询岗位名以及各岗位内包含的员工个数
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;