日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

select * 排除字段_编写 SQL 的排除联接

發(fā)布時間:2025/3/8 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 select * 排除字段_编写 SQL 的排除联接 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

圖1 emp 表的數(shù)據(jù)

圖2 dept 表的數(shù)據(jù)

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

NOT IN

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

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

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

為什么是這樣呢?

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

NOT EXISTS

使用 not exists 可以避免由于目標(biāo)表的關(guān)聯(lián)列上出現(xiàn) NULL 而查不出數(shù)據(jù)。

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目標(biāo)表 WHERE 關(guān)聯(lián)字段)

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

LEFT JOIN

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

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

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

總結(jié)

  • 使用 not in 時要考慮到排除的值中是否有 NULL ,如果有,需要提前做過濾處理。
  • not exists 和 left join 都可以用來做排除操作,可以任選一種方式實現(xiàn),如果 SQL 的性能表現(xiàn)不佳,則可以換另外一種方式試試。
  • 來源:SQL實現(xiàn)

    作者:zero

    原文:編寫 SQL 的排除聯(lián)接

    總結(jié)

    以上是生活随笔為你收集整理的select * 排除字段_编写 SQL 的排除联接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。