Ⅰ sql如何判斷不在表中數據段內
select 表1.[No] from 表1,表2 group by 表1.[No] having(sum(case when (表1.[No]>表2.[from] and 表1.[No]<表2.[to]) then 1 else 0 end)=0)
Ⅱ SQL中,如何查詢存在一個表而不在另一個表中的數據記錄
問題是怎麼才算在兩個表裡都有?我以ID相同舉例吧,其他的自己悟。 select * from a where id not in (select id from b) 這樣就能列出a表裡有而b表裡沒有的記錄(以ID相同為標准)。 明白了嘛? 暈……你又沒說是MYSQL……
Ⅲ mysql查詢數值不在表中的sql語句
select id from table where id in(1,2,3,4);這段先查詢到你資料庫存在的id,
然後在程序裡面過濾掉這些id,剩下的就是數據不存在的id
Ⅳ sql 如何查詢不在這個范圍內的數據,如下
用not in語句即可解決。
Ⅳ 關於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中如何判斷一個字元是否包含在表欄位中,而不是包含在表記錄中
Select
name
from
syscolumns
Where
ID=OBJECT_ID('表名')
這個可以查出你所查詢的表的所有欄位名字,如你所說你傳入個3個話可以寫
Select
name
from
syscolumns
Where
ID=OBJECT_ID('表名')
and
name
like
'%3%'
這樣返回就是這個表的欄位名包含3的欄位了,在程序里你自己把這些個欄位名取出來,拼成
欄位1,欄位2的格式,再放到你的查詢語句去就是了~
Ⅶ SqlServer2008 如何判斷一張表的數據不在另外兩張表裡且在該表中新建一列顯示狀態
判斷tab1的是否在tab2和tab3中有值:
SELECT DISTINCT
a.表欄位 AS 欄位名,
NVL(b.外鍵,0) AS dataintab2,
NVL(c.外鍵,0) AS dataintab3
FROM tab1 a,tab2 b,tab3 c
WHERE a.主鍵=b.外鍵(+)
AND a.主鍵=c.外鍵(+)
AND a.主鍵=一個具體值;
PS:1、NVL函數為如果b的外鍵為空則返回0
2、(+)表示對於a與b和a與c的連接使用左外連接,即就算b和c中沒有數據也會將a中的數據返回
3、將b和c的外鍵返回給dataintab2和dataintab3,即如果b和c中有數據則返回這個數據,否則為空返回0
4、判斷b和c中是否有數據即看dataintab2和dataintab3是否為0,如果為0表示b或者c中沒有a的數據
5、返回之後在程序中訪問這個欄位即可完成對其狀態的顯示。
6、由於使用了外連接,因此會返回幾組相同的數據,使用DISTINCT去除相同的數據
上面是一個Oracle版本,下面是一個通用版本:
SELECT DISTINCT
a.表欄位 AS 欄位名,
NVL(b.外鍵,0) AS dataintab2,
NVL(c.外鍵,0) AS dataintab3
FROM tab1 a LEFT JOIN tab2 b ON a.主鍵=b.外鍵 LEFT JOIN tab3 c ON a.主鍵=c.外鍵
WHERE a.主鍵=一個具體值;
具體問題具體分析,希望朋友你能養成良好的分析問題的習慣。
希望能夠對你有所幫助。
Ⅷ SQL中,如何查詢存在一個表而不在另一個表中的數據記錄
首先,在SQL中(以SQL Server為例),查詢存在一個表而不在另一個表中的數據記錄的方法有很多,介紹其中4種:
1、方法一(僅適用單個欄位):使用 not in ,比較容易理解,缺點是效率低
如:select A.ID from A where A.ID not in (select ID from B);
2、方法二(適用多個欄位匹配):使用 left join...on... , "B.ID isnull" 表示左連接之後在B.ID 欄位為 null的記錄。
如:select A.ID from A left join B on A.ID=B.ID where B.ID is null ;
3、方法三(適用多個欄位匹配)
如:select * from B where (select count(1) as num from A where A.ID = B.ID) = 0;
4、方法四(適用多個欄位匹配)
如:select * from A where not exists(select 1 from B where A.ID=B.ID)
接著,我們來分析你的SQL語句為什麼返回數據不準確的原因。
從你的SQL基礎語句來看,你使用了方法一和方法四這兩種,兩種語法本身都是正確的,但是卻沒有達到預期的效果,初步分析,問題可能出在gsdj和swdj這兩張表的qymc欄位的判斷比較上。
舉個例子:'企業名稱'和'企業名稱 '這兩個字元串看似相同,實際卻並不相同,因為第二個「企業名稱 」的後面跟了一個空格字元。就因為這個空格字元導致這個"'企業名稱'='企業名稱 '"等式不成立。
考慮到你qymc這個欄位的類型是字元型,建議你在原有sql基礎上做一個微調如下:
select * from gsdj gs where not exists (select * from swdj sw where rtrim(ltrim(sw.qymc)))=rtrim(ltrim(gs.qymc)));
其中Ltrim()可以去除左側空格,rtrim()可以去除右側的空格,也就是說我們是對去除空格後的企業名稱進行比較,排除了空格的干擾。
(8)sql不在表中擴展閱讀:
在SQL中,對於字元型文本數據,經常需要用到去空格的操作,對ORACLE數據來說可以通過TRIM()函數來簡單實現,而SQL SERVER中並沒有TRIM()函數,只有LTRIM()和RTRIM()兩個函數。
SQL 中使用ltrim()去除左邊空格,rtrim()去除右邊空格,沒有同時去除左右空格的函數,要去除所有空格可以用replace(字元串,' ',''),將字元串里的空格替換為空。
例:去除空格函數
declare @temp char(50)
set @temp = ' hello sql '
print ltrim(@temp) --去除左邊空格
print rtrim(@temp) --去除右邊空格
print replace(@temp,' ','')--去除字元串里所有空格
print @temp
>> 輸出結果
hello sql
hello sql
hellosql
hello sql