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 EXISTS 和 NOT 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類常用的函式如下。
Vue之mixin全域性的用法詳解
個人覺得全域性mixin就是給全部Vue檔案新增一些公用的例項(方法,過濾器and so on) 使用場景:貨幣單位,時間格式。這些如果在用到的頁面使用的話程式碼會重複的很多,所以在全域性混入這些例項會減少程式碼量,可維護性也比較高。 ex: step1: 先定義mixin.js
ExtJS之Ext.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中的exists 和not exists 用法詳解
sdn ref 用法詳解 html nbsp e30 .net tail sin oracle中的exists 和not exists 用法詳解 http://blog.csdn.net/zhiweianran/article/details/7868894oracle
SQL中exists,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)
sql中exists,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 – 顯示當前數