多表查詢一般表達(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 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高。