minus的用法簡介
“minus”直接翻譯為中文是“減”的意思,在Oracle中也是用來做減法操作的,隻不過它不是傳統意義上對數字的減法,而是對查詢結果集的減法。A minus B就意味着将結果集A去除結果集B中所包含的所有記錄後的結果,即在A中存在,而在B中不存在的記錄。其算法跟Java中的Collection的removeAll()類似,即A minus B将隻去除A跟B的交集部分,對于B中存在而A中不存在的記錄不會做任何操作,也不會抛出異常。
Oracle的minus是按列進行比較的,是以A能夠minus B的前提條件是結果集A和結果集B需要有相同的列數,且相同列索引的列具有相同的資料類型。此外,Oracle會對minus後的結果集進行去重,即如果A中原本多條相同的記錄數在進行A minus B後将會隻剩一條對應的記錄,具體情況請看下面的示例。
下面我們來看一個minus實際應用的示例,假設我們有一張使用者表t_user,其中有如下記錄資料:
id
no
name
age
level_no
1
a
25
2
b
30
3
c
35
4
d
45
5
e
6
f
7
g
8
h
9
i
20
10
j
那麼:
(1)“select id from t_user where id<6 minus select id from t_user where id between 3 and 7”的結果将為:
(2)“select age,level_no from t_user where id<8 minus select age,level_no from t_user where level=3”的結果為:
看到這樣的結果,可能你會覺得有點奇怪,為何會是這樣呢?我們來分析一下。首先,“select age,level_no from t_user where id<8”的結果将是這樣的:
然後,“select age,level_no from t_user where level=3”的結果将是這樣的:
然後,直接A minus B之後結果應當是:
這個時候,我們可以看到結果集中存在重複的記錄,進行去重後就得到了上述的實際結果。其實這也很好了解,因為minus的作用就是找出在A中存在,而在B中不存在的記錄。
上述示例都是針對于單表的,很顯然,使用minus進行單表操作是不具備優勢的,其通常用于找出A表中的某些字段在B表中不存在對應記錄的情況。比如我們擁有另外一個表t_user2,其擁有和t_user表一樣的表結構,那麼如下語句可以找出除id外,在t_user表中存在,而在t_user2表中不存在的記錄。