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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章