1. 程式人生 > >Oracle 高階查詢-【聯合語句】【聯合查詢】【層次查詢】

Oracle 高階查詢-【聯合語句】【聯合查詢】【層次查詢】

Orcle高階查詢

DDL:資料定義語言 — CREATE、ALTER、DROP、TRUNCATE

TPL:事務處理語言 — COMMIT、ROLLBACK、SAVEPOINT、SET TRANSACTION

DCL:資料控制語言 — GRANT、REVOKE

DML:資料操作語言 — SELECT、UPDATE、INSERT、DELETE

基本查詢

selct 是查詢中的首要關鍵字,select 用於指定查詢所獲得的結果列。select 列表後需要緊跟 from 字句

基本語法

SELECT column_name,...
| * from table_name ,...

where 子句

where 子句用於過濾from 子句所獲得的所有資料來源

SELECT column_name,...| * from table_name ,... WHERE expressions

-- expressions 過濾條件

利用distinct 獲取唯一性記錄

distinct 關鍵字用於獲得唯一性記錄,被distinct 限制的既可以是單個列,也可以是多個列組合。

SELECT DISTINCT column_name,...| * from table_name ,...

order by 子句

order by 子句可以將查詢的結果,按照一定的順序進行排序。當排序列的資料型別是字串時,將按照字串在字母表中的順序進行排序

SELECT column_name,...|* FROM table_name,... WHERE expressions order by column_name asc | desc 

-- asc 升序 desc 降序 

group by 子句

group by 子句用於對記錄集合進行分組,一旦使用分組之後,select 語句的真實操作目標為各個分組資料,每次迴圈處理的也是各個分組,而不是單條記錄、

SELECT column_name,... | * FROM table_name,... WHERE expressions group by column_name,...

對於需要分組查詢的子句,ORDER BY 需要置於groub by 後面,並且排序欄位需要是 groub by 的分組欄位

having 子句

where 子句會對form 子句所定義的資料來源進行條件過濾,但是針對group by 子句形成的分組之後的結果集,where 子句將無能為力,為了過濾 group by 子句所生成的結果集,可以使用having 子句、

SELECT column_name,.. | * FROM table_name,... WHERE expressions groub by column_name,... having expressions

子查詢

子查詢是指巢狀在查詢語句中的查詢語句,子查詢出現的位置一般為條件語句,如where 條件。Orcle 會首先執行子查詢,然後執行父查詢、

子查詢是完整的查詢語句。子查詢首先生成結果集,並將結果集應用於條件語句。

子查詢可以出現在插入,查詢,更新和刪除語句中。建立子查詢的目的是更加有效的限制where 子句中的條件,並可以將複雜的查詢邏輯梳理的更加清晰。

子查詢可以訪問父查詢中的資料來源,但是父查詢不能夠訪問子查詢from子句所定義的資料來源。子查詢是根據父查詢中的每條記錄執行的。

子查詢可以使用子查詢的位置 : where,select,having,from

不可以使用子查詢的位置:group by

一般不在子查詢中使用排序

聯合語句

聯合語句是指兩個或多個select 語句是並列關係,並且對這些select語句所捕獲的記錄集進行集合操作。以獲得最終的結果集。這些聯合語句包括以下幾種:union 查詢,union all 查詢,intersect 查詢 minus 查詢

union 查詢

union 查詢是指兩個查詢結果集進行並集操作,並將重複記錄剔除,既想當並集操作之後,在執行一次distinct操作。

SELECT column_name,... | * FROM table_name 
union
SELECT column_name,... | * FROM table1_name WHERE ....

union all 查詢

union all 查詢和union 查詢同為並集操作,但union all 查詢並不刪除最終結果集中的重複記錄。因此union all 的操作要快於union 。

SELECT column_name,... | * FROM table_name 
union all 
SELECT column_name,... | * FROM table1_name WHERE ....

intersect 查詢

intersect 查詢用於獲得兩個結果集的交集。

SELECT column_name,... | * FROM table_name  where ...
intersect `
SELECT column_name,... | * FROM table1_name WHERE ....

minus 查詢

minus 查詢用於獲得兩個結果集合的差集,只會顯示在第一個結果集中存在但第二個結果集中不存在的資料,並且會以第一列結果進行排序

SELECT column_name,... | * FROM table_name  where ...
minus 
SELECT column_name,... | * FROM table1_name WHERE ....

聯接查詢

聯接用於指定多資料來源之間如何組合,以形成最終的資料來源。如果沒有未顯示指定聯接,那麼將獲得多個數據源的笛卡爾積。

什麼是多表查詢

從多個表中獲取資料就是多表查詢。

笛卡爾積

兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y

等值聯接

等值聯接將多個數據源進行查詢,連線條件是等號

SELECT * FROM table_name t,table2_name t2 where t1.column_name=t2.column;

不等值聯接

等值聯接將多個數據源進行查詢,連線條件不是等號

SELECT * FROM table_name t,table2_name t2 where t1.column_name=t2.column;

內連線

外聯接

核心:通過外連結,把對於連線條件不成立的記錄,仍然包含在最後的結果中

左聯接

select * from table_a_name left join table_b_name on '條件'
可以簡寫為
select * from table_a_name.table_b_name where a=b(+)

右連線

完全連線

自連線

核心:通過別名,將同一張表視為多張表

select a.name_a,b.nameb from table_name a,table_name b where 條件

注意 不適合操作大表

層次化查詢