Oracle SQL 中的IN EXISTS 比较

Jun 07, 2016 pm 04:58 PM
oracle

在Oracle SQL中取数据时有时要用到in 和 exists 那么他们有什么区别呢?1 性能上的比较比如Select * from T1 where x in ( selec

在Oracle SQL中取数据时有时要用到in 和 exists 那么他们有什么区别呢?

1 性能上的比较
比如Select * from T1 where x in ( select y from T2 )
执行的过程相当于:
select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;

相对的

select * from t1 where exists ( select null from t2 where y = x )
执行的过程相当于:
for x in ( select * from t1 )
   loop
      if ( exists ( select null from t2 where y = x.x )
      then
         OUTPUT THE RECORD
      end if
end loop
表 T1 不可避免的要被完全扫描一遍

分别适用在什么情况?
以子查询 ( select y from T2 )为考虑方向
如果子查询的结果集很大需要消耗很多时间,但是T1比较小执行( select null from t2 where y = x.x )非常快,那么exists就比较适合用在这里
相对应得子查询的结果集比较小的时候就应该使用in.

2 含义上的比较
在标准的scott/tiger用户下

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

1 7499 ALLEN SALESMAN 7698 1981/02/20 1600.00 300.00 30

2 7521 WARD SALESMAN 7698 1981/02/22 1250.00 500.00 30

3 7566 JONES MANAGER 7839 1981/04/02 2975.00 20

4 7654 MARTIN SALESMAN 7698 1981/09/28 1250.00 1400.00 30

5 7698 BLAKE MANAGER 7839 1981/05/01 2850.00 30

6 7782 CLARK MANAGER 7839 1981/06/09 2450.00 10

7 7788 SCOTT ANALYST 7566 1987/04/19 3000.00 20

8 7839 KING PRESIDENT   1981/11/17 5000.00 10

9 7844 TURNER SALESMAN 7698 1981/09/08 1500.00 0.00 30

10 7876 ADAMS CLERK 7788 1987/05/23 1100.00 20

11 7900 JAMES CLERK 7698 1981/12/03 950.00 30

12 7902 FORD ANALYST 7566 1981/12/03 3000.00 20

13 7934 MILLER CLERK 7782 1982/01/23 1300.00   10


执行
SQL> select count(*) from emp where empno not in ( select mgr from emp );
COUNT(*)
----------
         0
SQL> select count(*) from emp T1
2 where not exists ( select null from emp T2 where t2.mgr = t1.empno ); -- 这里子查询中取出null并没有什么特殊作用,,只是表示取什么都一样。
COUNT(*)
----------
         8
结果明显不同,问题就出在MGR=null的那条数据上。任何值X not in (null) 结果都不成立。
用一个小例子试验一下:
select * from dual where dummy not in ( NULL ) -- no rows selected
select * from dual where NOT( dummy not in ( NULL ) ) --no rows selected
知觉上这两句SQL总有一句会取出数据的,但是实际上都没有。SQL中逻辑表达式的值可以有三种结果(true false null)而null相当于false.

linux

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Oracleの表空間サイズを確認する方法 Oracleの表空間サイズを確認する方法 Apr 11, 2025 pm 08:15 PM

Oracle Tablespaceサイズを照会するには、次の手順に従ってください。クエリを実行して、TableSpace名を決定します。DBA_TABLESPACesからTableSpace_Nameを選択します。クエリを実行してテーブルスペースのサイズをクエリします:sum(bytes)をtotal_size、sum(bytes_free)asavail_space、sum(bytes) - sum(bytes_free)as sum(bytes_free)as dba_data_files from tablespace_

Oracleデータベースをインポートする方法 Oracleデータベースをインポートする方法 Apr 11, 2025 pm 08:06 PM

データインポート方法:1。SQLLOADERユーティリティを使用します。データファイルを準備し、制御ファイルを作成し、SQLLoaderを実行します。 2。IMP/EXPツールを使用します。データをエクスポートし、データをインポートします。ヒント:1。ビッグデータセットに推奨されるSQL*ローダー。 2。ターゲットテーブルが存在する必要があり、列定義が一致します。 3。インポート後、データの整合性を検証する必要があります。

テーブルフィールドをOracleに追加する方法 テーブルフィールドをOracleに追加する方法 Apr 11, 2025 pm 07:30 PM

ALTER TABLEステートメントを使用して、特定の構文は次のとおりです。ALTERTABLE TABLE_NAME add column_name data_type [constraint-clause]。 WHERE:table_nameはテーブル名、column_nameはフィールド名、data_typeはデータ型、制約条項はオプションの制約です。例:テーブルの従業員を変更すると、電子メールvarchar2(100)は、従業員テーブルに電子メールフィールドを追加します。

Oracleのインストールをアンインストールする方法は失敗しました Oracleのインストールをアンインストールする方法は失敗しました Apr 11, 2025 pm 08:24 PM

Oracleインストール障害のためのアンインストールメソッド:Oracleサービスを閉じ、Oracleプログラムファイルとレジストリキーを削除し、Oracle環境変数をアンインストールし、コンピューターを再起動します。アンインストールが失敗した場合、Oracle Universal Uninstallツールを使用して手動でアンインストールできます。

Oracleでテーブルを作成する方法 Oracleでテーブルを作成する方法 Apr 11, 2025 pm 08:00 PM

Oracleテーブルの作成には、次の手順が含まれます。作成テーブルの構文を使用して、テーブル名、列名、データ型、制約、およびデフォルト値を指定します。テーブル名は簡潔で説明的である必要があり、30文字を超えてはなりません。列名は説明的でなければならず、データ型は列に保存されているデータ型を指定します。 NOT NULL制約により、列でnull値が許可されていないことが保証され、デフォルト句は列のデフォルト値を指定します。テーブルの一意の記録を識別する主要なキーの制約。外部キーの制約は、表の列が別のテーブルの主キーを指していることを指定します。主要なキー、一意の制約、デフォルト値を含むサンプルテーブル学生の作成を参照してください。

Oracleで文字化けのコードを解決する方法 Oracleで文字化けのコードを解決する方法 Apr 11, 2025 pm 10:09 PM

Oracle Garbledの問題は、データベース文字セットをチェックしてデータと一致するようにすることで解決できます。データベースに一致するようにクライアント文字を設定します。データを変換するか、列文字セットを変更してデータベース文字セットに一致させます。 Unicode文字セットを使用して、マルチバイト文字セットを避けます。データベースとクライアントの言語設定が正しいことを確認してください。

Oracleを再び追求する方法 Oracleを再び追求する方法 Apr 11, 2025 pm 07:33 PM

Oracleは複数の重複排除クエリメソッドを提供します。個別のキーワードは、各列の一意の値を返します。 Group by Clauseは、結果をグループ化し、各グループの非繰り返し値を返します。一意のキーワードは、一意の行のみを含むインデックスを作成するために使用され、インデックスをクエリすると自動的に重複排除が行われます。 row_number()関数は、一意の数値を割り当て、行1のみを含む結果をフィルタリングします。min()またはmax()関数は、数値列の非繰り返し値を返します。交差する演算子は、2つの結果セットの共通値を返します(複製なし)。

Oracleビューを暗号化する方法 Oracleビューを暗号化する方法 Apr 11, 2025 pm 08:30 PM

Oracle View暗号化により、ビュー内のデータを暗号化でき、それにより機密情報のセキュリティが強化されます。手順には以下が含まれます。1)マスター暗号化キー(MEK)の作成。 2)暗号化されたビューを作成し、暗号化されるビューとMEKを指定します。 3)暗号化されたビューにアクセスすることをユーザーに許可します。暗号化されたビューがどのように機能するか:ユーザーが暗号化されたビューを求めてクエリをするとき、OracleはMEKを使用してデータを復号化し、認定ユーザーのみが読み取り可能なデータにアクセスできるようにします。

See all articles