1. 程式人生 > >SQL exists/not exists語句

SQL exists/not exists語句

在SQL查詢語句中Exists,not Exists是比較有意思的,也是比較難理解的一個地方。下面就來總結一下這方面的內容;
以student-SC-course資料庫中為代表
(1) 查詢所有選修了001號課程的學生的姓名。

select Sname
from Student
where exists
(
select *
from SC
where Sno = Student.Sno AND Cno=’001’
);
分析:
1,先從student中找出第一個元組的Sno,然後進到Exists。
2,從SC表中查詢是否又滿足where的元組,如果有,那麼where返回為真,student的第一個元組滿足查詢條件。
3從student選出下一個元組來,重複上述一二過程。直到student的元組找遍。
(2)查詢所有沒有選修了001號課程的學生的姓名。
這條查詢語句在第一題的exists後面加上not就是了。即:
select Sname
from Student
where not exists
(
select *
from SC
where Sno = Student.Sno AND Cno=’001’
);
查詢過程:
(1)也是從student找出一個元祖的sno出來,進入exists中
(2)假如從SC中可以找出一個元組來,滿足了where後面的語句,那麼就是當前這個學生選擇了001課程。第一條where語句返 回就是false(使用的是not exists),那麼student的這個元組就是不滿足查詢條件的。即:這個元組不會出現在結果查詢表中。
(3)從student選擇下一個元組,重複上述一二。知道student元組查詢完畢。

例3:查詢選修了全部課程的學生姓名。
select Sname
from Student
where not exists
(
select *
from Course
where not exists
(
select *
from SC
where Sno=Student.Sno AND
Cno=Course.Cno
) );
分析:這種語句是比較難理解的。過程是這樣的:
(1)從student中選擇一個元組出來,進入到第一個where中;
(2)從course中選擇一個元組出來,進入到第二個where中;
(3)從SC表中查詢是否有滿足where的語句,假如有,就是說當前學生有選擇當前課程。第二個where後面返回是false,繼續 從course中選擇下一個元組出來,看看是否滿足第二個where後面的語句,假如又滿足。第二個where後面的還是false。如果course中全部元組都遍歷了一遍,說明當前學生選擇了course中的全部課程。第二個where還是false,第一個where返回就是true了,這個student的元組就是滿足條件的。假如第二個where返回為真,就是說明當前course的課程這個學生是沒有選擇的,這樣第一個where就是false了,student的這個元組自然就不滿足查詢條件了。
(4)從student中找出下一個元組,重複(2)(3)就是。

相關推薦

面試被問之-----sql優化中in與exists的區別 Mysql中 in or exists not exists not in區別 (網路整理) Sql語句中IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進

sql語句exists/not exists用法詳解

1、Student: Sno Sname Ssex Sage Sdept 200215121 李勇 男 20 CS 200215122 劉晨 女 19 CS 200215123 王敏 女 18 M

SQL語句exists/not exists的用法分析

 1、Student: Sno Sname Ssex Sage Sdept 200215121 李勇 男 20 CS 200215122 劉晨 女 19 CS 200215123 王敏 女 18

SQL exists/not exists語句

在SQL查詢語句中Exists,not Exists是比較有意思的,也是比較難理解的一個地方。下面就來總結一下這方面的內容; 以student-SC-course資料庫中為代表 (1) 查詢所有選修了001號課程的學生的姓名。 select

SQLNOT EXISTS...[EXCEPT]的妙用

title: ‘SQL中NOT EXISTS…[EXCEPT]的妙用’ date: 2018-11-13 16:15:30 tags: SQL categories: 資料庫、SQL toc: true 這是基於github的個人部落格:Josonlee’s Blog E

SQLexists,not exists的用法細節

一、存在以下兩張表: CREATE TABLE emp_bonus1 ( EMPNO NUMBER, RECEIVED DATE, TYPE NUMBER, ETPYE NUMBER ); INSERT INTO emp_bonus1 VALUES (7369,'14-3月-2005',1,4)

sqlexists,not exists的用法

exists : 強調的是是否返回結果集,不要求知道返回什麼, 比如:   select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要 exists引導

遍歷資料庫表(ACCESS/SQL SERVER)的方法。SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別。資料庫中的exists與in

遍歷資料庫表(ACCESS/SQL SERVER)的方法 以前在網上查詢遍歷SQL資料庫表的方法,可以用 select name from sysobjects where xtype='u' and (not name LIKE 'dtproperties')  來查詢SQL的系

Oracle,用left join 替代 exists ,not exists,in , not in,提高效率

.cn rom mage png 高效 pan div sele bsp Not IN問題 Exists,not Exists,in,not in 例如: DELETE FROM YSHA WHERE NOT EXISTS(SELECT 1 FROM YSHB B

Mysql中 in or exists not exists not in區別 (網路整理)

in 和or區別:https://www.cnblogs.com/rainwang/p/4389282.html 如果in和or所在列有索引或者主鍵的話,or和in沒啥差別,執行計劃和執行時間都幾乎一樣。 如果in和or所在列沒有 索引的話,效能差別就很大了。在沒有索引的情況下,隨著in或者or後面

子查詢+in+exists/not exists+all+any+多列子查詢

子查詢: 將查詢語句作為外部sql的條件 注意 1子查詢不能使用order by 2多行子查詢可以返回多行記錄,外部要使用多行操作符(In,exists,any ,all… ) where 或者 having +in ,not in,>,<

oralce中exists not exists in not in對於NULL的處理

1. 先討論 in 與 not in中存在NULL的情況, sql語句如下: 複製程式碼 1 select 1 result1 from dual where 1 not in (2, 3); 2 3 4 select

Sql語句優化-查詢兩表不同行NOT IN、NOT EXISTS、連接查詢Left Join

exists join ngs sdn 連接查詢 blog 建議 開發 word 在實際開發中,我們往往需要比較兩個或多個表數據的差別,比較那些數據相同那些數據不相同,這時我們有一下三種方法可以使用:1. IN或NOT IN,2. EXIST或NOTEXIST,

sql語句學習(NOT EXISTSNOT IN )

exist car rod cto from log del sele tinc NOT EXISTS SELECT   a.*FROM   t_user aWHERE   a.id_card LIKE ‘%3203821995100%‘AND NOT EXISTS ( S

Sql語句優化-查詢兩表不同行NOT IN、NOT EXISTS、連線查詢Left Join

在實際開發中,我們往往需要比較兩個或多個表資料的差別,比較那些資料相同那些資料不相同,這時我們有一下三種方法可以使用:1. IN或NOT IN,2. EXIST或NOTEXIST,3.使用連線查詢(inner join,left join 或者 right join)。

Sql語句優化之用existsnot exists替代in、not in

在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接。在這種情況下, 使用exists(或not exists)通常將提高查詢的效率。在子查詢中,not in子句將執行一個內部的排序和合並。無論在哪種情況下,not in都是最低效的 (因為它對子查詢中的表

sql語句中的 in 、not in 、existsnot exists 詳細用法說明和差別----not in失效

來看下面這樣一條SQL語句: select * from student where 20 < all (select score from student) 其中,(select score from student)返回的是所有分數的記錄集 只有當記錄集中的所有分數都大於20後,才會執行前面的SQ

關於T-SQLexists或者not exists子查詢的“偽優化”的做法

png tro ges width 9.png 當前 color 盡心 alt 問題起源 在使用t-sql中的exists(或者not exists)子查詢的時候,不知道什麽時候開始,發現一小部分人存在一種“偽優化”的一些做法,並且向不明真相

淺談sql中的in與not in,existsnot exists的區別以及效能分析

1、in和exists in是把外表和內表作hash連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢,一直以來認為exists比in效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中一個較小一個較大,則子查詢表大的用exists,子查

資料庫sql existsnot exists

執行該相關子查詢的過程是:從外查詢的關係(Employee)中依次取一個元組,根據它的Eno值在內查詢進行檢查,若父查詢的where子句為真, 則此元組放入結果表;若為假,則捨去。 這樣反覆處理,直至父查詢關係的元組全部處理完為止。