MySQL复合查询(查询直接看这里)

回顾基本查询

  • 查询工资高于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;

比如:

MySQL复合查询(查询直接看这里)_第1张图片

先以deptno列进行分组(group by),这一步指的是将多个部门号一样的合在一起

输出的有:deptno, format(avg(sal), 2) , max(sal)

然后FORMAT(AVG(sal), 2):对平均薪水进行格式化,保留两位小数;然后MAX(sal)找出每个部门的最高薪水。

MySQL复合查询(查询直接看这里)_第2张图片

  • 显示平均工资低于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');

你可能感兴趣的:(MySQL,mysql,数据库)