oracle 集操作和exists in的運用場景

2021-09-30 15:31:56 字數 1410 閱讀 7422

1

集操作

定義:把多個sql的結果集,通過邏輯上的整合運算,拼在一起顯示。

集操作預設下都是按第乙個查詢的第一列公升序排序,當然除了union all:

minus:取差集,可用於對兩個結果集進行測試

union:取並集,除重

union all:取並集,不剔重

intersect:取交集

注釋:① union all不排序、不剔重,在效率上比union高。在業務允許下,用union all,則不用union

② 兩表作集操作時,字段型別、個數要相同,列的名字可以不必相同;若不一樣可補齊,補齊時應注意字段型別,進行顯示轉換:to_char、to_number、to_date等

③ 多個集操作可通過括號改變sql引擎的執行順序(預設sql引擎是自頂向下)

④ union、minus和intersect的共同點:

剔重、排序、不忽略null

⑤ order by只能出現在語句的最後,是對整個集操作結果的排序,列名、別名或者按位置指定,但不能使用第乙個select沒有出現的列

⑥ 第乙個select語句接收列名、別名,或位置記號,查詢結果的列名和第乙個select語句保持一致

⑦ 可以用於子查詢

2 exists、in的運用場景

能不寫子查詢,盡量不寫子查詢,而是直接編寫多表連線操作。理由如下:

① oracle cbo在parse階段,會盡可能把子查詢轉化為多表連線

② 子查詢可讀性較低

③ 複雜的邏輯,子查詢可能導致oracle cbo選擇錯誤的執行路徑

但如果必須寫子查詢,到底是in還是exists?exists/not exists專門用於關聯子查詢。10g之後,oracle對in的改進,這兩者無甚區別。

in和select的技術原理:

㈠ in:先進行子查詢,再進行主查詢

㈡ exists:先進行主查詢,再到子查詢中過濾

in和exists的使用建議:

ⅰ 如果限制性強的條件在子查詢,則使用in

ⅱ 如果限制性強的條件在主查詢,則使用exists

可用查詢結果集來理解上面這段話,採用最優化匹配原則:拿最小記錄匹配大記錄。限制性強,則結果集小;反之,則大。

注釋:① 使用exists可以將子查詢結果定位常量,不影響查詢結果,而且,效率高。

比如:

select e.*

from emp e

where exists

(select 1 from dept d

where e.deptno=d.deptno and

d.dname='sales')

② not in可能會因為null而改變其行為導致和not exists結果集有出入。然而,在相關子查詢下,not in和not exists的結果集是一樣的。

oracle 集操作和exists in的運用場景

1 集操作 定義 把多個sql的結果集,通過邏輯上的整合運算,拼在一起顯示。集操作預設下都是按第乙個查詢的第一列公升序排序,當然除了union all minus 取差集,可用於對兩個結果集進行測試 union 取並集,除重 union all 取並集,不剔重 intersect 取交集 注釋 un...

ORACLE 中exist和in的區別

博文 oracle中的exists 和not exists 用法 博文 in與exists語句的效率問題 一 exists sql 返回結果集為真 notexists sql 不返回結果集為真 如下 表a id name 1a1 2a2 3a3 表b id aid name 11b1 22b2 32...

Oracle資料操作和控制語言詳解 一

oracle資料操作和控制語言詳解 一 office office sql語言共分為四大類 資料查詢語言dql,資料操縱語言dml,資料定義語言ddl,資料控制語言dcl。其中用於定義資料的結構,比如 建立 修改或者刪除資料庫 dcl用於定義資料庫使用者的許可權 在這篇文章中我將詳細講述這兩種語言在...