回顾基本查询
- 查询工资高于500或岗位为TOM的雇员,同时还要满足他们的姓名首字母为大写的J
select * from EMP where(sale > 500 or job = 'TOM') and ename like 'J%';
- 按照部门号升序而雇员的工资降序排序
select * from EMP order by deptno, sal desc;
最后,使用 ORDER BY 子句按照年薪列进行降序排序。DESC 关键字表示降序排序。
- 显示工资最高的员工的名字和工作岗位
select ename, job from EMP where sal = (select max(sal) from EMP);
这里为啥不能直接在where子句中用max把最大sal筛选出来,而是要再select一次呢?
可以这么理解:where子句期待的返回值是一个布尔值类型,而不是一个数字或者说某一个值。
更标准的解释就是where是对行与行之间进行比较筛选,而max是对整个表的数据进行筛选。
- 显示工资高于平均工资的员工信息
select ename, sal from EMP where sal>(select avg(sal) from EMP);
- 显示每个部门的平均工资和最高工资
select deptno, format(avg(sal), 2) , max(sal) from EMP group by deptno;
比如:
先以deptno列进行分组(group by),这一步指的是将多个部门号一样的合在一起
输出的有:deptno, format(avg(sal), 2) , max(sal)
然后FORMAT(AVG(sal), 2):对平均薪水进行格式化,保留两位小数;然后MAX(sal)找出每个部门的最高薪水。
- 显示平均工资低于2000的部门号和它的平均工资
select deptno, avg(sal) as avg_sal from EMP group by deptno having avg_sal<2000;
having相当于二次筛选,将分组好的部门号筛选出薪资小于2000的
- 使用年薪进行降序排序
select ename, sal*12+ifnull(comm,0) as '年薪' from EMP order by 年薪 desc;
在这个查询中,使用了表达式 sal * 12 + IFNULL(comm, 0) 来计算年薪。sal 代表薪水,comm 代表佣金(如果有)。IFNULL(comm, 0) 函数用于确保佣金字段的值不为空,如果为空,则将其替换为零。
使用 AS ‘年薪’ 语法将计算得到的年薪列重命名为“年薪”。
子查询
有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询
单行子查询
显示和SMITH处于同一部门的员工
select * from EMP where deptno = (select deptno from EMP where ename='smith');