Oracle基礎教程(一)
Oracle簡介
Oracle是甲骨文公司開發的一款關系型數據庫,它一款系統可移植性好、使用簡單、功能強大的關系型數據庫。可以快速搭建一種高效率、可靠性好、高吞吐量的數據庫解決方案。
Oracle體系結構
- 實例:一個操作系統只有一個Oracle數據庫,但是可以安裝多個Oracle實例,一個Oracle實例對應着一系列的后台進程(Backguound Processes)和內存結構(Memory Structures)。
- 數據文件:Oracle數據文件是數據存儲的物理單位,數據庫的數據是存儲在表空間中的。一個表空間由一個或多個數據文件組成,一個數據文件只能屬於一個表空間,一旦數據文件被加入到某個表空間后,就不能刪除這個文件,如果要刪除某個數據文件,只能刪除其所屬於的表空間才行。
- 表空間:表空間是Oracle 對物理數據庫數據文件(ora/dbf)的邏輯映射。一個數據庫在邏輯上被划分成一到若干個表空間,每個表空間由同一磁盤上的一個或多個數據文件(datafile)組成。
- oracle用戶:表數據由Oracle用戶放入到表空間當中,而這些表空間會隨機的把數據放入到一個或者多個數據文件中。oracle對表數據的管理是通過用戶對表的管理去查詢,而不是直接對數據文件或表空間進行查詢。因為不同用戶可以在同一個表空間上面建立相同的表名。但是通過不同的用戶管理自己的表數據。
Oracle用戶
oracle用戶的概念對於Oracle數據庫至關重要,在現實環境當中一個服務器一般只會安裝一個Oracle實例,一個Oracle用戶代表着一個用戶群,他們通過該用戶登錄數據庫,進行數據庫對象的創建、查詢等開發。每一個用戶對應着該用戶下的N多對象,因此,在實際項目開發過程中,不同的項目組使用不同的Oracle用戶進行開發,不相互干擾。也可以理解為一個Oracle用戶既是一個業務模塊,這些用戶群構成一個完整的業務系統,不同模塊間的關聯可以通過Oracle用戶的權限來控制,來獲取其它業務模塊的數據和操作其它業務模塊的某些對象。
Oracle用戶創建
1 語法:創建用戶 2 -- Create the user 3 create user Cloud--用戶名 4 identified by "Wfy123456"--密碼 5 default tablespace USERS--表空間名 6 temporary tablespace temp --臨時表空間名 7 profile DEFAULT --數據文件(默認數據文件) 8 account unlock; -- 賬戶是否解鎖(lock:鎖定、unlock解鎖)
通過上面語句,可以創建一個Cloud用戶,但是該用戶現在還不能登錄數據庫,因為它沒有登錄數據庫權限,最少他需要一個create session系統權限才能登錄數據庫。
用戶權限
- Oracle用戶權限分為:系統權限和對象權限。
- 系統權限:create session可以和數據庫進行連接權限、create table、create view 等具有創建數據庫對象權限。
- 對象權限:對表中數據進行增刪改查操作,擁有數據庫對象權限的用戶可以對所擁有的對象進行相應的操作。
數據庫角色
oracle角色是若干系統權限的集合,給用戶進行授數據庫角色,就是等於賦予該用戶若干數據庫系統權限。常用的數據庫角色如下:
- CONNECT角色:connect角色是Oracle用戶的基本角色,connect權限代表着用戶可以和Oracle服務器進行連接,建立session(會話)。
- RESOURCE角色:resouce角色是開發過程中常用的角色。 RESOURCE給用戶提供了可以創建自己的對象,包括:表、視圖、序列、過程、觸發器、索引、包、類型等。
- DBA角色:DBA角色是管理數據庫管理員該有的角色。它擁護系統了所有權限,和給其他用戶授權的權限。SYSTEM用戶就具有DBA權限。
提示:系統權限只能通過DBA用戶授權,對象權限由擁有該對象權限的對象授權(不一定是本身對象)!用戶不能自己給自己授權!在實際開發過程中可以根據需求,把某個角色或系統權限賦予某個用戶。授權語句如下:
1 語法:授權 2 --GRANT 對象權限 on 對象 TO 用戶 3 grant select, insert, update, delete on ATE_DIE to cloud; 4 --GRANT 系統權限 to 用戶 5 grant select any table to cloud; 6 --GRANT 角色 TO 用戶 7 grant connect to cloud;--授權connect角色 8 grant resource to cloud;--授予resource角色 9 語法:取消用戶權限 10 -- Revoke 對象權限 on 對象 from 用戶 11 revoke select, insert, update, delete on ATE_DIE from cloud; 12 -- Revoke 系統權限 from 用戶 13 revoke SELECT ANY TABLE from cloud; 14 -- Revoke 角色(role) from 用戶 15 revoke RESOURCE from cloud; 16 語法:Oracle用戶的其他操作 17 --修改用戶信息 18 alter user cloud 19 identified by ****** --修改密碼 20 account lock;--修改用戶處於鎖定狀態或者解鎖狀態 (LOCK|UNLOCK )
SQL語句介紹
SQL語句可以對Oracle進行對象創建、刪除,數據的插入、刪除、更新,以及數據庫的管理等操作,SQL是一個結構化的的查詢語言(Structured Query Language),不僅僅適用於Oracle數據庫,再其它的數據也適用。在Oracle開發中,客戶端把SQL語句發送給服務器,服務器對SQL語句進行編譯、執行,把執行的結果返回給客戶端。常用的SQL語句大致可以分為五類:
- 數據定義語言(DDL),包括 CREATE(創建)命令、 ALTER(修改)命令、 DROP(刪除)命令等。
- 數據操縱語言(DML),包括 INSERT(插入)命令、 UPDATE(更新)命令、 DELETE(刪除)命令、 SELECT … FOR UPDATE(查詢)等。
- 數據查詢語言(DQL),包括基本查詢語句、Order By子句、 Group By子句等。
- 事務控制語言(TCL),包括COMMIT(提交)命令、 SAVEPOINT(保存點)命令、ROLLBACK(回滾)命令。
- 數據控制語言(DCL),GRANT(授權)命令、REVOKE(撤銷)命令。
1 -- Create table 2 create table LOT_WAFER 3 ( 4 fab VARCHAR2(12) default '廠區未錄入' not null,--地址 (1) 5 product VARCHAR2(40) not null,--(2) 6 flow VARCHAR2(40) not null, 7 lot VARCHAR2(40) not null, 8 lot_type VARCHAR2(12), 9 scribe_id VARCHAR2(40) not null, 10 wafer VARCHAR2(40) not null, 11 wafer_no VARCHAR2(2) not null, 12 run_no VARCHAR2(100) not null, 13 create_date DATE not null, 14 lot_owner VARCHAR2(40), 15 lot_comment VARCHAR2(100), 16 comment_detail VARCHAR2(400), 17 lot_state VARCHAR2(20), 18 update_time DATE 19 ) 20 tablespace USERS --(3) 21 pctfree 10 22 initrans 1 23 maxtrans 255 24 storage 25 ( 26 initial 64K 27 next 1M 28 minextents 1 29 maxextents unlimited 30 ); 31 -- Add comments to the table 32 comment on table LOT_WAFER --(4) 33 is 'WAFER下產線時的基本信息記錄表'; 34 -- Add comments to the columns 35 comment on column LOT_WAFER.fab -- (5) 36 is '廠區'; 37 comment on column LOT_WAFER.lot_type 38 is 'Lot種類'; 39 comment on column LOT_WAFER.wafer_no 40 is 'COMPONENTID后兩碼'; 41 comment on column LOT_WAFER.create_date 42 is 'wafer下產線的時間'; 43 comment on column LOT_WAFER.lot_owner 44 is 'Run32 10/21-11/21.13IC工程補投小批量'; 45 comment on column LOT_WAFER.lot_comment 46 is '13IC工程補投小批量'; 47 comment on column LOT_WAFER.comment_detail 48 is '13IC工程補投小批量'; 49 comment on column LOT_WAFER.lot_state 50 is '該Lot當前狀態'; 51 comment on column LOT_WAFER.update_time 52 is 'ETL maintains load datetime'; 53 -- Create/Recreate indexes 54 create unique index UK_LOT_WAFER on LOT_WAFER (WAFER, RUN_NO) 55 tablespace USERS 56 pctfree 10 57 initrans 2 58 maxtrans 255 59 storage 60 ( 61 initial 64K 62 next 1M 63 minextents 1 64 maxextents unlimited 65 );
Oracle建表(create table)
Oracle表是Oracle數據庫的核心,是存儲數據的邏輯基礎。Oracle表是一個二維的數據結構,有列字段和對應列的數據構成一個數據存儲的結構。可以簡單看成行和列的二維表,列代表着Oracle字段(column),行代表着一行數據(即一條數據記錄)。
Oracle字段數據類型
常用的Oracle列字段的數據類型如下:
| 數據類型 | 類型解釋 |
| VARCHAR2(length) | 字符串類型:存儲可變的長度的字符串,length:是字符串的最大長度,默認不填的時候是1,最大長度不超過4000。 |
| CHAR(length) | 字符串類型:存儲固定長度的字符串,length:字符串的固定長度大小,默認是1,最大長度不超過2000。 |
| NUMBER(a,b) | 數值類型:存儲數值類型,可以存整數,也可以存浮點型。a代表數值的最大位數:包含小數位和小數點,b代表小數的位數。例子:number(6,2),輸入123.4567,實際存入:123.45。 number(4,2),輸入12345.678,提示不能存入,超過存儲的指定的精度。 |
| DATA | 時間類型:存儲的是日期和時間,包括年、月、日、時、分、秒。內置函數sysdate獲取的就是DATA類型 |
| TIMESTAMP | 時間類型:存儲的不僅是日期和時間,還包含了時區。內置函數systimestamp獲取的就是timestamp類型 |
| CLOB | 大字段類型:存儲的是大的文本,比如:非結構化的txt文本,字段大於4000長度的字符串。 |
| BLOB | 二進制類型:存儲的是二進制對象,比如圖片、視頻、聲音等轉換過來的二進制對象 |
create table語句
Oracle數據庫建表是通過create table命令來執行的,在system用戶下創建一個LOT_WAFER(WAFER下產線時的基本信息記錄表)create table 命令的使用。
1 -- Create table 2 create table LOT_WAFER 3 ( 4 fab VARCHAR2(12) default '廠區未錄入' not null,--地址 (1) 5 product VARCHAR2(40) not null,--(2) 6 flow VARCHAR2(40) not null, 7 lot VARCHAR2(40) not null, 8 lot_type VARCHAR2(12), 9 scribe_id VARCHAR2(40) not null, 10 wafer VARCHAR2(40) not null, 11 wafer_no VARCHAR2(2) not null, 12 run_no VARCHAR2(100) not null, 13 create_date DATE not null, 14 lot_owner VARCHAR2(40), 15 lot_comment VARCHAR2(100), 16 comment_detail VARCHAR2(400), 17 lot_state VARCHAR2(20), 18 update_time DATE 19 ) 20 tablespace USERS --(3) 21 pctfree 10 22 initrans 1 23 maxtrans 255 24 storage 25 ( 26 initial 64K 27 next 1M 28 minextents 1 29 maxextents unlimited 30 ); 31 -- Add comments to the table 32 comment on table LOT_WAFER --(4) 33 is 'WAFER下產線時的基本信息記錄表'; 34 -- Add comments to the columns 35 comment on column LOT_WAFER.fab -- (5) 36 is '廠區'; 37 comment on column LOT_WAFER.lot_type 38 is 'Lot種類'; 39 comment on column LOT_WAFER.wafer_no 40 is 'COMPONENTID后兩碼'; 41 comment on column LOT_WAFER.create_date 42 is 'wafer下產線的時間'; 43 comment on column LOT_WAFER.lot_owner 44 is 'Run32 10/21-11/21.13IC工程補投小批量'; 45 comment on column LOT_WAFER.lot_comment 46 is '13IC工程補投小批量'; 47 comment on column LOT_WAFER.comment_detail 48 is '13IC工程補投小批量'; 49 comment on column LOT_WAFER.lot_state 50 is '該Lot當前狀態'; 51 comment on column LOT_WAFER.update_time 52 is 'ETL maintains load datetime'; 53 -- Create/Recreate indexes 54 create unique index UK_LOT_WAFER on LOT_WAFER (WAFER, RUN_NO) 55 tablespace USERS 56 pctfree 10 57 initrans 2 58 maxtrans 255 59 storage 60 ( 61 initial 64K 62 next 1M 63 minextents 1 64 maxextents unlimited 65 );
代碼解析:
(1)處:default 表示字段fab不填時候會默認填入‘廠區未錄入’值。
(2)處:not null 表示product字段不能為空。
(3)處:表示表system存儲的表空間是users,storage表示存儲參數:區段(extent)一次擴展64k,最小區段數為1,最大的區段數不限制。
(4)處:comment on table 是給表名進行注釋。
(5)處:comment on column 是給表字段進行注釋。
通過上面crate table命令創建了LOT_WAFER(WAFER下產線時的基本信息記錄表)后,還可以給表添加相應的約束來保證表數據的准確性。
1 案例2:LOT_WAFER(WAFER下產線時的基本信息記錄表)添加約束 2 -- Create/Recreate primary, unique and foreign key constraints 3 alter table SYSTEM.LOT_WAFER 4 add constraint pk_lot_wafer_scribe_id primary key (SCRIBE_ID); 5 --把scribe_id當做主鍵,主鍵字段的數據必須是唯一性的 6 -- Create/Recreate check constraints 7 alter table SYSTEM.LOT_WAFER 8 add constraint ch_LOT_WAFER_product 9 check (product <> '123456');--給字段product添加約束,不等於123456
Oracle查詢(select)
Oracle表數據進行查詢是數據查詢語言(DQL)。下簡單查詢是利用SELECT命令從表中進行提取數據,SELECT命令結構如下:
select *|列名|表達式 from 表名 where 條件 order by 列名
1 案例1:查詢WAFER下產線時的基本信息記錄表(LOT_WAFER)中“C43500”的基本信息: 2 select t.* from SYSTEM.LOT_WAFER t where t.LOTID = 'C43500'; 3 Oracle查詢(select) 4 案例2:查詢“C43500”的廠區、Lot種類、wafer下產線的時間: 5 select t.fab,t.lot_type,t.create_date from SYSTEM.LOT_WAFER t where t.lotid = 'C43500'; 6 Oracle查詢(select) 7 案例3:查詢“C43500”所有信息,按wafer下產線的時間進行升序展示: 8 select t.* from SYSTEM.LOT_WAFER t where t.LOTID = 'C43500' ORDER BY T.create_date ASC
語法解析:
1、“t”代表LOT_WAFER的別名。
2、"*" 代表所有字段。
3、表達式可以是函數(列名)、常數、連接詞“||”等組成的表達式。
4、where子語句是查詢語句的條件。
5、order by :查詢結果按某個字段進行排序,默認是升序,desc是降序。
備份查詢數據
Oracle進行表數據備份時,可以利用create table(建表)的方式對select查詢的結果進行快速備份。備份查詢數據命令結構:
create table 表名 as select 語句
1 create table SYSTEM.LOT_WAFER_2021 as select * from SYSTEM.LOT_WAFER; 2 select * from SYSTEM.LOT_WAFER_2021; 3 結果如下: 4 Oracle查詢(select) 5 Oracle插入(insert into) 6 Oracle對表數據的插入是使用insert命令來執行的。 7 insert 命令結構: 8 insert into 表名(列名1,列名2,列名3.....)values(值1,值2,值3.....);
Oracle插入(insert into)
Oracle對表數據的插入是使用insert命令來執行的。
insert 命令結構:
insert into 表名(列名1,列名2,列名3.....)values(值1,值2,值3.....);
在 Oracle 中,一個 INSERT 命令可以把一個select結果集一次性插入到一張表中。
語法結構如下:
INSERT INTO 表 SELECT 子句
語法解析:
1、列名可以省略,當列名不填時,默認的是表中的所有列,列的順序是按照建表的順序進行排列的。
2、列名的數量和值的數量要一致,並且值的類型要和列的類型一一對應。
3、當表當中某些字段設置了某些約束的情況下,必須按照字段的約束來進行該值的插入,例如:WAFER下產線時的基本信息記錄表(LOT_WAFER)當中設置有主鍵(主鍵字段是scribe_id),因此該字段必須具有唯一性,不能和原有的數據重復。fab、prouduct、lot、wafer_no等字段是必填字段,因此是必須有值的。
1 案例1:向WAFER下產線時的基本信息記錄表(LOT_WAFER)插入一條數據: 2 insert into SYSTEM.LOT_WAFER2021 3 (fab, 4 product, 5 flow, 6 lot, 7 lot_type, 8 scribe_id, 9 wafer, 10 wafer_no, 11 run_no, 12 create_date, 13 lot_owner, 14 lot_comment, 15 comment_detail, 16 lot_state, 17 update_time) 3 18 values 4 19 ('', 20 'IAL4UM-AA', 21 '', 22 'E2N316', 23 'P', 24 'E2N316#20', 25 '20', 26 '2021/12/7 7:55:35', 27 'ERP', 28 'Create', 29 'Lot User:3111144 CommentDetail:', 30 'Created', 31 '2021/12/9 10:36:13')
Oracle更新(update)
Oracle對表數據的更新是使用update命令來執行的。
update命令結構:
update 表名 set 列名1=值1,列名2=值2,列名3=值3..... where 條件
update 利用另外一張表關聯更新本表數據的命令結構如下:
update 表1 set 列名=(select 列名 from 表2 where 表1.列名=表2.列名)where exists (select 1 from 表2 where 表1.列名=表2.列名)
1 案例1、更新scribe_id“E2N3xx#03”的lot和wafer信息: 2 update system.wip_lot_wafer t 3 set t.lot = 'E2xx16', t.wafer = 'A04xxxx03' 4 where t.scribe_id = 'E2N3xx#03'; 5 commit;
Oracle刪除(delete)
Oracle中對表數據的刪除是利用delete命令進行的。
delete命令結構:
delete from 表名 where 條件
命令解析:
1、當delete from不加where條件時,表示是把表中的數據全部刪除。
1 案例1、刪除WAFER下產線時的基本信息記錄表(wip_lot_wafer)中scribe_id “E2N316#20”的數據: 2 delete from wip_lot_wafer t where t. scribe_id=' E2N316#20';
truncate命令
truncate命令也是數據刪除命令,他是直接把Oracle表數據一次刪除的命令,truncate命令是一個DDL命令,不同於delete是DML命令。
truncate命令結構:
truncate table 表名;
1 案例2、刪除WAFER下產線時的基本信息記錄表(wip_lot_wafer): 2 truncate table wip_lot_wafer;
truncate和delete都能刪除表中的數據,他們的區別:
1、TRUNCATE 是 DDL 命令,命令執行完就提交,刪除的數據不能恢復; DELETE 命令是 DML 命令,命令執行完需提交后才能生效,刪除后的數據可以通過日志文件恢復。
2、如果表中的數據量較大,TRUNCATE的速度比DELETE速度快很多。
3、truncate刪除將重新設置表索引的初始大小,而delete不能。
4、delete能夠觸發表上相關的delete觸發器,而truncate則不會觸發。
5、delete刪除的原理是一次一條從表中刪除數據,並將刪除操作當做事物記錄在數據庫的日志當中,以便進行數據回滾。而truncate是一次性進行數據頁的刪除,因此執行速度快,但是不能回滾。
總結:truncate命令是屬於DDL命令,一次性刪除表中所有數據,並且數據不能恢復,在實際開發過程當中truncate命令慎用。
Oracle運算符
Oracle運算符包括算術運算符、關系運算符和邏輯運算符。
Oracle算術運算符
Oracle算術運算符包括+、-、*、/四個,其中/獲得的結果是浮點數。
Oracle關系運算符
Oracle關系運算符在where條件語句當中經常使用到,常用的關系如下:
| 符號 | 解釋 | 符號 | 解釋 |
| = | 等於 | <>或者!= | 不等於 |
| > | 大於 | >= | 大於或者等於 |
| < | 小於 | <= | 小於或者等於 |
Oracle邏輯運算符
Oracle的邏輯運算符有三個:AND、OR、NOT。
Oracle字符串連接符||
Oracle中利用字符串連接符||(即雙豎線)來連接查詢結果。
Oracle DISTINCT
Oracle DISTINCT關鍵字的作用可以對Oracle查詢結果進行重復數據的消除。具體的做法參考案例:
DISTINCT語法結構:
SELECT DISTINCT 列1,列2,列3... from 表名;
語法解析:
當關鍵字DISTINCT后面只有一個列1時,表示的是單個字段查詢結果的不重復數據,當后面跟着多個列值時,表示的是多個字段組成的查詢結果的所有唯一值,進行的是多個字段的分組消除。
1 案例1、查詢WAFER下產線時的基本信息記錄表(wip_lot_wafer)“lot,wafer,scribe_id”的所有出現的數據,不重復:(案例所需表結構) 2 select distinct lot,wafer,scribe_id from wip_lot_wafer;
Oracle 條件查詢
Oracle條件查詢時經常使用=、IN、LIKE、BETWEEN...AND來作為條件查詢的操作符。
-
- =操作符:在條件查詢語句中“=”表示列值等於一個固定值所查詢出的結果。
- IN操作符:在 Where 子句中可以使用 IN 操作符來查詢其列值在指定的列表中的查詢結果。
- BETWEEN...AND:在 WHERE 子句中,可以使用 BETWEEN...AND 操作符來查詢列值包含在指定區間內的查詢結果 。
- LIKE模糊查詢:在Oracle條件查詢where條件之中,當遇到查詢值不清楚時,可以利用模糊查詢LIKE關鍵字進行where條件的模糊查詢。LIKE 關鍵字通過字符匹配檢索出所需要的數據行。
%:表示零個或者多個任意字符。
_:代表一個任意字符。
\:指轉義字符,“\%”在字符串中表示一個字符“%”。
Oracle集合運算
Oracle集合運算就是把多個查詢結果組合成一個查詢結果,oralce的集合運算包括:INTERSECT(交集)、UINION ALL(交集重復)、UINION(交集不重復)、MINUS(補集)。
- INTERSECT(交集),返回兩個查詢共有的記錄。
- UNION ALL(並集重復),返回各個查詢的所有記錄,包括重復記錄。
- UNION(並集不重復),返回各個查詢的所有記錄,不包括重復記錄 (重復的記錄只取一條)。
- MINUS(補集),返回第一個查詢檢索出的記錄減去第二個查詢檢索出的記錄之后剩余的記錄。
當我們使用Oracle集合運算時,要注意每個獨立查詢的字段名的列名盡量一致(列名不同時,取第一個查詢的列名)、列的數據類型、列的個數要一致,不然會報錯。
1 INTERSECT(交集): 2 3 select * from wip_lot_wafer 4 intersect 5 select * from wip_lot_wafer2021; 6 7 8 UNION ALL(並集重復) 9 10 select * from wip_lot_wafer 11 union all 12 select * from wip_lot_wafer2021; 13 14 15 UNION(並集不重復) 16 17 select * from wip_lot_wafer 18 union 19 select * from wip_lot_wafer2021; 20 21 22 MINUS(補集) 23 24 select * from wip_lot_wafer 25 minus 26 select * from wip_lot_wafer2021;
Oracle連接查詢
Oracle連接查詢,包含內關聯(inner jion )和外關聯(outer join),其中外關聯又分為左外關聯(left outer join)、右外關聯(right outer join)和全外關聯(full outer join)其中外關聯可以使用(+)來表示。
內連接:
Oracle內連接:兩張表通過某個字段進行內關聯,查詢結果是通過該字段按關系運算符匹配出的數據行。其中可以包括:
1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列。
2、不等連接:在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值,這些關系運算符包括>、>=、<=、!>、!<、<>。
1 select a.lot, 2 a.lot_type, 3 a.scribe_id, 4 b.priority, 5 b.die_qty, 6 b.product 7 from wip_lot_wafer a, wip_lot b 8 where a.lot = b.lot;
外連接:
外連接,返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接或左連接))、右表(右外連接或右連接)或兩個邊接表(全外連接)中的所有數據行。
1、left join(左聯接)等價於(left outer join)返回包括左表中的所有記錄和右表中聯結字段相等的記錄。
2、right join(右聯接)等價於(right outer join)返回包括右表中的所有記錄和左表中聯結字段相等的記錄。
3.、full join (全連接)等價於(full outer join)查詢結果等於左外連接和右外連接的和。
1 left join(左聯接) 2 --左外連接(wip_lot_wafer表中數據都存在,wip_lot不在wip_lot_wafer中存在的相關字段為null值) 3 select a.*, b.product, b.priority 4 from wip_lot_wafer a 5 left join wip_lot b 6 on a.lot = b.lot; 7 --左外連接(利用(+)在右邊)另外一種寫法 8 select a.*, b.product, b.priority 9 from wip_lot_wafer a,wip_lot b 10 where a.lot=b.lot(+); 11 12 13 14 right join(右連接) 15 --右外連接(wip_lot表中數據都存在,wip_lot_wafer不在wip_lot存在的相關字段為null值) 16 select a.*, b.product, b.priority 17 from wip_lot_wafer a 18 right join wip_lot b 19 on a.lot = b.lot; 20 --右外連接(利用(+)在左邊)另外一種寫法 21 select a.*, b.product, b.priority 22 from wip_lot_wafer a,wip_lot b 23 where a.lot(+)=b.lot; 24 25 26 full join(全外連接) 27 --(全外連接(stuinfo、stuinfo_2018表中數據都存在, 28 --stuinfo不在stuinfo_2018存在的學生相關字段為null值, 29 --stuinfo_2018不在stuinfo存在的學生相關字段為null值) 30 select a.*, b.product, b.priority 31 from wip_lot_wafer a 32 full join wip_lot b 33 on a.lot = b.lot;
Oracle偽列
Oracle的偽列是Oracle表在存儲的過程中或查詢的過程中,表會有一些附加列,稱為偽列。偽列就像表中的字段一樣,但是表中並不存儲。偽列只能查詢,不能增刪改。Oracle的偽列有:rowid、rownum。
ORACLE ROWID
Oracle表中的每一行在數據文件中都有一個物理地址, ROWID 偽列返回的就是該行的物理地址。使用 ROWID 可以快速的定位表中的某一行。 ROWID 值可以唯一的標識表中的一行。通過Oracle select 查詢出來的ROWID,返回的就是該行數據的物理地址。
1 select t.*,t.rowid from wip_lot t ; 2 select t.*,t.rowid from wip_lot t where t.rowid='AAASjBAAEAAAAcrAAA';
ORACLE ROWNUM
ORACLE ROWNUM表示的Oracle查詢結果集的順序,ROWNUM為每個查詢結果集的行標識一個行號,第一行返回1,第二行返回2,依次順序遞增。
ROWNUM 與 ROWID 不同, ROWID 是插入記錄時生成, ROWNUM 是查詢數據時生成。ROWID 標識的是行的物理地址。 ROWNUM 標識的是查詢結果中的行的次序。
ROWNUM經常用來限制查詢的結果返回的行數,求前幾行或前幾名的數據。
1 select t.lot,t.lot_type,t.priority,t.wafer_qty,t.die_qty,rownum from wip_lot t ; 2 3 4 案例1、返回wip_lot表中創建時間最早的前四位行數據。 5 select * from (select t.lot,t.lot_type,t.priority,t.wafer_qty,t.die_qty,t.create_date, rownum 6 from wip_lot t 7 order by t.create_date asc) where rownum <=4;
