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 條件
注意 不適合操作大表