oracle union详解,Oracle中的union和join
有時候,我們需要把很多表的查詢結(jié)果給合并在一起顯示或者導出,有時候呢我們又需要幾張表聯(lián)合一些條件進行查詢,所以我們常會用到j(luò)oin和union語句。
官方說明
包含UNION [ALL], INTERSECT, MINUS三個操作符,具有相同的優(yōu)先級(可以用(...)進行改變優(yōu)先級),含有多個的時候,自左至右進行計算。
在每個組成UNION查詢的子查詢中,其select list(選擇列表)必須具有相同的數(shù)量和數(shù)據(jù)組類型。
如果子查詢選擇的是字符數(shù)據(jù),其返回值的數(shù)據(jù)類型由下決定:所有的子查詢選擇的char值具有相同的length,返回值就是char(length)。如果查詢的值類型分別是char(length1), char(length2)...,其返回值是varchar2(max(length1,length2,...))
如果子查詢選擇的值都是varchar2,那么返回值就是varchar2。
對于選擇的是數(shù)值數(shù)據(jù):
任何一個查詢選擇的值是binary_double,其返回值就是binary_double。
任何一個查詢選擇的值是binary_float,其返回值就是binary_float。
所有查詢選擇的值是number,其返回值才是number。
使用這幾個集操作符的時候,Oracle不會進行隱含的數(shù)據(jù)類型組之間的轉(zhuǎn)換。所以,如果查詢包含number和char類型的話,Oracle返回一個錯誤。
比如:select '3' from dual
intersect
select 3f from dual;
會返回一個錯誤。但:select 3 from dual
intersect
select 3f from dual;
則會被在類型組內(nèi)隱含進行轉(zhuǎn)換成:select to_binary_float(3) from dual
intersect
select 3f from dual;
限制
集操作符服從以下限制:對列類型為BLOB, CLOB, BFILE, VARRAY或者嵌套表無效。
UNION, INTERSECT, MINUS對LONG列無效。
在集操作符前的選擇列表包含表達式的話,那么必須得對列設(shè)置別名以便后面在order by clause內(nèi)使用。
不能用for_update_clause共用
在這些操作符的子查詢內(nèi)不能使用order_by_clause
You cannot use these operators in SELECT statements containing TABLE collection expressions.
Example查詢中to_char(null)用在當表中沒有某列的時候來匹配數(shù)據(jù)類型。SELECT location_id, department_name "Department",
TO_CHAR(NULL) "Warehouse" FROM departments
UNION
SELECT location_id, TO_CHAR(NULL) "Department", warehouse_name
FROM warehouses;
union操作符聯(lián)合結(jié)果中不重復的結(jié)果,union all聯(lián)合所有的結(jié)果。SELECT product_id FROM order_items
UNION
SELECT product_id FROM inventories;
SELECT location_id FROM locations
UNION ALL
SELECT location_id FROM departments;
INTERSECT相交操作符聯(lián)合子查詢中都有的行。SELECT product_id FROM inventories
INTERSECT
SELECT product_id FROM order_items;
MINUS相減操作符聯(lián)合第一個查詢的行并且沒有在第二個查詢中出現(xiàn)的行(同時會去重)。SELECT product_id FROM inventories
MINUS
SELECT product_id FROM order_items;
JOIN
官方說明
JOIN用來從兩或多個表、視圖、物化視圖中結(jié)合數(shù)據(jù)。在FROM后面的表都會進行一個JOIN操作,這樣我們就可以用SELECT語句查詢這個JOIN中的任意列。當然,如果這些表中有相同名的列,就要用tbl.col這樣的形式來來完整引用列了。
Join Conditions
大多數(shù)join查詢有一個Join Condition,可能出現(xiàn)在FROM或WHERE語句中,其會比較從不同表中的兩列。對Join Contidion為TRUE的行,就把兩個表中那一行組合成一行。需要注意的是不能出現(xiàn)在select list中。
對與join三個或以上的表,Oracle首先Join根據(jù)Join ConditionJoin前兩個表,然后再把表這個結(jié)果和新表根據(jù)Join Conditon進行Join,直到把所有表都Join完。Oracle的Optimizer了決定Join的順序。
Equijoins
一個equijoin就是Join Condition包含一個等號,對指定的列具有相等的值的行進行Join。
Self Joins
表本身進行Join。在FROM后出現(xiàn)兩次,并且跟隨別名。
Cartesian Products(笛卡爾乘積)
如果一個Join查詢不包含Join Conditon,那么Oracle返回的就是一個他們的Cartesian product。這個結(jié)果一般沒有什么用,所以Join的時候最后都指定Join Conditon。
Inner Joins(simple join)
只Join滿足的行。
Outer Joins
Outer Join擴展了simple join的結(jié)果。一個outer join返回所有滿足Join Conditon的行,同時從一個不滿足條件的表返回一些或所有行。
LEFT [outer] JOIN
想要Join表 A,B,同時返回A的所有行。在FROM后面使用left [outer] join語句,或者在WHERE語句中的Join Conditon對B的所有列使用outer join operator(+)。對A在B中沒有匹配行,在B的列中就會返回NULL。
舉個例子
有一個屬地代碼表md_area(areano, name)。
有一個用戶表users(mdn,areano,….)。
我現(xiàn)在要統(tǒng)計users表中各屬地的用戶數(shù),還要根據(jù)代碼顯示出屬地名稱,以便更加直觀的進行統(tǒng)計。select area, areaname, ct from
(select areano as area, count(*) as ct from users group by areano) t1
left join
(select areano, name as areaname from md_area t2) on t2.areano = t1.area;
Right [outer] Join
接上例,其等于:select area, areaname, ct from
(select areano, name as areaname from md_area t2)
right join
(select areano as area, count(*) as ct from users group by areano) t1
on t2.areano = t1.area;
Antijoins (反連接)
Semijoins (半連接)
總結(jié)
以上是生活随笔為你收集整理的oracle union详解,Oracle中的union和join的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php %3c php 攻击,web 攻
- 下一篇: php面向对象全攻略 (十四),php面