SQL联接

介绍

在SQL中,联接是将记录集链接在一起的一种方式。

它们涉及限制在输出Recordset中返回哪些数据。 如果未指定连接,但指定了两个Recordset,则将生成没有指定限制的笛卡尔乘积。 从概念上讲,在可能指定的任何WHERE子句之前应用JOIN。

注意 Access(Jet)SQL不支持完全外部联接。

联接记录集时,它们通常在输出记录集中产生的记录多于输入记录集中产生的记录。 但是,并非总是如此。

JOINed Recordsets将两个输入Recordsets转换为单个输出Recordset,其中包含两个输入Recordsets的字段。

在Access(Jet)SQL中,表可以通过多种方式连接。

  • 内部联接
    最简单的形式可以是:
    FROM Table1 INNER JOIN Table2 ON Table1.Field=Table2.Field
    这将在输出Recordset中为一个Recordset中的每个记录与另一个Recordset中的每个记录的每种组合生成一条记录, 其中ON语句为TRUE 。 如果没有匹配的记录,则它将不包含在输出Recordset中。 如果不止一个,则所有组合将包含在输出Recordset中。
    请参阅下面的示例,以更好地理解这一点。
  • 左联接; 右联接(外部联接)
    最简单的形式可以是:
    FROM Table1 LEFT JOIN Table2 ON Table1.Field=Table2.Field
    这会在输出Recordset中为一个Recordset中的每个记录与另一个Recordset中的每个记录的每种组合生成一条记录... 其中ON语句为TRUE ...或第二个(对于LEFT JOIN)或第一个(对于a RIGHT JOIN)记录不存在。 这会将输入Recordset中的一个设置为比另一个更高的优先级。 它包括一个记录集的所有记录,但仅包括匹配的另一个记录集的所有记录。 如果有多个匹配记录,则所有组合仍将包含在输出Recordset中。
    请参阅下面的示例,以更好地理解这一点。
  • 完全外部联接(Access(Jet)SQL不支持)
    最简单的形式可以是:
    FROM Table1 OUTER JOIN Table2 ON Table1.Field=Table2.Field
    这将在输出Recordset中为一个Recordset中的每个记录与另一个Recordset中的每个记录的每种组合生成一条记录... ,其中ON语句为TRUE ...或,否则第一个OR第二个匹配记录不存在。 这会将两个输入Recordsets设置为彼此相同的优先级。 它包括两个记录集的所有记录。 如果有多个匹配记录,则所有组合仍将包含在输出Recordset中。
    请参阅下面的示例,以更好地理解这一点。
  • 不加入(笛卡尔积)
    请注意,这与其他格式不符。
    在SQL中,只需列出两个用逗号(,)分隔的表即可。
    处理未联接的链接的方式是,将两个输入Recordsets中所有记录的每个组合作为记录返回到输出Recordset中。 这可以从相对较小的输入记录集(笛卡尔乘积)产生大量记录。
    请参阅下面的示例,以更好地理解这一点。
例子
 Table1           Table2 
Name1    Value1    Name2    Value2
Andy     11        Andy     101
Andy     12        Andy     102
Bob      21        Charlie  301
Bob      22        Charlie  302
Don      41        Don      401
内部联接示例
SELECT Name1,Value1,Name2,Value2
FROM Table1 INNER JOIN Table2
  ON Table1.Name1=table2.Name2
输出记录集
 Name1    Value1    Name2    Value2 
Andy     11        Andy     101
Andy     11        Andy     102
Andy     12        Andy     101
Andy     12        Andy     102
Don      41        Don      401
Bob和Charlie都根本没有使用此JOIN类型出现,因为两个表均未包含。 左外连接示例
SELECT Name1,Value1,Name2,Value2
FROM Table1 LEFT JOIN Table2
  ON Table1.Name1=table2.Name2
输出记录集
 Name1    Value1    Name2    Value2 
Andy     11        Andy     101
Andy     11        Andy     102
Andy     12        Andy     101
Andy     12        Andy     102
Bob      21        Null     Null
Bob      22        Null     Null
Don      41        Don      401
包括Bob,但是由于没有来自Table2的匹配记录,因此来自Table2的字段保留为Null。 查理根本没有出现,因为它没有出现在表1中。 右外连接示例
SELECT Name1,Value1,Name2,Value2
FROM Table1 RIGHT JOIN Table2
  ON Table1.Name1=table2.Name2
输出记录集
 Name1    Value1    Name2    Value2 
Andy     11        Andy     101
Andy     11        Andy     102
Andy     12        Andy     101
Andy     12        Andy     102
Null     Null      Charlie  301
Null     Null      Charlie  302
Don      41        Don      401
包括Charlie,但由于没有来自Table1的匹配记录,因此来自Table1的字段保留为Null。 Bob根本没有出现,因为它没有出现在Table2中。 全外连接示例
SELECT Name1,Value1,Name2,Value2
FROM Table1 OUTER JOIN Table2
  ON Table1.Name1=table2.Name2
输出记录集
 Name1    Value1    Name2    Value2 
Andy     11        Andy     101
Andy     11        Andy     102
Andy     12        Andy     101
Andy     12        Andy     102
Bob      21        Null     Null
Bob      22        Null     Null
Null     Null      Charlie  301
Null     Null      Charlie  302
Don      41        Don      401
包括所有记录,如果两个输入记录集(EG。Andy)中有多个匹配项,则不止一次。 Bob和Charlie都包括在内,但是丢失的数据由Nulls表示。 没有任何地方没有代表的数据。

注意 Access(Jet)SQL不支持这种类型的联接。

不加入(笛卡尔积)示例
SELECT Name1,Value1,Name2,Value2
FROM Table1,Table2
输出记录集
 Name1    Value1    Name2    Value2 
Andy     11        Andy     101
Andy     11        Andy     102
Andy     11        Charlie  301
Andy     11        Charlie  302
Andy     11        Don      401
Andy     12        Andy     101
Andy     12        Andy     102
Andy     12        Charlie  301
Andy     12        Charlie  302
Andy     12        Don      401
Bob      21        Andy     101
Bob      21        Andy     102
Bob      21        Charlie  301
Bob      21        Charlie  302
Bob      21        Don      401
Bob      22        Andy     101
Bob      22        Andy     102
Bob      22        Charlie  301
Bob      22        Charlie  302
Bob      22        Don      401
Don      41        Andy     101
Don      41        Andy     102
Don      41        Charlie  301
Don      41        Charlie  302
Don      41        Don      401
包括所有可能的组合。

From: https://bytes.com/topic/access/insights/608296-sql-joins

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值