Rumah pangkalan data tutorial mysql Oracle SQL 中的IN EXISTS 比较

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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara memeriksa saiz meja oracle Cara memeriksa saiz meja oracle Apr 11, 2025 pm 08:15 PM

Untuk menanyakan saiz ruang meja oracle, ikuti langkah -langkah berikut: Tentukan nama meja dengan menjalankan pertanyaan: pilih Tablespace_Name dari DBA_TableSpaces; Tanya saiz meja dengan menjalankan pertanyaan: pilih jumlah (bait) sebagai total_size, jumlah (bytes_free) sebagai tersedia_space, jumlah (bytes) - jumlah (bytes_free) sebagai digunakan_space dari dba_data_files di mana tablespace_

Cara mengimport pangkalan data oracle Cara mengimport pangkalan data oracle Apr 11, 2025 pm 08:06 PM

Kaedah Import Data: 1. Gunakan utiliti SQLLoader: Sediakan fail data, buat fail kawalan, dan jalankan SQLLoader; 2. Gunakan alat IMP/EXP: data eksport, data import. Petua: 1. Disyorkan SQL*loader untuk set data besar; 2. Jadual sasaran harus wujud dan perlawanan definisi lajur; 3. Selepas mengimport, integriti data perlu disahkan.

Cara menyahpasang pemasangan Oracle gagal Cara menyahpasang pemasangan Oracle gagal Apr 11, 2025 pm 08:24 PM

Nyahpasang Kaedah untuk kegagalan pemasangan Oracle: Tutup Perkhidmatan Oracle, Padam Fail Program Oracle dan Kekunci Pendaftaran, Nyahpasang pembolehubah persekitaran Oracle, dan mulakan semula komputer. Jika penyahpasang gagal, anda boleh menyahpasang secara manual menggunakan alat penyahpasang Oracle Universal.

Cara menambah medan meja ke oracle Cara menambah medan meja ke oracle Apr 11, 2025 pm 07:30 PM

Gunakan pernyataan ALTER Jadual, sintaks khusus adalah seperti berikut: alter table table_name Tambah column_name data_type [kekangan-klausa]. Di mana: Table_name adalah nama jadual, column_name adalah nama medan, data_type adalah jenis data, dan kekangan-fasal adalah kekangan pilihan. Contoh: Alter Table Pekerja menambah e -mel varchar2 (100) Tambahkan medan e -mel ke jadual pekerja.

Cara menyampaikan semula oracle Cara menyampaikan semula oracle Apr 11, 2025 pm 07:33 PM

Oracle menyediakan pelbagai kaedah pertanyaan deduplikasi: Kata kunci yang berbeza mengembalikan nilai yang unik untuk setiap lajur. Kumpulan oleh klausa mengumpulkan hasil dan mengembalikan nilai tidak berulang bagi setiap kumpulan. Kata kunci yang unik digunakan untuk membuat indeks yang mengandungi hanya baris unik, dan pertanyaan indeks akan secara automatik deduplicate. Fungsi row_number () memberikan nombor unik dan menapis hasil yang mengandungi hanya baris 1. Min () atau max () mengembalikan nilai tidak berulang dari lajur angka. Operator Intersect mengembalikan nilai -nilai bersama kedua -dua set hasil (tiada pendua).

Cara membuat jadual di oracle Cara membuat jadual di oracle Apr 11, 2025 pm 08:00 PM

Mewujudkan Jadual Oracle melibatkan langkah -langkah berikut: Gunakan sintaks Create Table untuk menentukan nama jadual, nama lajur, jenis data, kekangan, dan nilai lalai. Nama jadual harus ringkas dan deskriptif, dan tidak boleh melebihi 30 aksara. Nama lajur hendaklah menjadi deskriptif, dan jenis data menentukan jenis data yang disimpan dalam lajur. Kekangan tidak null memastikan bahawa nilai null tidak dibenarkan dalam lajur, dan klausa lalai menentukan nilai lalai untuk lajur. Kekangan utama utama untuk mengenal pasti rekod unik jadual. Kekangan utama asing menentukan bahawa lajur dalam jadual merujuk kepada kunci utama dalam jadual lain. Lihat penciptaan pelajar jadual sampel, yang mengandungi kunci utama, kekangan unik, dan nilai lalai.

Cara menyulitkan pandangan oracle Cara menyulitkan pandangan oracle Apr 11, 2025 pm 08:30 PM

Penyulitan Oracle View membolehkan anda menyulitkan data dalam pandangan, dengan itu meningkatkan keselamatan maklumat sensitif. Langkah -langkah termasuk: 1) mewujudkan kunci penyulitan induk (MEK); 2) mencipta pandangan yang disulitkan, menyatakan pandangan dan MEK untuk disulitkan; 3) Memberi kuasa pengguna untuk mengakses pandangan yang disulitkan. Bagaimana pandangan yang disulitkan berfungsi: Apabila permintaan pengguna untuk paparan yang disulitkan, Oracle menggunakan MEK untuk menyahsulit data, memastikan bahawa hanya pengguna yang diberi kuasa dapat mengakses data yang boleh dibaca.

Cara melihat contoh nama oracle Cara melihat contoh nama oracle Apr 11, 2025 pm 08:18 PM

Terdapat tiga cara untuk melihat nama contoh di Oracle: Gunakan "sqlplus" dan "pilih instance_name dari v $ instance;" Perintah pada baris arahan. Gunakan "pertunjukan instance_name;" Perintah dalam SQL*Plus. Semak Pembolehubah Alam Sekitar (ORACLE_SID pada Linux) melalui Pengurus Tugas Sistem Operasi, Pengurus Oracle Enterprise, atau melalui sistem operasi.

See all articles