『壹』 查詢a表中的 a1欄位數據不在(b表b1欄位數據和c表中c1欄位數據)中的sql語句怎麼寫
1.
select *
from a
where a1 not in (select b1 from b)
and a1 not in (select c1 from c)
2.
select *
from a
where a1 not in (select b1 from b union all select c1 from c)
3.
select *
from a
left outer join b on b.b1=a.a1
left outer join c on c.c1=a.a1
where
b1 is null
and
c1 is null
『貳』 SQL中,如何查詢存在一個表而不在另一個表中的數據記錄
問題是怎麼才算在兩個表裡都有?我以ID相同舉例吧,其他的自己悟。 select * from a where id not in (select id from b) 這樣就能列出a表裡有而b表裡沒有的記錄(以ID相同為標准)。 明白了嘛? 暈……你又沒說是MYSQL……
『叄』 oracle 查找A表存在B表不存在的記錄
1、創建測試表,
create table test_find_a(a varchar2(20), b varchar2(20));
create table test_find_b(a varchar2(20), b varchar2(20));
『肆』 如何用SQL寫出在A表內,但不在B表內的所有欄位,一個欄位簡單,但所有在A表內不在B表內的該如何寫
select * from A left join B on A.id = B.id
自己參考一下
『伍』 用SQl語句查詢在一張表卻不在另外一張表的內容
大致是:
select
from
where
not exist
(select ** from **where**)
『陸』 關於sql查詢b表中存在,a表中不存在的數據
這實際上是求非交集(差集)問題,sql語句求差集相對於求交集的辦法要少得多。
求差集方法中,使用not in關鍵字進行篩選在邏輯上最容易理解,很多人都會想到利用到它,數據量不大時還行,但是它有個重大缺陷,那就是在碰到大數據表的情況下其運行效率極低,有沒有可被利用的索引效率都一樣極差。我曾在利用大數據表的測試中,發現not in 語句常常要花費數小時才能返回結果,最誇張的例子耗時竟然超過一天!在返回結果前數據查詢會處在"假死"狀態,讓人感覺是返回了空集似的,其實不是那樣的,只是資料庫引擎尚未完成運算而已。
在有可被利用的索引情況下,我們可以利用非存在not exists子句來篩選出兩表之間的差集,其運行效率是非常高的。以題主的語句為例可改寫如下:
原來使用not in篩選差集,大數據表效率極差:
SELECT ipdz FROM ipdz_b WHERE ipdz not in(select ipdz_d from zj_b);
而使用not exists篩選差集,大數據表有索引可利用時返回結果酒快多了:
select b.ipdz from ipdz_b b where not exists(
select 1 from zj_b a where a.ipdz_d=b.ipdz);
請留意不要踩not exists的坑!盡管它在有可被利用的索引時運行效率極高,但是如果沒可利用的索引它會跟not in一樣在遇到大數據表時, 運行運行效率也很糟!
在沒有索引可被利用的情況下,建議利用左(右)聯接出現的null值來求出差集,但是需要留意並小心處理因兩表連接所導致的記錄行變多問題。
下面是以題主的表結構為例的sql語句寫法,其返回結果集的速度還是很不錯的:
left join 篩選差集:
select b.ipdz from ipdz_b b left join zj_b a on
a.ipdz_d=b.ipdz where a.ipdz_d is null;
這里假設a表的ipdz_d是唯一的,如果非唯一需調整如下
select b.ipdz from ipdz_b b left join (
select distinct ipzd_d from zj_b) a on
a.ipdz_d=b.ipdz where a.ipdz_d is null;
總結:
小數據量not in隨便用,此方法邏輯簡單,語句易於編寫;
大數據量在有可利用的索引情況下,建議首選 not exists(因為效率最高);
大數據量時,有沒有可被利用的索引not in都要避免使用。而not exists 在沒索引可利用時也應避免使用,此時建議使用左left join或右連接返回差集會有比較好的表現。
後兩種方法在邏輯上不太好理解,還要處理因連接導致的記錄行變多問題,語句編寫相對麻煩。
『柒』 怎麼用sql語句查詢存在於表a而不存在於表b的數據
第一個問題:select name1 from 表a minus select name1 from 表b
第二個問題:select a.*,b.* from 表a a,表b b where a.name1=b.name1