单表查询
概要
-
单表查询关键字
详情
注意事项 1.书写SQL语句时,可以先写主体,即 select * from 表名,再根据实际需求添加关键字并修改具体查询字段。 2.使用命令操作时最好在命令结束之后检查一下执行情况 3.窗口由于表字段较多而展示错乱时可以使用\G分行展示 查询SQL语句书写自由度较高,同一结果可由多种写法达成。
# 测试数据 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
关键字where可以按照给定的条件筛选表中的数据。
1、查询id大于等于3并且小于等于6的数据
select * from emp where id>=3 and id<=6; 查询条件为一个数值范围时也可以用between关键字(结果相同) select * from emp where id between 3 and 6;

2、查询薪资是20000或者18000或者17000的数据
select * from emp where salary=20000 or salary=18000 or salary=17000; 查询条件为限制多个选项时也可以用in关键字(结果相同) select * from emp where salary in (20000,18000,17000);

3、模糊查询
(1)查询员工姓名包含字母'o'字母的员工姓名和薪资
占位符号: %:匹配任意个数的任意字符 _:匹配单个个数的任意字符 select name,salary from emp where name like '%o%';

(2)查询员工姓名由4个字符组成的员工姓名和薪资
select name,salary from emp where name like '____'; 也可使用函数,两种写法结果相同 select name,salary from emp where char_length(name)=4;

4、查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (20000,18000,17000);

5、查询岗位描述为空的员工姓名和岗位名
select name,post from emp where post_comment=NULL; 查询结果为空 # 判断是否为空时要用is关键字,不能用等号连接NULL select name,post from emp where post_comment is NULL;

-
查询关键字——分组 group by
分组:按照指定的条件将单个个体分成一个个整体。
需求中有每个的,通常需要分组解决。 select post from emp group by post; 分组之后默认只可以直接获取到分组的依据 无法再获取内部单个个体数据 如果想要获取需要借助于一些方法 set global sql_mode="strict_trans_tables,only_full_group_by";

聚合函数
用于分组之后的数据处理 1. max 最大值 2. min 最小值 3. avg 平均值 4. sum 求和 5. count 计数 如果需要获取每个部门的最高薪资、最低薪资、平均薪资、薪资综合、员工人数,就要用到聚合函数 select post,max(salary),min(salary),avg(salary), sum(salary),count(id) from emp group by post;

-
查询关键字——过滤 having
过滤having与筛选where各自特点:
相同: 都有筛选记录的功能 不同: where 用于分组前;having用于分组后 eg: 统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门 思路: 1.先统计各部门的工资 select post,avg(salary) from emp group by post; 2.对分组前数据进行筛选 select post,avg(salary) from emp where age>30 group by post; 3.对分组后数据进行过滤 select post,avg(salary) from emp where age>30 group by post having avg(salary)>10000;


-
查询关键字——去重 distinct
数据一模一样时才能去重,即查询结果的多行记录的同一列的数据均相同。
select distinct gender from emp;

-
查询关键字——排序 order by
1.默认升序 select * from emp order by salary; 2.升序关键字 asc 默认可省略 select * from emp order by salary asc; 3.降序关键字 desc select * from emp order by salary desc;

统计各部门年龄在18岁以上员工的平均工资,且保留平均工资大于1888的部门,然后对平均工资进行排序
select post,avg(salary) from emp where age>18 group by post having avg(salary)>1888 order by avg(salary) desc;

-
查询关键字——分页 limit
关键字limit有两种使用方式
limit 参数1; 参数表示条数 limit 参数1,参数2; 第一个参数表示起始位置,第二个参数表示条数 查询最高的记录详情简便办法:可以按该列排序,再使用limit取第一条记录 select * from emp limit 5; 显示5条 select * from emp limit 8,2; 跳过8条开始,显示2条

-
查询关键字——正则表达式 regexp
正则:使用特殊符号的组合表示在字符串中筛选符合条件的记录。
查询姓名以字母j开头,以n或者y结尾的记录 select * from emp where name regexp '^j.*(n|y)$';

作业
1.练习题:
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;


浙公网安备 33010602011771号