SELECT
first_name as "名", last_name as "姓", salary * 12 年薪
FROM
t_employees;
5.2.5 查询结果去重
通过员工表,查询部门ID。
复制代码
-- 通过员工表,查询部门ID
SELECT
department_id
FROM
t_employees
通过员工表,查询部门ID,不查看重复数据,去重。
DISTINCT放在所有列名的最前面,会帮你把数据重复的行,去掉。
复制代码
-- 通过员工表,查询部门ID,不查看重复数据,去重.
SELECT
DISTINCT department_id
FROM
t_employees
5.3 排序查询
在执行SELECT查询后,查询到的结果一般是跟表中的结果顺序一致的。
如果需要基于一些列做排序,可以使用MySQL提供的order by 操作
语法: SELECT 列名 FROM 表名 ORDER BY 排序列 [排序规则] , 排序列 [排序规则] ............
排序规则
描述
ASC(默认规则)
对前面排序列做升序排序
DESC
对前面排序列做降序排序
查询员工的编号,姓,薪资。 按照薪资的高低做降序排序
复制代码
# 查询员工的编号,姓,薪资。 按照薪资的高低做降序排序
SELECT
employee_id,last_name, salary
FROM
t_employees
ORDER BY
salary DESC
查询员工的姓,工资,入职时间。 优先按照工资做降序,再根据入职时间做升序
复制代码
-- 查询员工的姓,工资,入职时间。 优先按照工资做降序,再根据入职时间做升序
-- 运行选中的SQL的快捷键 ,Ctrl + Shift + R
SELECT
last_name 姓, salary 工资, hire_date 入职时间
FROM
t_employees
ORDER BY
salary DESC,
hire_date
5.4 条件查询
语法:select 列明 from 表名 where 条件
关键字
描述
where
在查询结果中,筛选符合条件的查询结果,条件为布尔表达式
5.4.1 等值判断(=)
注意:与Java不中,Java中是==,而在MySQL中是=
查询薪资是11000的员工信息。(查询员工的编号,名称,薪资)
复制代码
select
employee_id,first_name ,salary
from
t_employees
where
salary = 11000;
5.4.2 不等值判断(<、>、<=、>=、!=、<>)
其中,前四个没啥说的,常规的大于,小于之类的判断。
其中 != 和 <> 都代表不等于的意思。
查询薪资是大于11000员工信息。(查询员工的编号,名称,薪资)
复制代码
select
employee_id,first_name ,salary
from
t_employees
WHERE
salary > 11000;
5.4.3 逻辑判断(and,or,not)
类似Java中的 && ,|| ,!
其中 and 左右的条件都需要满足才可以。
其中 or 左右的条件,满足其一就可以查询到。
其中 not 会将条件取反
查询薪资是11000大洋,并且提成是0.3的员工信息(查询员工的编号,名称,薪资,提成)
复制代码
select
employee_id,first_name ,salary ,commission_pct
from
t_employees
where
salary = 11000 and commission_pct = 0.3;
5.4.4 区间查询(between 数值 and 数值)
这个between and其实就相当于 用大于等于和小于等于的组合。
包含边界的。
需要指定好字段值的边界。并且需要左侧的数值小,右侧的数值大。不然无法查询到结果。
查询员工的薪资在5000~10000之间的员工信息。(查询员工的编号,名称,薪资)
复制代码
select
employee_id,first_name ,salary
from
t_employees
where
salary between 5000 and 10000;
5.4.5 NULL 值判断(is null、is not null)
当对某个列判断是否是NULL值时,不能使用 = 或者 != 之类的方式。
必须采用 字段 is null 、 字段 is not null 的方式
查询没有提成的员工信息(查询员工的编号,名称,薪资,提成)
复制代码
select
employee_id,first_name ,salary,commission_pct
from
t_employees
where
commission_pct is not null;
5.4.6 字段多值判断(in)
正常如果涉及到了某一个字段,可以为多个值的匹配条件时。
正常可能需要 字段 = xxx or 字段 = yyy or 字段 = zzz。 写着成本太高。
可以采用in来实现。
字段 in (xxx,yyy,zzz)
查询员工属于60,70,80,90号部门的员工信息。(查询员工的编号,名称,薪资,部门编号)
复制代码
select
employee_id,first_name ,salary,department_id
from
t_employees
where
department_id in (60,70,80,90);
5.4.7 模糊查询(like)
模糊查询一般是来匹配字符串的。
其中有两个关键字。 % _
字段 like 's%' :查询出这个字段中以s开头的数据。
字段 like 's_' :查询出s开头,并且后面只有一个字符
%:代表任意长度的任意字符
_:代表单个任意字符
Ps:这两个特殊字符只能配合like使用
查询名字以L开头的员工信息(查询员工的编号,名称,薪资)
复制代码
select
employee_id,first_name ,salary
from
t_employees
where
first_name like 'L%'
查询名字以L开头,但是名字长度为4个字符的员工信息(查询员工的编号,名称,薪资)
复制代码
select
employee_id,first_name ,salary
from
t_employees
where
first_name like 'L___'
5.4.8 分支结构查询(case when then else end)
语法:这里的分支结构查询一般是放在select后面的特殊操作。
复制代码
case
when 条件1 then 结果1
when 条件2 then 结果2
when 条件3 then 结果3
………………
else 结果
end
可以认为是case开头,end结尾,中间写when then的内容
就是类似Java中的switch
查询员工信息,并根据薪资范围,体现出员工的薪资等级
salary 0 ~ 4000 = E
salary 4000 ~ 6000 = D
salary 6000 ~ 8000 = C
salary 8000 ~ 10000 = B
salary 10000 ~ ...... = A
复制代码
select
employee_id,first_name ,salary ,
case
when salary >= 0 and salary < 4000 then 'E'
when salary >= 4000 and salary < 6000 then 'D'
when salary >= 6000 and salary < 8000 then 'C'
when salary >= 8000 and salary < 10000 then 'B'
else 'A'
end as salary_level
from
t_employees;
语法:select 列名 from 表名 where 条件 group by 列名
查询各部门的人数(查询部门编号,部门对应的人数)
复制代码
select
department_id 部门编号, count(*) 部门人数
from
t_employees
group by department_id;
查询各个部门的平均工资(查询部门编号,部门的平均工资)
复制代码
select
department_id 部门编号, avg(salary) 平均工资
from
t_employees
group by department_id;
查询各个部门、各个岗位的人数(部门编号,岗位信息,人数)
1、根据department_id分组。
2、根据job_id分组
3、做count统计查询
复制代码
select
department_id 部门编号, job_id 岗位信息, count(*) 人数
from
t_employees
group by department_id,job_id;
# 查询各个部门、各个岗位,薪资大于5000的人数(部门编号,岗位信息,人数)
select
department_id 部门编号, job_id 岗位信息, count(*) 人数
from
t_employees
where
salary > 5000
group by department_id,job_id;
5.9 分组过滤查询
如果需要在做过分组之后,再次对接过做二次筛选,需要使用having的方式编写条件
语法: select 列名 from 表名 where 条件 group by 列名 having 条件 order by 列名
查询各个部门、各个岗位的人数(部门编号,岗位信息,人数),只查看人数大于10个的
复制代码
select
department_id 部门编号, job_id 岗位信息, count(*) 人数
from
t_employees
group by department_id,job_id
having 人数 > 10;
查询各个部门中,平均薪资大于10000的部门信息(部门编号,平均薪资)
复制代码
select
department_id 部门编号,avg(salary) avg_salary
from
t_employees
group by department_id
having avg_salary > 10000;
# 查询各个部门中,所有员工平均薪资大于10000的部门信息(部门编号,平均薪资),在根据平均薪资做排序
select
department_id 部门编号,avg(salary) avg_salary
from
t_employees
group by department_id
having avg_salary > 10000
order by avg_salary asc;
5.10 限定查询
比如查询时,查询到了上千条的数据,但是暂时只需要前5条,可以基于limit只获取前5条数据返回。
采用limit帮助咱们实现。 limit是MySQL特有的一个关键字。
语法:select 列名 from 表名 where 条件 group by 列名 having 条件 order by 列名 limit 起始行,行数
起始行(offset):你返回的数据,从第几行开始, 从第0行开始。
行数(size):一共返回几行数据
limit 0,5:从第一行数据开始,往下一共返回5条。
limit的第一个offset可以省略不写,不写代表写的是0。
查询表中薪资最高的前5名员工的所有信息。
薪资最高的话,需要基于salary做降序排序。
基于limit,只返回前5条数据。
复制代码
select
*
from
t_employees
order by salary desc
limit 0,5
查询表中薪资最高的6~10名员工的所有信息。
复制代码
select
*
from
t_employees
order by salary desc
limit 5,5
limit很多时候可以同于分页操作,比如需要分页时
可以采用limit,在数据库中查询到不同页数的数据,给页面返回,让页面展示数据即可。
5.11 子查询
查询语句返回的结果,可以再次看成一张表去操作。
select 列名 from 表名 where 条件(子查询操作替代一些值)
select 列名 from (子查询的结果集) where 条件
5.11.1 子查询作为查询字段某个值
查询薪资和Bruce工资一致的员工信息。
通过查询可以得到Bruce的工资信息
再基于另一个查询,将前面的Bruce的薪资结果作为条件判断的一环,从而实现利用子查询得到结果
1、查询Bruce的工资信息,返回 单列单行
select salary from t_employees where first_name = 'Bruce';
2、基于Bruce的工资信息查询与其薪资一致的员工信息
复制代码
select
*
from
t_employees
where
salary = (select salary from t_employees where first_name = 'Bruce');
5.11.2 子查询作为 字段多值判断的值
因为字段多值判断是采用in的方式去做条件筛选。 一个字段需要多个值。
在利用子查询时,应当返回 单列多行 数据。
查询last_name为King同一部门的员工信息
1、查询last_name为King的部门信息。
select department_id from t_employees where last_name = 'King';
2、基于上述查询返回的结果,查看同部门的员工信息
复制代码
select
*
from
t_employees
where
department_id in (select department_id from t_employees where last_name = 'King');
5.11.3 子查询作为 一张表操作。
可以直接基于子查询返回的结果集做二次筛选。
查询员工表中,工资排名前5名的员工。
这个查询可以直接使用order by 排序,然后基于limit做筛选。
就为了使用,搞两个SQL实现,利用子查询来玩。
1、查询员工的信息,基于salary做降序排序。
select * from t_employees order by salary desc;
2、将上述的结果基于limit筛选出前5条。
复制代码
select
*
from
(select * from t_employees order by salary desc) as temp
limit 5
5.11.4 子查询的ALL、ANY(了解)
之前在给字段做=判断时,子查询必须返回单列单行的数据,不然报错。
其实在做=判断时,即便返回了单列多行数据,也可以采用ALL、ANY关键字解决问题。
查询工资高于60部门员工的,所有人的信息。
select salary from t_employees where department_id = 60;
1、查询比60部门所有员工薪资都高的员工信息。
复制代码
select
*
from
t_employees
where
salary > ALL (select salary from t_employees where department_id = 60);
2、查询比60部门任意一名员工薪资高的员工信息。
复制代码
select
*
from
t_employees
where
salary > ANY (select salary from t_employees where department_id = 60);
语法:select 列名 from 表1 连接方式 表2 on 连接条件连接方式 表3 on 连接条件 ............
内连接语法: select 列名 from 表1 inner join 表2 on 连接条件
外连接:
左外连接:select 列名 from 表1 left [outer] join 表2 on 连接条件
右外连接:select 列名 from 表1 right [outer] join 表2 on 连接条件
内连接查询操作。
内连接查询,针对哪些 连接条件 无法满足的数据,会直接筛选掉。
查询当前员工名称以及对应的部门名称。
复制代码
# 显示内连接
select
e.first_name , e.last_name , d.department_name
from
t_employees as e
inner join t_departments as d on e.department_id = d.department_id;
# 隐示内连接
select
e.first_name , e.last_name , d.department_name
from
t_employees e, t_departments d
where
e.department_id = d.department_id;
查询员工的名称,部门的名称,部门所在国家的信息(三张表联查)
复制代码
# 查询员工的名称,部门的名称,部门所在国家的信息(三张表联查)
# 显示内连接
select
e.first_name , e.last_name ,d.department_name,l.city
from
t_employees e
inner join t_departments d on e.department_id = d.department_id
inner join t_locations l on l.location_id = d.location_id;
# 隐示内连接
select
e.first_name , e.last_name ,d.department_name,l.city
from
t_employees e , t_departments d ,t_locations l
where
e.department_id = d.department_id
and d.location_id = l.location_id;
外连接查询
还是基于前面玩的查询,查询当前员工名称以及对应的部门名称。
因为之前用的内连接的方式,导致一个员工
发现,最后的部门Id是一个NULL,导致后续查询时,并没有这个员工的信息返回。
现在可以采用外链接的方式,来解决这个问题。
外链接前面说过左外的语法,和右外的语法。
其实就是将左边的表,或者是右边的表作为基准表,基准表回返回全部的数据,无论连接条件是否满足。
复制代码
# 查询当前 所有 员工名称以及对应的部门名称。
select
e.first_name , e.last_name ,d.department_name
from
t_employees e left outer join t_departments d
on e.department_id = d.department_id;