oracle表連線:內連線、外連線。外連線分左連線、右連線。
多表查詢時,如果表之間沒有條件關聯,則會把所有匹配的結果查詢出來,例如a表6條資料,b表7條資料,查出來就是42條。
--view code笛卡爾積:返回兩張表中所有匹配的結果,沒有意義。所以多表查詢,必須寫關聯條件。
select
*from staff,department where staff.id=department.staff_id;
內連線的表如果多於兩個,則每個表必須要直接或者間接的關聯。例如查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 fromemp 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
--外連線:主表中的資料全部選出,從表只選匹配的資料,不匹配的資料會用null替代。自連線,將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)
外連線中的左外連線,左邊是主表,右邊是從表。外連線中的右外連線,右邊是主表,左邊是從表。
createtable
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分頁查詢:借助「rownum」偽列進行分頁查詢。*from testa right
join testb on testa.id=testb.id;
--view code分頁查詢,每頁五條,查詢第二頁資料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>
5and x.r<=
10;
最內層:即將被分頁的全部資料,可能會被排序,定義成x表。日期新增與轉換:select
*from
emp;
中間層:啟動行編號偽列,定義成y表
select x.*,rownum r from
x;最外層:資料過濾,分頁開始
select
*from y where y.r >
0and r<=
10
--日期擷取:查詢系統日期
select sysdate from
dual;
--向前走一天 明天
select sysdate+
1from
dual;
--向後走一天 昨天
select sysdate-
1from
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;--
精確到分
Oracle(PLSQL)入門學習六
事務 把一組操作看做乙個工作單元,要麼都執行,要麼都不執行。dml操作才有事務,查詢沒有事務。提交事務 commit 回滾事務 rollback create table bank id number 5 primary key,money number 10 check money 0 inser...
Oracle PL SQL入門案例實踐
正在看的oracle教程是 oracle pl sql入門案例實踐。前面已經了解了關於pl sql程式設計的基礎,本文將結合乙個案例來加深對這些知識點的理解。一 案例介紹 某資料庫有兩張表,是關於某公司員工資料 薪水和部門資訊的,它們分別是emp表和dept表,兩張表的結構如下 要求如下 1 按照上...
Oracle PL SQL學習筆記
游標分類 游標概念 與游標相關的語法型別 建立游標 如同宣告任何其他變數一樣 cursor cursor name is sql statement 開啟與關閉游標 開啟游標 open cursor arg arg 關閉游標 close cursor 取資料 fetch cursor into va...