数据库查询习题分析

182 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情
今天开始加入四月打开计划
今天回顾了sql的知识。下面介绍介绍俺的学习心得吧。
首先,肯定需要有关学习目标,因为目标决定学习方式吧。如果仅仅想通过期末考试,考前看看教材就ok,但是数据库对程序员来说,是很重要的一门课程,我不允许他变成这样。而且数据库是一个非常需要动手的学科,很多题目描述越简单,越容易出错。给大家推荐一下刷题网站-------牛客网sql题库
大家百度一下就能看到了。
这里是些题目加我个人理解,和做法。
一定要记住--select后的字段,如果不在聚合函数中,就必须出现在 group by 后面。

image.png
dept image.png
emp
image.png 分析: 1.要查询哪些字段、表
2.连接条件

1查询所有员工的年工资、所在部门的名称,按年薪从低往高排序。
 

*sal*12 + nvl(comm ,0)  年工资,  dname  部门名称
	emp e, dept d*
/*年工资在emp表里面包括工资和奖金,但是有一些没有奖金,奖金为空,和空运算等于空,所以需要用函数把空变成0,用 IFNULL(expr1,expr2),或者用if(xx is null,0,xx)
部门名字dept里面,二者通过deptno连接*/
select IFNULL(e.sal*12+comm,e.sal*12) 年工资,d.dname 部门名字 from emp e,dept d where e.deptno=d.deptno order by e.sal*12 ASC;

2查询所有员工的编号、姓名,及其上级领导的编号、姓名。显示结果按领导的年工资降序 1.要查询哪些字段、表

e.empno  ,e.ename , b.empno   ,b.ename

emp e,emp b 

2.连接条件 e.mgr = b.empno

KING:老板 没有上级领导

 

/* 员工编号名字在emp里面,上级领导编号姓名也在emp里面
把emp看成两个表,然后连接。因为老板没有上级,等职连接没有匹配就不显示,所以,采取左外,右外等连接。
结构安装领导工资降序 desc
*/
select em.empno 员工的编号,em.ename 员工姓名,e.ename 领导的姓名,e.empno 领导的编号
from emp em left join emp e on e.empno=em.mgr 
ORDER BY IFNULL(e.sal*12+e.comm,e.sal*12) DESC;

3查询非销售人员的 :工作名称,以及从事同一工作员工的月工资之和,要求月工资之和大于5000,输出结果按月工资之和降序排列。

/* fei销售人员 !(job=SALESMAN) 从事同一个工作,表示按照工作分组, */
-- having 分组后选择组,where 对行处理,select对列处理
select job,SUM(sal) from emp
where job<>'SALESMAN' 
GROUP BY job
HAVING SUM(sal)>5000
ORDER BY SUM(sal) desc;

        

5查询所有领取奖金和不领取奖金的员工人数、平均工资。 错误做法:

select count(*),avg(sal)
from emp
group by comm ;

正确做法

按照有和没有分组,单纯group by comm 分组很多 不同comm分一组,
可以分两次查询,然后吧他们连ql union
然后计算每一组平均工资
*/
select count(*),avg(sal)
from emp
where comm is not null and comm>0;
UNION
select count(*),avg(sal)
from emp
where comm is null or comm=0;