上一篇:Oracle入門學習三 學習視頻:https://www.bilibili.com/video/BV1tJ411r7EC?p=35 Oracle表連接:內連接、外連接。外連接分左連接、右連接。 多表查詢時,如果表之間沒有條件關聯,則會把所有匹配的結果查找出來,例如A表6條數據,B表7條數據, ...
上一篇:Oracle入門學習三
學習視頻:https://www.bilibili.com/video/BV1tJ411r7EC?p=35
Oracle表連接:內連接、外連接。外連接分左連接、右連接。
多表查詢時,如果表之間沒有條件關聯,則會把所有匹配的結果查找出來,例如A表6條數據,B表7條數據,查出來就是42條。
--笛卡爾積:返回兩張表中所有匹配的結果,沒有意義。所以多表查詢,必須寫關聯條件。 select * from staff,department where staff.id=department.staff_id;View Code
內連接的表如果多於兩個,則每個表必須要直接或者間接的關聯。例如查A、B、C表,條件A.某列=B.某列 and A.某列=C.某列,則B表和C表有間接的關聯。
多表關聯時,其中某列必須唯一,例如查表A、B、C,A.Column1 = B.Column2 and A.Column3=C.Column4,其中Column1和Column2至少有一列在自己的表裡是唯一值,
Column3和Column4至少有一列在自己的表裡是唯一值。
非等值表連接:
select ename,sal from emp e,salgrade g where e.sal between g.losal and g.hisal
--這個losal到hisal的區間範圍是唯一的
grade losal hisal 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999
自連接:自己關聯自己,但是作為不同表的定義,自連接一般可以使用子查詢替代,使用子查詢會更加清晰。
--自連接,將emp看做是兩張不同的表,e是員工表,m是領導表 select distinct m.empno, m.ename, m.sal from emp e, emp m where e.mgr = m.empno --自連接用的情況不多,可以使用子查詢實現 select * from emp m where m.empno in (select distinct mgr from emp)
外連接:主表中的數據全部選出,從表只選匹配的數據,不匹配的數據會用null替代。
外連接中的左外連接,左邊是主表,右邊是從表。外連接中的右外連接,右邊是主表,左邊是從表。
create table testa( id number(3), name varchar2(10), age number(2) ); insert into testa values(1,'a',23); insert into testa values(2,'b',24); insert into testa values(3,'c',25); insert into testa values(4,'d',26); create table testb( id number(3), salary number(8,2) ); insert into testb values(1,9000); insert into testb values(2,9000); insert into testb values(3,9000); select * from testa left join testb on testa.id=testb.id;
select * from testa right join testb on testa.id=testb.id;
分頁查詢:藉助“rownum”偽列進行分頁查詢。
--分頁查詢,每頁五條,查詢第二頁數據6-10 --使用偽列,不真正的存在表裡 select rownum from emp ; select a.*,rownum from emp a; select * from (select a.*,rownum r from emp a) x where x.r>5 and x.r<=10;View Code
最內層:即將被分頁的全部數據,可能會被排序,定義成x表。 select * from emp; 中間層:啟動行編號偽列,定義成y表 select x.*,rownum r from x; 最外層:數據過濾,分頁開始 select * from y where y.r >0 and r<=10
日期添加與轉換:
--查詢系統日期 select sysdate from dual; --向前走一天 明天 select sysdate+1 from dual; --向後走一天 昨天 select sysdate-1 from dual; --下個月的今天 select add_months(sysdate,1) from dual; --上個月的今天 select add_months(sysdate,-1) from dual; -- 加1小時,1分,1秒 select sysdate+1/24+1/(24*60) + 1/(24*60*60) from dual
日期截取:
select trunc(sysdate) from dual; --預設精確到天 select trunc(sysdate,'dd') from dual; --精確到天 select trunc(sysdate,'mm') from dual;--精確到月 select trunc(sysdate,'yyyy') from dual;--精確到年 select trunc(sysdate,'hh') from dual;--精確到時 select trunc(sysdate,'mi') from dual;--精確到分