有2张表:
A
id 1 name 1a
id 2 name 2a
id 3 name 3a
id 4 name 4a
id 5 name 5a
B
id 1 name 1b
id 2 name 2b
id 3 name 3b
id 4 name 4b
id 5 name 5b
现在把A、B表的数据联合起来再筛选出想要的。
1)、查出字段name中不包含'a'字符的数据。
select * a
union
select * b
where name not like '%a%'
看似上面的写法不错,其实结果是错误的,查出的结果是a、b表的所有数据,并不是想得到的结果。但把第一个SELECT的表名和第二个表名换个位置,就是希望的结果。
select * b
union
select * a
where name not like '%a%'
通过这样的结果分析出,每次在like查找之前都已经把地一个表的数据查出来了,并没有对第一个表进行筛选,所以导致上面2次查询结果不一样。
正确的SQL语句写法是:
select * from
(
select * a
union
select * b
) as #temp
where name not like '%a%'
这样结果才是最正确。
A
id 1 name 1a
id 2 name 2a
id 3 name 3a
id 4 name 4a
id 5 name 5a
B
id 1 name 1b
id 2 name 2b
id 3 name 3b
id 4 name 4b
id 5 name 5b
现在把A、B表的数据联合起来再筛选出想要的。
1)、查出字段name中不包含'a'字符的数据。
select * a
union
select * b
where name not like '%a%'
看似上面的写法不错,其实结果是错误的,查出的结果是a、b表的所有数据,并不是想得到的结果。但把第一个SELECT的表名和第二个表名换个位置,就是希望的结果。
select * b
union
select * a
where name not like '%a%'
通过这样的结果分析出,每次在like查找之前都已经把地一个表的数据查出来了,并没有对第一个表进行筛选,所以导致上面2次查询结果不一样。
正确的SQL语句写法是:
select * from
(
select * a
union
select * b
) as #temp
where name not like '%a%'
这样结果才是最正确。