单表查询

单表查询

概要

  • 单表查询关键字


详情

注意事项
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;

posted @ 2021-09-07 14:16  Leguan001  阅读(170)  评论(0)    收藏  举报