在SQL中,如果我们只想找到交集,是否可以编写一个内部连接语句作为主查询和子查询?

在SQL中,如果我们只想找到交集,是否可以编写一个内部连接语句作为主查询和子查询?,sql,mysql,join,subquery,inner-join,Sql,Mysql,Join,Subquery,Inner Join,在SQL中,如果我们只想找到交集,我们是否可以始终编写一个内部连接语句作为主查询和子查询,或者反之亦然 比如说, select * from gifts g where g.giftID in (select giftID from sentGifts); 可以进行连接并显示sentGifts表中发送的礼物,但无法显示sentTime,因为它位于子查询中。但是如果我们关心的只是找到交叉点,而不关心显示的内容,那么我们总是可以将一个转换为另一个?不,只有在连接到单个列时才能这样做。当表通过多部

在SQL中,如果我们只想找到交集,我们是否可以始终编写一个内部连接语句作为主查询和子查询,或者反之亦然

比如说,

 select * from gifts g where g.giftID in (select giftID from sentGifts);

可以进行连接并显示sentGifts表中发送的礼物,但无法显示sentTime,因为它位于子查询中。但是如果我们关心的只是找到交叉点,而不关心显示的内容,那么我们总是可以将一个转换为另一个?

不,只有在连接到单个列时才能这样做。当表通过多部分键连接时,它将不起作用

例如:

select g.* from gifts g
join sentGifts s on s.Number=g.Number and s.Name=g.Name

如果两个表上唯一的唯一标识符是Number和Name的组合,则无法将上述内容转换为子查询类型语句。

否,只有在连接单个列时才能执行此操作。当表通过多部分键连接时,它将不起作用

例如:

select g.* from gifts g
join sentGifts s on s.Number=g.Number and s.Name=g.Name

如果两个表上唯一的唯一标识符是Number和Name的组合,则无法将上述内容转换为子查询类型语句。

在set术语中,两个查询都会找到两个集合的交集,因此使用哪种形式无关紧要

您将始终能够将一种形式转换为另一种形式


作为一个实际使用的问题-如果您对联接使用基于集合的方法,那么大多数RDBMS的性能会更好—它们针对联接进行了更好的优化。正如您所提到的,还存在返回结果集的问题—如果需要两个集合中的数据,则必须使用联接。

在集合术语中,两个查询都将找到两个集合的交集,因此使用哪种形式并不重要

您将始终能够将一种形式转换为另一种形式


作为一个实际使用的问题-如果您对联接使用基于集合的方法,那么大多数RDBMS的性能会更好—它们针对联接进行了更好的优化。正如您所提到的,还存在返回结果集的问题—如果您需要两个数据集的数据,则必须使用联接。

您的意思是这样的:从gifts g中选择*g,其中g.id在select giftId中,从sentGifts中选择giftId,其中s.id=g.id和s.Id2=g.Id2不起作用。我假设两个表都有多部分键,你的意思是这样的:从gifts g中选择*g,其中g.id,从sentGifts中选择giftId,其中s.id=g.id,s.Id2=g.Id2,这不起作用。我假设两个表都有多部分键。