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。所以第一條記錄可以輸出。

轉自:http://blog.csdn.net/zengcong2013/article/details/45820639

相關推薦

sql語句where子句like的用法

在SQL結構化查詢語言中,LIKE語句有著至關重要的作用。LIKE語句的語法格式是:select * from 表名 where 欄位名 like 對應值(子串),它主要是針對字元型欄位的,它的作用是在一個字元型欄位列中檢索包含對應子串的。 假設有一個數據庫中有個表tabl

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 Server數據類型

需要 table 根據 字符類型 自動分配 指定 insert 獲得 基於 閱讀目錄 一:系統數據類型 2.浮點數據類型 3.字符數據類型 4.日期和時間數據類型 5.文本和圖形數據類型 6.貨幣數據類型 7.位數據類型 8.二進制數據類型

STL三:deque用法

deque函式: deque容器為一個給定型別的元素進行線性處理,像向量一樣,它能夠快速地隨機訪問任一個元素,並且能夠高效地插入和刪除容器的尾部元素。但它又與vector不同,deque支援高效插入和刪除容器的頭部元素,因此也叫做雙端佇列。deque類常用的函式如下。

Vuemixin全域性的用法

個人覺得全域性mixin就是給全部Vue檔案新增一些公用的例項(方法,過濾器and so on) 使用場景:貨幣單位,時間格式。這些如果在用到的頁面使用的話程式碼會重複的很多,所以在全域性混入這些例項會減少程式碼量,可維護性也比較高。 ex: step1: 先定義mixin.js

ExtJSExt.Ajax.request用法

該請求所用的http方面,預設值為配置的方法,或者當沒有方法被配置時,如果沒有傳送引數時用get,有引數時用post。 The HTTP method to use for the request. Defaults to the configured method, or if no method was

Java學習筆記Pattern類的用法 (正則表示式)

Implements: Serializable 正則表示式的編譯表示形式。 指定為字串的正則表示式必須首先被編譯為此類的例項。然後,可將得到的模式用於建立 Matcher 物件,依照正則表示式,該物件可以與任意字元序列匹配。執行匹配所涉及的所有狀態都駐留在匹配器中,

sql語句exists/not exists用法

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

面試被問-----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

oracle中的existsnot exists 用法

sdn ref 用法詳解 html nbsp e30 .net tail sin oracle中的exists 和not exists 用法詳解 http://blog.csdn.net/zhiweianran/article/details/7868894oracle

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引導

SQL語句GROUP BY用法

大家都知道groupby在sql語句中代表按照某個欄位分組,但原理和用法在網上不容易查得到。 下面我用一句話簡介的來說明: 如果select 中出現了非聚合函式的欄位,那麼所有欄位都要在group by後面出現,然而group by後面的分組欄位可以不用在select中出

遍歷資料庫表(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的系

SQL exists/not exists語句

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

LINQ體驗(7)——LINQ to SQL語句Group By/Having和Exists/In/Any/All/Contains

我們繼續講解LINQ to SQL語句,這篇我們來討論Group By/Having操作符和Exists/In/Any/All/Contains操作符。 Group By/Having操作符 適用場景:分組資料,為我們查詢資料縮小範圍。 說明:分配並返回對傳入引數進行分組操作

Sql語句中IN和exists的區別及應用

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

SQL語句數據定義語言(DDL)

三種 absolute row redundant 字符 對象 not null 工作 part 操作對象:數據庫 1)創建數據庫 MariaDB [(none)]> help create databaseName: ‘CREATE DATABASE‘Descrip

MySQL常用SQL語句SHOW語句

disable ret gpl cati host write flush none mat SQL語句之SHOW語句 SHOW DATABASES – 顯示當前所有數據庫的名稱 mysql> SHOW DATABASES; SHOW TABLES – 顯示當前數