單行和多行子查詢
單行和多行子查詢
--子查詢(單行子查詢,多行子查詢) --查詢比"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(等值)