SQL查询两个表相同的两个字段里不同的数据有哪些

我的SQL数据库里有两张表里面有相同的两个列:TABLE1TABLE2xingmingxingming张三张三李四李四王五刘六赵二王五马七我怎么通过SQL语句查询出“赵二... 我的SQL数据库里有两张表里面有相同的两个列:
TABLE1 TABLE2
xingming xingming
张三 张三
李四 李四
王五 刘六
赵二 王五
马七
我怎么通过SQL语句查询出“赵二”“马七”和“刘六”呢?
展开
 我来答
乐海白35
推荐于2019-08-19 · TA获得超过284个赞
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部

SQL语句如下:

SELECT * from TABLE1
full join TABLE2 on  TABLE1.xingming = TABLE2.xingming
where
TABLE1.xingming is null or TABLE2.xingming is null

分析:

1、首先得出两个表的并集

注:full join :存在匹配,匹配显示;同时,将各个表中不匹配的数据与空数据行匹配进行显示。可以看成是左外连接与右外连接的并集。

图中结果左侧两列为TABLE1,右侧两列为TABLE2。
前三条记录表示TABLE1和TABLE2都有的数据。

TABLE1项为NULL的记录说明TABLE2中无相同项。
同理,TABLE2项为NULL的记录说明TABLE1中无相同项。

下面,只需要设置筛选条件,过滤出所需记录。

2、设置过滤条件,得到结果

从结果中可以看出,表1中的赵二在表2中没有相同xingming的记录。

表2中的刘六在表1中没有相同xingming的记录。

本题还有其它多种解法,此处列出比较好理解的一种。

扩展资料:

使用自联接

即使表在数据库中没有自反关系,也可将它与自身联接。 例如,可使用自联接查找生活在同一城市的作者对。

与任何联接一样,自联接至少需要两个表。 不同之处在于,不是向查询中添加第二个表,而是添加同一个表的第二个实例。 这样,可将表的第一个实例中的列与第二个实例中的同一列相比较,这样可相互比较列中的值。 查询和视图设计器为表的第二个实例分配一个别名。

例如,如果要创建自联接来查找居住在 Berkeley 内的所有作者对,可将表的第一个实例中的 city 列与第二个实例中的 city 列相比较。 所得到的查询可能类似于:

SELECT
        authors.au_fname,  authors.au_lname, authors1.au_fname AS Expr2,      authors1.au_lname AS Expr3       

FROM  authors INNER JOIN  authors authors1 ON authors.city  = authors1.city       

WHERE
        authors.city = 'Berkeley'

参考资料:

百度百科.full join

大野瘦子
高粉答主

推荐于2019-08-05 · 繁杂信息太多,你要学会辨别
知道小有建树答主
回答量:1227
采纳率:100%
帮助的人:34.3万
展开全部

select * from A

inner join B on A.Name = B.Name and A.ID = B.ID

where A.Name = '张三' and A.ID = '008'

内连接即可

或者:

1、除重

select distinct A.ID AS AID,A.Name AS AName,B.ID AS BID,B.Name AS BName from A inner join B on(A.Name=B.Name and A.ID=B.ID)

2、除重

select A.ID AS AID,A.Name AS AName,B.ID AS BID,B.Name AS BName from A inner join B on(A.Name=B.Name and A.ID=B.ID)

扩展资料:

SQL的其他查询

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

select * from peoplewhere peopleId in (select peopleId from people group by peopleId 

having count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

delete from peoplewhere peopleId in (select peopleId from people group by peopleId   

having count(peopleId) > 1)and rowid not in (select min(rowid) from people group by 

peopleId having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)

select * from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by 

peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by 

peopleId,seq having count(*) > 1)and rowid not in (select min(rowid) from vitae group by 

peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select * from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by 

peopleId,seq having count(*) > 1)and rowid not in (select min(rowid) from vitae group by 

peopleId,seq having count(*)>1)

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangzhiqing999
2011-03-25 · TA获得超过1.6万个赞
知道大有可为答主
回答量:7048
采纳率:100%
帮助的人:3342万
展开全部
SELECT * FROM TABLE1 MINUS SELECT * FROM TABLE2
UNION ALL
SELECT * FROM TABLE2 MINUS SELECT * FROM TABLE1

原理
MINUS : 返回第一个表中有、第二个表中没有的数据

注意:
MINUS 是 Oracle 里面用的。
如果是 SQL Server 的话, 用 EXCEPT 替换掉 MINUS.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
flyingFish211
2011-03-25 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.5万
采纳率:50%
帮助的人:1.1亿
展开全部
Easy

SELECT xingming FROM TABLE1 WHERE NOT EXISTS (SELECT 1 FROM TABLE2 WHERE xingming = TABLE1.xingming)
UNION
SELECT xingming FROM TABLE2 WHERE NOT EXISTS (SELECT 1 FROM TABLE1 WHERE xingming = TABLE2.xingming)
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
笑年1977
2011-03-25 · TA获得超过7.2万个赞
知道大有可为答主
回答量:2.2万
采纳率:81%
帮助的人:1.2亿
展开全部
select *
from TABLE1
where TABLE1.xingming not in (select * from TABLE2)
union
select *
from TABLE2
where TABLE2.xinming not in (select * from TABLE1)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式