mysql中查詢表中不存在的數據 將常量作爲臨時表進行關聯查詢

巨大的建築,總是由一木一石疊起來的,我們何妨做做這一木一石呢?我時常做些零碎事,就是爲此。
這是對的,但是我沒有說過這句話! —— 魯迅

先看一個例子

select name from user u where u.name in ('zhangsan', 'lisi');

有一個用戶表user,現在user表中有lisi,wangwu,但是沒有zhangsan,上面語句查出來的結果,肯定是lisi。
那麼我現在的需求是把zhangsan查出來,也就是,我有一個常量列表,我要查詢這些常量有哪些在表中不存在,是新數據。

將常量作爲臨時表進行關聯查詢.

這裏有 zhangsan,lisi等一些常量,現在的目的是,假裝這些數據是從表中查出來的。如下:

select 'zhangsan' as name 
union select 'lisi'

在oracle中,要用到臨時表dual,而mysql中不需要,可以不from任何表.
上面的sql,就會查出來 zhangsan,lisi這兩個值,並且屬性名爲name.

聯合查詢

select * from (select 'zhangsan' as name 
union select 'lisi') t
where not exists(select 1 from user u where t.name = u.name)

修改第一個查詢

因爲我們的常量是一個list,在編程語言中,比如mybaties中,是可以用foreach等循環結構拼接出來的。
但是通過觀察,發現,第一個select和非第一個select是不一樣的,其他的有union,而第一個沒有union,這樣拼接的時候,就要對第一個做特殊處理。
我們可以讓第一個什麼也不查出來,即空,這樣就行了。如下:

select * from
    (select name from user where id = -1
    union select 'zhangsan'
    union  select 'penglx') t
where not exists(select 1 from user u where t.name = u.name);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章