sql 單行和多行子查詢


單行和多行子查詢

單行和多行子查詢

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

 


免責聲明!

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



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