在本篇关于嵌入式数据库基础的文章中,我们探讨了如何在SQL查询中使用子查询来获取特定信息。首先,子查询可以用来筛选出特定条件的结果,如找出谁是拉克丝(Lacus)的下属。在这个场景下,SQL查询利用`IN`关键字来查找`mgr`字段与拉克丝的直接下属的`empno`匹配的员工。然而,`IN`关键字在性能上可能不理想,因为它会导致全表扫描,所以可以考虑使用其他方法。
当子查询结果是单列时,如查询每个部门的最高薪水,可以分别执行两个步骤:先计算每个部门的最大薪水(`max(salary)`),然后通过`IN`或`=`操作符查找拥有该最高薪水的员工。例如:
1. 每个部门的最高薪水:
```
SQL> select deptno, max(salary) from emp_xxx
where deptno is not null
group by deptno;
```
当子查询结果是多列时,可以结合`IN`或`=`与聚合函数,如找到拿最高薪水的员工和部门:
2. 每个部门拿最高薪水的员工:
```
SQL> select ename, salary, job, deptno from emp_xxx
where (deptno, salary) in (select deptno, max(salary) from emp_xxx
where deptno is not null
group by deptno);
```
在处理数据统计和比较时,子查询也可以用于`HAVING`短语,比如检查某个部门人数是否超过另一个部门,或者平均薪资的比较:
3. 部门人数对比:
```
SQL> select deptno, count(*) from emp_xxx
group by deptno
having count(*) > (select count(*) from emp_xxx where deptno = 30);
```
平均薪资比较:
```
SQL> select deptno, avg(IFNULL(salary, 0)) as avg_s
from emp_xxx
group by deptno
having avg_s > (select avg(IFNULL(salary, 0)) from emp_xxx where deptno = 20);
```
对于复杂的数据比较,如查询某人的薪水是否高于所有或任何叫拉克丝的员工,可以使用`ALL`和`ANY`关键字:
4. 薪水高于所有拉克丝的员工:
```
SQL> select ename, salary from emp_xxx
where ename = 'Lacus' and salary > ALL (select salary from emp_xxx where ename = 'Lacus');
```
薪水高于任何拉克丝的员工:
```
SQL> select ename from emp_xxx
where salary > ANY (select salary from emp_xxx where ename = 'Lacus');
```
最后,如果想知道谁和拉克丝在同一个部门,但不包括拉克丝本人,可以使用排除法:
5. 同部门但不同名的员工:
```
SQL> select ename from emp_xxx
where deptno in (select deptno from emp_xxx where ename = 'Lacus')
and ename <> 'Lacus';
```
通过这些SQL查询,我们可以有效地利用子查询在嵌入式数据库中进行复杂的数据筛选和分析,提升查询效率。理解这些概念对于编写高效且精确的数据库查询至关重要。