-- 查询出每个部门的平均薪资,起别名t ,用作临时表(一会放入子查询)
SELECT
e.departmentid,AVG(e.salary) as avgsal
FROM
employee as e
GROUP BY
departmentid
结果图:
最终SQL代码:再为 t 表里的平均薪资查询出对应的薪资等级
-- 用查询出来的每个部门平均薪资表t,去匹配薪资等级表,找出每个部门的平均薪资是属于什么薪资等级
SELECT
t.departmentid,s.grade
FROM
(SELECT
e.departmentid,AVG(e.salary) as avgsal
FROM
employee as e
GROUP BY
e.departmentid) t
INNER JOIN
salgrade s
on
t.avgsal BETWEEN s.losal and s.hisal
ORDER BY
t.departmentid
最终查询后的结果图:
情景2、查询部门中所有人的薪资等级的平均等级
第一步:先查出每个部门里员工对应的薪资等级,起别名为 t ,用作临时表(一会用作子查询)
SELECT
e.*,s.grade
FROM
employee e
INNER JOIN
salgrade s
ON
e.salary BETWEEN s.losal and s.hisal
ORDER BY
departmentid
结果图:
最终SQL语句:再对 t 表里的每个部门员工的薪资等级求均值
SELECT
t.departmentid,AVG(t.grade) as avgra
FROM
(SELECT
e.*,s.grade
FROM
employee e
INNER JOIN
salgrade s
ON
e.salary BETWEEN s.losal and s.hisal
ORDER BY departmentid ) t
GROUP BY t.departmentid
有时需要将表中的记录去掉重复后显示出来,可以用distinct关键字来实现,例如执行语句 SELECT * FROM user返回结果如下:
此时看到id=2,3的记录username字段相同,如果想查询所有不重复的username,可以执行如下:
SELECT distinct username FROM user
例如执行排序语句: SELECT * FROM user order by id asc得到三条升序的数据,如果想限制只显示2条,可以使用LIMIT关键字: SELECT * FROM user order by id asc limit 0,2。LIMIT后面跟着的表示起始偏移量和前N行记录,默认起始偏移量为0,所以这句话也可以写为: SELECT * FROM user order by id asc limit 2。 LIMIT经常和order by一起配合使用来进行分页显示。
聚合 *** 作的语法涉及下面几个参数:
示例:
表连接从大类上分为内连接和外连接。二者区别在于内连接只选出两张表中互相匹配的记录,外连接会选出其他不匹配的记录。
示例:
创建一个雇员表deployee,有五个人:
再创建一个部门表,有4个部门:
某些情况下,查询的条件是另外一个select语句的结果,这时用到子查询。子查询关键字有in,not in,= ,!=,exists,not exists等。
如执行 select * from deployee where deployee.dep_id in (select dep_id from department)也表示查询有部门的雇员。如果子查询记录数唯一,可以使用=代替in:
select * from deployee where deployee.dep_id in (select dep_id from department where dep_id = 'sale') 由于子查询只有一条记录,所有可以用等号
如果要求将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,需要使用union和union all关键字来实现。
union 和 union all的主要区别是union all是把结果集直接合并在一起,而union 是将union all后的结果进行一次distinct,去除重复的记录。
示例:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)