1. 程式人生 > >SQL語句中exists/not exists的用法分析

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

 1、Student:

Sno

Sname

Ssex

Sage

Sdept

200215121

李勇

20

CS

200215122

劉晨

19

CS

200215123

王敏

18

MA

200215124

張立

19

IS

2、Course:

Cno

Cname

Cpno

Ccredit

1

資料庫

5

4

2

數學

2

3

資訊系統

1

4

4

作業系統

6

3

5

資料結構

7

4

6

資料處理

2

7

PASCAL語言

6

4

3、SC:

Sno

Cno

Credit

200215121

1

92

200215121

2

85

200215121

3

88

200215122

2

90

200215122

3

80

例1:查詢所有選修了1號課程的學生的姓名。

解法1:利用exists

首先取Student表中的一個元組,然後在SC表中依次找SC.Sno=該元組的Sno,並且對應的Cno='1',如果存在,則外層查詢的where子句返回為真,則Student表中的該元組可以輸出。然後依次遍歷Student表中的其他元組。

舉個例子:對於在學生表中學號等於2002151121這個元組,在SC表中第一條記錄即符合條件,然後where 子句返回 true,所以該條元組可以輸出。然後依次遍歷。

select Sname

from  Student

where exists

(

      select *

      from SC

      where Sno = Student.Sno AND Cno='1'

);

解法2:利用連線查詢

select Sname

from Student,SC

where Student.Sno=SC.Sno AND SC.Cno='1';

例2:查詢沒有選修1號課程的學生的姓名。

解:

select Sname

from Student

where not exists

(

     select *

     from SC

     where Sno=Student.Sno  AND   Cno='1'

);

例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

                           ) );

查詢語義:查詢這樣的學生,沒有一門課程是他不選修的。

查詢過程:

首先,選取Student表中的一個元組,然後在依次判斷Course表中的每個元組是否可以輸出,只要有一個課程可以輸出,則最外層查詢的where子句返回為false;而在判斷某個課程是否可以輸出時,則要利用第三層查詢,利用當前的學號和當前的課程號,在SC表中查詢,如果存在,則第二層查詢where子句返回false。至此,每一門課程都不可以輸出時,這個學號對應的元組才可以輸出。表示這個學生選修了全部的課程。

例4:至少選修了學生200215122選修的全部課程的學生號碼。

select distinct Sno

from SC SCX

where not exists

          (

              select *

              from SC SCY

              where SCY.Sno='2002151122'  AND

                        not exists

                        (

                              select *

                              from SC SCZ

                              where SCZ.Sno=SCX.Sno  AND

                                        SCZ.Cno=SCY.Cno));

查詢語義:不存在這樣的課程y,學生200215122選修了y,而學生x沒選。

查詢過程:先在SCX表中選一條記錄,比方說第一條,然後再看SCY表中,只有SCY表中全部不能輸出,第一層查詢的where子句才返回true,第一條記錄就可以輸出;所以就要一次檢視SCY表中的每一個元組,前三個,因為學號首先不滿足=200215122所以必然不能輸出,第四個的話,就要看其AND後面的not exists返回什麼值,而這又取決於第三層查詢中是否存在滿足學號等於SCX.Sno且課程號=SCY.Cno的元組,經檢視,有 ,則返回false,所以第四個也不能輸出,第五個類似,所以,第一層查詢的not exists返回true。所以第一條記錄可以輸出。

相關推薦

面試被問之-----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語句IN和exists的區別及應用

應用場景 將不 集中 pre 代碼 根據 gif 效率 .cn   表展示     首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下:     user表:          order表:        in     確定給定的值是否與子查

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 語句 IN 和 EXISTS 的心得體會

在學校時做專案時資料庫表少而且資料量也不大,做子查詢的時候一般沒有什麼區別,所以一直以來沒有注意過這個問題。 如今工作後,讓我實現政府執法人員執政編號的修改,用IN做子查詢時發現效率特別慢,最後發現是因為IN語句中查詢順序不同導致的。 IN 語句:只執行一次   &n

sql語句select……as的用法

inf 語句 技術分享 png info select lec src ima sql語句中select……as的用法

sql語句替換Not In 的方法

insert into stuinfo(Username,Objjc,Sex,Classid) values ('李明','文科','女','123')insert into stuinfo(Username,Objjc,Sex,Classid)values ('王二','理科','男','121')inse

SQL語句 INNER JOIN的用法

得出 sql語句 手機 語句 mage image src 就是 uid 一、SQL語句中 INNER JOIN的用法?   1.INNER JOIN的作用?   可以在兩個或者更多的表中獲取結果,得出一張新表。   表一 car 購物車      表二

SQL語句exists/not exists用法分析

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

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

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)的方法。SQLIN,NOT IN,EXISTS,NOT EXISTS用法和差別。資料庫exists與in

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

sql語句exists/not exists用法詳解

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

SQL查詢in、existsnot in、not exists用法與區別

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

SQL語句exists和in的區別

splay 比較 server for target 空值 不存在 依次 第一個 轉自https://www.cnblogs.com/liyasong/p/sql_in_exists.html 和 http://blog.csdn.net/lick4050312/artic

SQL查詢in和exists的區別分析

首先: select * from A where id in (select id from B); select * from A where exists (select 1 from B where A.id=B.id); 對於以上兩種情況,in是在記憶體裡遍

SQL語句exists和in的區別?

查詢中涉及到的兩個表,一個books和一個borrow表,具體表的內容如下: 書單(books)表: 借書表borrow IN 一、確定給定的值是否與子查詢或列表中的值相匹配。in在查詢的時候,首先查詢子查詢的表,然後將內表和外表做一個笛卡爾

SQL exists/not exists語句

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

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

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

如何用外部程式優化SQL語句的IN和EXISTS

資料結構 IN 和 EXISTS 是 SQL 中常見的複雜條件,在將 SQL(儲存過程)轉換成庫外計算獲取高效能時也會面對這些問題。本文將以 TPC-H 定義的模型為基礎,介紹如何用集算器的語法實現 IN、EXISTS 並做優化。 TPC-H 是 TPC 事務處理效