1.子查询知识体系,单行子查询,多行子查询
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) FROM employees 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種方法 |
| select * from emp where deptno in ????????????? (select deptno ?????????????? from dept ?????????????? where dname = 'SALES' or dname = 'ACCOUNTING'); |
|
|
?
| 操作符 | 含義 |
| IN | 等于列表中的任何一個 |
| ANY | 和子查詢返回的任意一個值比較 |
| ALL | 和子查詢返回的所有值比較 |
ANY
| 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'; |
|
|
ALL
| SELECT employee_id,last_name,job_id,salary FROM employees WHERE salary < ALL ???????????????? (SELECT salary ????????????????? FROM employees ????????????????? WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROC' |
|
|
?
| Eg: 比30號部門 任意一個員工薪高的員工信息? 大于集合中的最小值 any |
| select * from emp where sal > all(select sal ??????????????? from emp ??????????????? where deptno = 30); |
|
|
| 等價于: |
| select * from emp where sal > (select max(sal) ??????????? from emp ??????????? where deptno = 30); |
|
|
?
| 查詢是經理的員工信息 |
| 分析: SELECT * FROM emp WHERE empno in(經理的集合); |
| 實際: select * from emp where empno in ???????????? ( ????????????? select mgr from emp ???????????? ); |
|
|
| select * from emp where empno not in ( select mgr from emp where mgr is not null ); |
|
|
?
總結
以上是生活随笔為你收集整理的1.子查询知识体系,单行子查询,多行子查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: okb是什么币
- 下一篇: 2.oracle分页,找到员工表中薪水大