select * 排除字段_編寫 SQL 的排除聯接

有兩個表,就叫作源表和目標表吧。它們有一個相同的字段,通過該字段可以把源表和目標表關聯在一起,我們希望從源表中檢索到的記錄里的關聯字段的值沒有存在目標表中。舉個例子,源表 dept,目標表 emp,獲取 dept 表中部門編號不在 emp 表中的記錄。檢查兩張表的數據,我們發現 emp 表中沒有部門編號 40 的數據。

c60df525eb9b024e0e1475b03eebbda4.png
圖1 emp 表的數據

cc0c12d01993b7b8f8f182f23c9942f1.png
圖2 dept 表的數據

實現這種的查詢的方法有很多,不同的實現方式的性能也會不一樣。我們就來看看都有哪些方法?

NOT IN

SELECT * 
FROMdept 
WHERE deptno NOT IN (SELECT deptno FROMemp)

這種實現方式需要注意一個點,就是在 not in 里面不能出現 NULL,如果出現 NULL 就會查不到結果。比如下面這條 SQL,沒有數據返回。

SELECT dname 
FROMdept 
WHERE deptno NOT IN (SELECT deptno FROMemp UNION ALL SELECT NULL)

為什么是這樣呢?

因為在邏輯運算中,涉及到 NULL 的操作的結果仍為 NULLnot in 可以改寫成 or 的形式,比如 deptno not in(10,NULL) 展開成 or 的表達式是:not (deptno = 10 or deptno = NULL),最終的表達式是 not NULL

NOT EXISTS

使用 not exists 可以避免由于目標表的關聯列上出現 NULL 而查不出數據。

WITH e AS 
(SELECT deptno 
FROMemp 
UNION ALL 
SELECT NULL) 
SELECT * 
FROMdept 
WHERE NOT EXISTS (SELECT NULL FROMe WHERE e.deptno = dept.deptno)

使用 not exists 的 SQL 的一般形式:

SELECT 選擇列 
FROM源表 
WHERE NOT EXISTS (SELECT NULL FROM目標表 WHERE 關聯字段)

在 MySQL 5.6 之前,子查詢的性能表現得比較差,因而就有人想著把子查詢改成連接的方式以提高查詢性能。

LEFT JOIN

通常,我們會想到使用 NOT INNOT EXISTS 做排除操作。其實,使用 LEFT JOIN 也可以達到相同的目的。

SELECT d.* 
FROMdept d LEFT JOIN emp e ON e.deptno = d.deptno 
WHERE e.deptno IS NULL 

對于表達式 a left join b ,不管 b 表中是否有數據可以和 a 表匹配得上,a 表總是能返回所有數據。如果 b 表中沒有數據能匹配得上 a 表,在查詢結果中會使用 NULL 填充 b 表的列。因此,通過過濾條件 b.關聯列 is NULL 可以找到只存在于 a 表中的數據。

總結

  1. 使用 not in 時要考慮到排除的值中是否有 NULL ,如果有,需要提前做過濾處理。
  2. not existsleft join 都可以用來做排除操作,可以任選一種方式實現,如果 SQL 的性能表現不佳,則可以換另外一種方式試試。

來源:SQL實現

作者:zero

原文:編寫 SQL 的排除聯接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JS中調用bignumber處理高精度小數運算

ignumber.js用于數字精度要求較高的計算。 bignumber.js源碼地址&#xff1a;https://github.com/MikeMcl/bignumber.js 1.下載bignumber.js。 下載地址&#xff1a;https://github.com/MikeMcl/bignumber.js/releases 2.引入js。 3.示例 html: <div><label>數1&am…

centos8安裝搜狗輸入法_搜狗拼音輸入法去廣告版

搜狗輸入法是搜狗公司2006年6月推出的一款漢字輸入法工具。與傳統輸入法不同&#xff0c;搜狗輸入法是第一款為互聯網而生的輸入法——它通過搜索引擎技術&#xff0c;將互聯網變成了一個巨大的“活”詞庫。應該有許多人電腦上都裝了吧&#xff0c;不過一般下載的版本天天彈廣告…

Project查看資源分配情況

選擇 資源圖表&#xff0c;點擊 格式&#xff0c;在圖表里選擇

webbrowser實現input tab事件_如何合理構造一個Uploader工具類(設計到實現)

作者&#xff1a;Chaser (本文來自作者投稿) 原文地址&#xff1a;https://juejin.im/post/5e5badce51882549652d55c2源碼地址&#xff1a;https://github.com/impeiran/Blog/tree/master/uploader前言本文將帶你基于ES6的面向對象&#xff0c;脫離框架使用原生JS&#xff…

小達人點讀筆的任我貼貼紙怎么使用?

小達人點讀筆是一款高性能、高容量點讀筆。其自身的開放性、共享性、傳播性讓可讀書籍及音頻資源真正的達到了海量且優質有用。 下面我們來認識一下標配中任我貼上的貼紙&#xff1a; 智能貼 用于已經布有二維碼的有聲圖書的封面&#xff0c;比如律動英語&#xff0c;成長一線&…

vscode必備插件_10個必備的Visual Studio Code (VS code)插件

我基本上每天都用vs code&#xff0c;我喜歡的小巧&#xff0c;開源&#xff0c;免費并且非常強大。尤其它非常多的插件可以免費使用。這里我把經常用插件介紹給大家&#xff0c;希望大家留言討論我把VS code 插件分兩類&#xff0c;一類是處理可視化的&#xff0c;比如說顏色&…

軟考官方教材:信息系統項目管理師教程(第三版)

2020年下半年信息系統項目管理師考試官方教材將繼續使用清華大學出版社出版的信息系統項目管理師教程第3版&#xff08;特別注意&#xff0c;有某些輔導資料也打著信息系統項目管理師教程第3版的旗號&#xff0c;各位考生一定要看準官方指定教材是由全國計算機專業技術資格考試…

centos掛載windows共享目錄

2019獨角獸企業重金招聘Python工程師標準>>> 在windows中創建一個共享文件夾記住這個網絡路徑&#xff0c; 在centos上新建文件夾/mnt/MyShare $> mkdir /mnt/MyShare掛載 username用戶名.password登錄密碼 $> Sudo mount -t cifs -o username用戶名,pass…

博閱likebook alita專用pdf制作

適合博閱likebook alita帶手寫的。 先上效果圖&#xff0c;左邊是正文&#xff0c;右邊有留白可以寫讀書筆記 這樣做有什么好處&#xff1f; pdf從閱讀器里復制出來&#xff0c;在電腦打開&#xff0c;筆記也會有。筆記是直接記錄在pdf上的&#xff0c;相當于pdf上的批注。 …

esc鍵沒反應_有機人名反應——Brown 硼氫化反應(Brown Hydroboration)

Brown 硼氫化反應&#xff08;Brown Hydroboration&#xff09;反應機理鏈接&#xff1a;http://chem.kingdraw.cn/Shortlink?id20200624161301Brown硼氫化反應&#xff0c;是指乙硼烷在醚類溶液中離解成的甲硼烷以B-H鍵與烯烴、炔烴的不飽和鍵加成&#xff0c;生成有機硼化合…

利用IDisposable接口構建包含非托管資源對象

托管資源與非托管資源 在.net中&#xff0c;對象使用的資源分為兩種&#xff1a;托管資源與非托管資源。托管資源由CLR進行管理&#xff0c;不需要開發人員去人工進行控制&#xff0c;.NET中托管資源主要指“對象在堆中的內存”&#xff1b;非托管資源指對象使用到的一些托管內…

修改Navicat數據庫自動備份目錄

1.右鍵連接&#xff0c;選擇“編輯連接” 2. 選擇“高級”&#xff0c;設置位置

python圖形界面編程庫_Python支持哪些圖形界面的第三方庫

Python支持哪些圖形界面的第三方庫 發布時間&#xff1a;2020-11-09 10:37:56 來源&#xff1a;億速云 閱讀&#xff1a;58 作者&#xff1a;小新 這篇文章給大家分享的是有關Python支持哪些圖形界面的第三方庫的內容。小編覺得挺實用的&#xff0c;因此分享給大家做個參考。一…

成為中國特色項目經理,走上人生巔峰

今天是秋分&#xff0c;寫在項目經理6周年的總結 落葉知秋&#xff0c;情誼如酒&#xff0c;風漸涼時有喜無憂&#xff1b; 歲月流走&#xff0c;驀然回首&#xff0c;一聲問候醇綿依舊&#xff1b; 有情相守&#xff0c;不離左右&#xff0c;含笑送出這份問候。 -----------…

python中括號的作用_Python3--中括號[]與冒號:在列表中的作用

先來定義兩個列表: liststr ["helloworld","hahahh","123456"] listnum [1,2,3,4,5,6] 這兩個列表都可以看懂吧,一個字符串組成的列表,一個數字組成的列表 中括號"[]"的作用 : 用于定義列表或引用列表、數組、字符串及元組中元素位置…

相約11月25日,開發者的嘉年華

》》廈門GDG DevFest 2018 2018 年 11 月 25 日&#xff0c;大家期待已久的廈門GDG DevFest 2018 將于廈門大學科藝中心隆重舉行&#xff01; 此次活動主題是時下最受關注的人工智能領域&#xff0c;邀請數位重量級嘉賓&#xff0c;帶來關于 TensorFlow、Android等最新技術內容…

項目經理到底要不要懂技術?

不難發現&#xff0c;高薪項目經理崗位&#xff0c;往往對項目經理有技術要求。為什么會這樣&#xff1f; 存在即合理&#xff0c;一定是現實中需要&#xff0c;項目實施過程中有必要。 想起了自己以前有次面試&#xff0c;二面是公司總經理&#xff0c;總經理說&#xff1a;…

搭建基于C#和 Appium 的 Android自動測試環境

移動端的自動化測試框架主要就是UiAutomator&#xff0c;Espresso&#xff0c;Robotium和功能最強大&#xff0c;也是比較熱門的框架Appium如果想做手機端的自動化測試&#xff0c;Appium是首選的測試框架&#xff0c;因為網上使用的人多&#xff0c;資料豐富&#xff0c;支持語…

git 可視化工具_Git的基本使用(二)

通過前文Git的基本使用(一)的學習&#xff0c;相信大家對如何將iOS項目通過Git傳到GitHub賬戶上有了一個基本的了解&#xff0c;其過程是相對繁瑣和容易出錯的。本文將告訴大家借助工具來幫助我們實現這些操作&#xff0c;并對前文進行進一步補充。一、兩個軟件Visual Studio C…

小米8配哪個版本的MIUI?

小米8之前我是忠實的魅粉&#xff0c;魅族手機用過M8&#xff0c;MX3&#xff0c;note5&#xff0c;MX6 pro。 魅族真的是被聯發科的cpu坑了&#xff0c;一核有難&#xff0c;八核圍觀。 入手小米8&#xff0c;miui是9&#xff0c;一路跟著系統自動更新&#xff0c;更新到了12。…