Oracle表查询(2)

多表查询一般表达式:
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造出另一张表
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高。

你可能感兴趣的:(Oracle表查询(2))