多表查詢一般表達式:
SELECT ...tx.cu,...FROM table1 t1,table2 t2,...tablen tn WHERE conditions;...--(conditions.count>=n-1)
首先確定要查詢的字段以及要求條件字段會出現在那些表中,從而甄選出table1到tablen共n張表;
為表起個別名(非必須),表名.字段 方式限定查詢字段;
分析歸納出限定條件(重點難點),不會少于n-1個;
最后,有其他要求,如排序,酌情添加。
自連接查詢:
例表:SQL> desc emp;
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4) --職員編號
ENAME VARCHAR2(10) Y
JOB VARCHAR2(9) Y
MGR NUMBER(4) Y --上級編號
HIREDATE DATE Y
SAL NUMBER(7,2) Y
COMM NUMBER(7,2) Y
DEPTNO NUMBER(2)
問題:查詢職員姓名,職員編號,職員上級姓名,職員上級編號;
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表補償增加ROWNUM列,并A表ROWID列建立新表,并加分頁行上限值限制選取最高行數,另命名為B表;
c-從B表選擇ROWID,并加分頁行下限值選取最低行數,獲得分頁行的ROWID表;
d-比較c步驟的ROWID表,從table選出相應行,排序,分頁。
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排序,并在最后補償ROWNUM列建立新表,另命名為A表;
b-從A表選取rn在所取行數范圍內的行,分頁。
一般:利用ROWID效率比利用ROWNUM高。