1查詢工資比scott高的員工資訊
A 第一步:查詢出scott這個員工的工資
select sal from emp
where ename = 'SCOTT';

B 第二步:查詢出工資比scott高的員工資訊
select * fromemp
where sal >3000;
總結:
子查詢的本質:多個select語句的嵌套
2:子查詢的知識體系搭建
A 合理的書寫風格
B 子查詢外面()不要忘記
C 子查詢和主查詢能夠查詢的是同一張表,也能夠不是同一張表
僅僅要子查詢傳回的結果,主查詢能夠用就可以。
D 在什麼地方能夠防止子查詢
select a,b,c ---OK,僅僅能存放單行子查詢,不能使多行子查詢
from tab1 ---OK 能夠有子查詢
where col in(em1,em2) ---能夠有子查詢
col between a1 and a2
col > 222
col > ()
group by … ---不能夠有子查詢
having …. ---能夠有子查詢
order by … ---不能夠有子查詢
E 子查詢的分類
1.單行操作符相應單行子查詢。多行操作符相應多行子查詢。
2.依照子查詢傳回的條目數。分為:單行子查詢和多行子查詢
3.單行子查詢僅僅能使用單行比較操作符(= > >= < <= <>)
4.多行子查詢僅僅能使用多行比較操作符(int any all)
3 單行子查詢
Eg:查詢員工資訊和141号工種一樣的,薪水比143号員工工資高的員工
SQL> conn hr/123456
已連接配接。
SQL> select last_name,job_id,salary
2 FROM employees
3 WHERE job_id =
4 (SELECT job_id
5 FROM employees
6 WHERE employee_id = 141);
Eg:查詢工資最低的員工資訊
select last_name,job_id,salary
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees);
Eg:求各個部門編号和部門的最低工資(這個最低工資要比50号部門的最低工資要高)
思路分析:看子查詢 看group by 和 having條件檢索 看檢索對象
//子查詢:求50号部門的最低工資
à檢索 各部門的最低工資 比50号部門的最低工資 大的部門号和部門最小工資
SELECT department_id,MIN(salary)
GROUP By department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);
4 查詢部門名稱是SALES的員工資訊(2中方式)
方法1:子查詢
SELECT *
FROM emp
WHERE DEPTNO = (SELECT deptno
FROM dept
WHERE dname = 'SALES');
方法2:多表查詢
SELECT e.*
FROM emp e,dept d
WHERE e.deptno = d.deptno and d.dname = 'SALES';
注意:另外一種(多表查詢的運作速度比子查詢的運作速度快。由于多表查詢是一次将資料讀到記憶體中進行讀取,消耗記憶體而加高速度)
第一種(子查詢要進行兩次連接配接資料庫的操作。連接配接資料庫的操作是一個耗時操作,減低了速度)。
5 select後面要查詢的列中能夠是單行子查詢,不能夠是多行子查詢
錯誤案例:
select ename,empno,(select deptno from emp) AA from emp;
正确案例:
select ename,empno,(select deptno from emp where EMPNO = 7369) AA from emp;
6 查詢員工的姓名和薪水
select *
from (select ename,sal
from emp);
7 多行子查詢
多行子查詢僅僅能使用多行比較操作符(in any all)
--eg 查詢部門名稱是*(不是)SALES 和 ACCOUNTING 的員工資訊 2種方法
--eg 查詢薪水 比30号部門 随意一個員工薪高的員工資訊
-eg 查詢薪水 比30号部門 全部員工 高的員工資訊
查詢部門名稱是*(不是)SALES 和 ACCOUNTING 的員工資訊 2種方法
from emp
where deptno in
(select deptno
from dept
where dname = 'SALES' or dname = 'ACCOUNTING');
操作符
含義
IN
等于清單中的不論什麼一個
ANY
和子查詢傳回的随意一個值比較
ALL
和子查詢傳回的全部值比較
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROC';
WHERE salary < ALL
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROC'
Eg: 比30号部門 随意一個員工薪高的員工資訊 大于集合中的最小值 any
where sal > all(select sal
from emp
where deptno = 30);
等價于:
where sal > (select max(sal)
from emp
where deptno = 30);
查詢是經理的員工資訊
分析:
WHERE empno in(經理的集合);
實際:
where empno in
(
select mgr from emp
);
where empno not in
(
select mgr
where mgr is not null
);
本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5193739.html,如需轉載請自行聯系原作者