數據庫中的子查詢


概述

  • 什么是子查詢?
    select語句當中嵌套select語句,被嵌套的select語句是子查詢。
  • 子查詢可以出現在哪里?
    select
    ...(select)
    from
    ...(select)
    where
    ... (select)

where后面嵌套子查詢

  • 例子
    找出高於平均薪資的員工信息。
  • 錯誤寫法:
SELECT * FROM emp
where sal>avg(sal);

原因:where后面不能使用分組函數。

  • 分步查詢
    先找出平均薪資:SELECT avg(sal) FROM emp;(2073.214286)
    再過濾:
SELECT * FROM emp
where sal>2073.214286;
  • 合並:
SELECT * FROM emp
where sal > (
SELECT * FROM emp
where sal>avg(sal)
);

嵌套查詢

from后面嵌套子查詢

  • 例子
    找出每個部門平均薪水的薪資等級。
  • 解答:
    1、找出每個部門平均薪水(按照部門編號分組,求sal的平均值)
SELECT deptno, avg(sal) as avgsal 
from emp 
group by deptno;

在這里插入圖片描述
2、將以上的查詢結果當做臨時表t,讓t表和salgrade s表連接。

SELECT t.*, s.grade 
FROM (SELECT deptno, avg(sal) as avgsal 
from emp 
group by deptno) t
join salgrade s
on
t.avgsal between s.losal and s.hisal;

在這里插入圖片描述

  • 例子
    找出每個部門的薪水等級的平均值
    1、找出每個員工的薪資等級
SELECT e.ename, e.sal, e.deptno, s.grade
from emp e 
join salgrade s 
on e.sal between s.losal and s.hisal;

在這里插入圖片描述
2、看似會用到子查詢,但是不會(因為需要的數據都有)。

SELECT e.deptno, avg(s.grade) 
FROM emp e
join salgrade s
on
e.sal between s.losal and s.hisal 
group by e.deptno;

在這里插入圖片描述

select后面嵌套子查詢

  • 例子
    找出每個員工所在的部門名稱,要求顯示員工名和部門名。
    (用嵌套的方法,不用連接)
SELECT e.ename, 
(
select d.dname 
from dept d 
where e.deptno = d.deptno
) as dname
from emp e;

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM