喝咖啡的企鵝

          先做事情,再看心情……
          posts - 16, comments - 0, trackbacks - 0, articles - 0

          Oracle表查詢(2)

          Posted on 2009-11-30 12:16 咖啡企鵝 閱讀(197) 評(píng)論(0)  編輯  收藏 所屬分類: SQL

          多表查詢一般表達(dá)式:
          SELECT ...tx.cu,...FROM table1 t1,table2 t2,...tablen tn WHERE conditions;...--(conditions.count>=n-1)
          首先確定要查詢的字段以及要求條件字段會(huì)出現(xiàn)在那些表中,從而甄選出table1到tablen共n張表;
          為表起個(gè)別名(非必須),表名.字段 方式限定查詢字段;
          分析歸納出限定條件(重點(diǎn)難點(diǎn)),不會(huì)少于n-1個(gè);
          最后,有其他要求,如排序,酌情添加。

          自連接查詢:
          例表:SQL> desc emp;
          Name     Type         Nullable Default Comments
          -------- ------------ -------- ------- --------
          EMPNO    NUMBER(4)    --職員編號(hào)                         
          ENAME    VARCHAR2(10) Y                        
          JOB      VARCHAR2(9)  Y                        
          MGR      NUMBER(4)    Y         --上級(jí)編號(hào)               
          HIREDATE DATE         Y                        
          SAL      NUMBER(7,2)  Y                        
          COMM     NUMBER(7,2)  Y                        
          DEPTNO   NUMBER(2)     
          問題:查詢職員姓名,職員編號(hào),職員上級(jí)姓名,職員上級(jí)編號(hào);

          笨辦法:利用SELECT造出另一張表
          SELECT emp.ename,emp.empno,empx.ename,empx.empno FROM emp,(SELECT empno,ename FROM emp) empx WHERE emp.mgr = empx.empno;
          好辦法:利用別名造出另一張表
          SELECT cl.ename,cl.empno,ld.ename,ld.empno FROM emp cl,emp ld WHERE cl.mgr=ld.empno;

          分頁查詢
          1.利用ROWID
          SELECT * FROM table WHERE ROWID IN (SELECT B.rid FROM (SELECT ROWNUM rn,A.rid FROM (SELECT ROWID rid FROM table ORDER BY tdid) A WHERE ROWNUM<=16380) B WHERE B.rn>=16351) ORDER BY tdid;
          a-先按照tdid排序從table中選取ROWID表,另命名為A表;
          b-從A表補(bǔ)償增加ROWNUM列,并A表ROWID列建立新表,并加分頁行上限值限制選取最高行數(shù),另命名為B表;
          c-從B表選擇ROWID,并加分頁行下限值選取最低行數(shù),獲得分頁行的ROWID表;
          d-比較c步驟的ROWID表,從table選出相應(yīng)行,排序,分頁。
          2.利用ROWNUM
          SELECT * FROM (SELECT table.*,ROWNUM rn FROM table ORDER BY tdid DESC) A WHERE A.rn BETWEEN 16351 AND 16380;
          a-選取table所有列,按照tdid排序,并在最后補(bǔ)償ROWNUM列建立新表,另命名為A表;
          b-從A表選取rn在所取行數(shù)范圍內(nèi)的行,分頁。
          一般:利用ROWID效率比利用ROWNUM高。
          主站蜘蛛池模板: 溧水县| 汶上县| 高台县| 德化县| 苏尼特左旗| 宜川县| 铜川市| 忻州市| 台东县| 罗田县| 炉霍县| 合阳县| 晋中市| 海伦市| 万荣县| 博客| 青田县| 长岭县| 四子王旗| 南汇区| 喀喇沁旗| 天镇县| 洛南县| 三门峡市| 正安县| 建阳市| 陵水| 阳东县| 宁武县| 九龙坡区| 阜阳市| 阿瓦提县| 邵武市| 兴仁县| 突泉县| 将乐县| 卢氏县| 大方县| 横山县| 杂多县| 凉山|