單行和多行子查詢
單行和多行子查詢
--子查詢(單行子查詢,多行子查詢)
--查詢比"CLARK"工資高的員工的信息?
--[1]'CLARK'的工資是多少?
SELECT SAL FROM EMP WHERE ENAME ='CLARK'; --2450
--[2]比2450高的員工信息
SELECT * FROM EMP WHERE SAL >2450;
----子查詢:
--將一個查詢的結果作為另外一個查詢的條件來使用
SELECT * FROM EMP WHERE SAL >(SELECT SAL FROM EMP WHERE ENAME ='CLARK');
語法:
SELECT 字段列名 FROM 表名
WHERE 條件 比較符 (SELECT * FROM 表名);
-- 特點:
--子查詢在主查詢前執行一次
--主查詢使用子查詢的結果
--【1】子查詢可以作為另外的一個查詢的條件來使用
--查詢工資高於平均工資的雇員的名字和工資
--[1]平均工資
SELECT AVG (SAL) FROM EMP;
SELECT ENAME ,SAL
FROM EMP
WHERE SAL >( SELECT AVG (SAL) FROM EMP)
ORDER BY SAL;
--查詢和SCOTT同一部門且比他工資低的雇員的名字和工資
--'SCOTT'在哪個部門?
SELECT DEPTNO FROM EMP WHERE ENAME ='SCOTT'; --20
--'SCOTT'的工資?
SELECT SAL FROM EMP WHERE ENAME ='SCOTT'; --3000
SELECT ENAME,SAL
FROM EMP
WHERE DEPTNO = ( SELECT DEPTNO FROM EMP WHERE ENAME ='SCOTT')
AND SAL<(SELECT SAL FROM EMP WHERE ENAME ='SCOTT');
--注意:子查詢的字段不能多於一個,只能有一個
--【2】子查詢可以作為insert語句的值來使用
--今天新入職一個員工,與'SCOTT'同一個部門
INSERT INTO EMP (EMPNO,ENAME,DEPTNO,HIREDATE)
VALUES
(1001,'碼上成功',
(SELECT DEPTNO FROM EMP WHERE ENAME ='SCOTT'),SYSDATE);
SELECT * FROM emp;
--【3】子查詢可以作為update的條件或修改的值來使用
--將 ‘新員工’ 的工作修改為與‘SMITH’的工作相同
--[1]smith的工作
SELECT job FROM EMP WHERE ENAME = 'SMITH';
UPDATE EMP
SET JOB =( SELECT job FROM EMP WHERE ENAME = 'SMITH')
WHERE ENAME = '成功';
--將比FORD工資低的員工都加1000塊錢
--[1]'FORD'的工資是
SELECT SAL FROM EMP WHERE ENAME = 'FORD';
UPDATE EMP SET SAL =SAL+1000
WHERE SAL<(SELECT SAL FROM EMP WHERE ENAME = 'FORD');
SELECT * FROM EMP;
--【4】子查詢可以作為delete的條件使用
--比FORD工資高的都刪除
DELETE EMP
WHERE SAL >(SELECT SAL FROM EMP WHERE ENAME = 'FORD');
--【5】子查詢的結果可以作為一個表來使用
SELECT EMPNO AS 經理編號,ENAME AS 經理姓名 FROM EMP;
--查詢員工的編號,姓名,經理姓名
SELECT E.EMPNO 員工編號,E.ENAME 員工姓名 ,M.經理姓名
FROM EMP E,( SELECT EMPNO AS 經理編號,ENAME AS 經理姓名 FROM EMP) M
WHERE E.MGR = M.經理編號(+); --92標准
SELECT E.EMPNO 員工編號,E.ENAME 員工姓名 ,M.經理姓名
FROM EMP E LEFT JOIN
( SELECT EMPNO AS 經理編號,ENAME AS 經理姓名 FROM EMP) M
ON E.MGR = M.經理編號; --99
--多行子查詢
--子查詢的結果返回是 多行數據
--all:和子查詢返回的所有值比較
--any:和子查詢返回的任意一個值比較
--in :等於列表中的任何一個
--查詢工資低於任何一個“CLERK”崗位的工資的雇員信息。
--查詢CLERK這個職位的工資是多少? 1300
SELECT SAL FROM EMP WHERE JOB = 'CLERK';
SELECT MAX(SAL) FROM EMP WHERE JOB = 'CLERK';
SELECT * FROM EMP
WHERE SAL <(SELECT MAX(SAL) FROM EMP WHERE JOB = 'CLERK');
SELECT * FROM emp;
SELECT * FROM EMP
WHERE SAL < ANY (SELECT SAL FROM EMP WHERE JOB = 'CLERK');
--查詢工資比所有的'SALESMAN'職位都高的雇員的編號,名字和工資
--[1]'SALESMAN'工資都是多少?
SELECT SAL FROM EMP WHERE JOB = 'SALESMAN';
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE SAL >ALL (SELECT SAL FROM EMP WHERE JOB = 'SALESMAN') ;
--查詢部門20中的職務同部門10的雇員一樣的雇員信息.
--[2]部門10是什么職務
SELECT JOB FROM EMP WHERE DEPTNO = 10;
SELECT * FROM EMP
WHERE JOB IN(SELECT JOB FROM EMP WHERE DEPTNO = 10)
AND DEPTNO = 20;
--查詢在雇員中那些是經理人
--查詢經理人的編號
--查詢每個部門平均薪水的等級
--小結:
--[1]多表連接查詢 --92標准
--等值連接查詢 -->兩個表之間,存在主外鍵關系
--非等值連接 -->兩個表之間沒有直接關系 >= ,<= .....
--以上兩個查詢,參與查詢的表是平級關系
--左外連接,右外連接 --參與查詢的兩個表之間有主次之分
--[2]多表連接查詢--99標准
--交叉連接 croos join -->笛卡爾積
--自然連接 natural join
-->相當於等值連接(前提是兩個參與表中有同名列,要求同名列類型完全一致)
--using連接
-->參與查詢的兩個表中多個同名列,使用using制定使用特定的列進行連接
--inner join ....on...where --等值連接
--左外鏈接 left join
--右外連接 right join
--全連接 full join
--[3] 單行子查詢
--子查詢的結果是單行單列
--使用>=,<=,=,<,>,<> 進行where后的條件判斷
--[4]多行子查詢
--子查詢的結果是多行單列的
--使用 any :任意一個 , all(全部), in(等值)
