1. 程式人生 > >oracle的高階查詢 多表的連線

oracle的高階查詢 多表的連線

                              高階查詢多表的連線
普通多表連線:select ah,a.nl,a1.xm from a,a1 where a.xm=a1.xm;
此定義要明確列,如果列名兩個表均存在,前面就需要加個表名,如a.nl,如果後面不加where的話,出現的值為兩表值的數量的乘積,有where就回輸出符合條件的值


自連線: 表的自身的連線,需要為表定義別名。
select c1.xm,c1.xb,c1.nl from a c1,a c2 where c1.xb='男' and c1.nl>c2.nl;
意為 當cl表中的nl的值大於c2表中的值的時候(假如有5個數據,最大的值會輸出4次,他會同每個值比較,結果是當然最大並輸出,其他類推),輸出cl.xb='男'的資料,一定要為表新增別名


自然連線: 他不能限定公共列,就是不能在列名前加表名 關鍵詞   natural join
select  * from a1 natural join a
假如 兩表有 A B C三個相同的列,必須每個列同時有相同的值。沒有相同的值,就沒有輸出值,有形同的值時,輸出兩個表所有的列值,就是就行疊加,重新組合。


內連線: 關鍵詞   inner join ...on inner  join 可用join代替
select * from a inner join a1 on a.xm=a1.xm; on後面表條件語句
意為 當條件符合的時候輸出兩表中的所有列,相同的列的值會重複輸出(如相同的列有3個,不同列為2,那麼輸出的時候就會有 8列 ,先輸出第一個表的所有列值,再輸出第二表的所有列值)


外連線: 分為左外連線  右外連線  全外連線
左外連線:關鍵詞:left join,意為對左邊表的不限制
select  * from a left join a1 on a.xm=a1.xm;
也可以寫成  select  * from a ,a1 where a.xm=a1.xm(+);這是簡寫,右邊加個(+),表示左外連線,左邊加個(+),表示為右外連線,沒有全外連線這樣寫
輸出 表a 的所有列值,而 表a1 輸出符合條件的所有的列值,不符合條件的列值都為空 輸出的列為兩表的列和


右外連線:關鍵詞  right join 意為對右邊表的不限制,同上


全外連線:關鍵詞  full  join 意為左右表都不限制,輸出左邊表的時候,右表沒有記錄,就輸出為空,輸出右邊表的時候,左邊表沒有記錄的話,也輸出為空


聯合語句 
union查詢:求兩個查詢結果的並集 語法 select 語句1 union select 語句2 刪除重複行
select * from a where a.xb='女' union select * from a where a.xb='男';
查詢為男女的結果集


union all查詢 :求兩個查詢結果的並集 語法 select 語句1 union select 語句2 不會刪除重複行,重複輸出
select * from a where a.xb='女' union all select * from a where a.xb='女'; 重複輸出為 女 的資料。


intersect:用於查詢結果的交集 語法 select 語句1 intersect select 語句2


minus 查詢:查詢兩個集合之間的差集, 語法 select 語句1 minus select 語句2,意思為同時符合語句1和語句2的,在語句1中剔除同時符合的,並輸出剩下的值


子查詢:也叫巢狀查詢,在條件中重新來一個查詢
語法  :select 語句 where 條件 =(select 語句 where 條件)()裡必須返回單個值,若出現多個,則會出現錯誤。
SELECT * FROM a where a.nl >all (SELECT nl FROM a1 where a1.nl=25 );
查詢所有大於25的資料,還有關鍵字 some  any  in 。
還能使用聚合函式  :
SELECT * FROM a where a.nl >all (SELECT min(nl) FROM a1 );
查詢 所有a.nl大於(表a1.nl最小值的)
使用exists關鍵字,他表判斷真假,真的話就執行,假的就不執行
SELECT * FROM a where exists (SELECT nl FROM a1 where a1.nl>30 );
如果()為真,輸出所有資料,反之,不輸出任何結果