目录
在关系数据库中,数据分布在多个逻辑表中。 要获得完整有意义的数据集,需要使用连接来查询这些表中的数据。
SQL Server支持多种连接,包括 [内连接],[左连接],[右连接],[全外连接]和[交叉连接]。
每种连接类型指定SQL Server如何使用一个表中的数据来选择另一个表中的行。
1.SQL Server 内连接
内连接是SQL Server中最常用的连接之一。 内部联接子句用于查询来自两个或多个相关表的数据。
SQL Server INNER JOIN子句的语法:
Select 列名
From 表1
Inner join 表2 on 连接主外键
在此语法中,从表1和表2中查询检索数据:
- 首先,在FROM子句中指定主表(表1)
- 其次,在INNER JOIN子句和连接谓词中指定第二个表(表2)。 只有连接谓词计算为TRUE的行才包含在结果集中。
INNER JOIN子句将表1的每一行与表2的行进行比较,以查找满足连接谓词的所有行对。 如果连接谓词的计算结果为TRUE,则匹配的表1和表2行的列值将合并为一个新行并包含在结果集中。
上图的黄色部分是两个表里面相同的数据,两个表的连接需要一个主键和一个外键来进行连接。下面通过一个例子来使用一下 inner join 。
例:使用 INNER JOIN 来连接三个表
select * FROm SC A
INNER JOIN Student B ON A.Sid = B.Sid
INNER JOIN Course C ON A.Cid = C.Cid
2.SQL Server 左连接
左连接和内连接的区别在与左连接是返回左表的所有信息并返回右表匹配的行,找不到的行使用null来代替显示。
语法:
Select 字段
From T1
Left join T2 on 连接条件;
对于 T1 表中的每一行,查询将其与 T2 表中的所有行进行比较。
如果一对行导致连接谓词计算为 TRUE ,则将组合这些行中的列值以形成新行,然后将其包含在结果集中。
如果左表( T1 )中的行没有与来自 T2 表的任何匹配行,则查询将左表中的行的列值与来自右表的每个列值的 NULL 组合。
例:查询没有选择课程的学生
select sname ,b.sno
from student a
left join sc b on a.sno = b.sno
3. ON与WHERE子句
在了解左连接后,我们说一下On 与 where 的使用。
在完成左连接后,我们可以在下方写where来编写查询条件,还有一种方法就是将它们连接在一起使用。
例:
select sname ,b.sno
from student a
left join sc b on a.sno = b.sno = and b.sno = null
注:对于 INNER JOIN 子句,如果将 ON 子句中的条件放在 WHERE 子句中,则它在功能上是等效的
4. SQL Server 右连接
RIGHT JOIN 子句组合来自两个或多个表的数据。 RIGHT JOIN 开始从右表中选择数据并与左表中的行匹配。
RIGHT JOIN 返回一个结果集,该结果集包含右表中的所有行,无论是否具有左表中的匹配行。 如果右表中的行没有来自右表的任何匹配行,则结果集中右表的列将使用 NULL 值。
语法:
Select 字段
From T1
right join T2 on 连接条件;
5. SQL Server 交叉连接
CROSS JOIN 连接两个或多个不相关的表。
以下是两个表的SQL Server CROSS JOIN 的语法:
SELECT select_list
FROM T1
CROSS JOIN T2;
或者
SELECT select_list
FROM T1, T2;
CROSS JOIN 将第一个表(T1)中的每一行与第二个表(T2)中的每一行连接起来。 换句话说,交叉连接返回两个表中行的笛卡尔积。
与INNER JOIN或LEFT JOIN不同,交叉连接不会在连接的表之间建立关系。
下面我们通过一个例子来了解一下笛卡尔积。
假设 T1 表包含三行: 1 , 2 和 3 , T2 表包含三行: A , B 和 C 。
CROSS JOIN 从第一个表(T1)获取一行,然后为第二个表(T2)中的每一行创建一个新行。 然后它对第一个表(T1)中的下一行执行相同操作,依此类推。
1-A ,1-B,1-C,2-A ……
在此例中, CROSS JOIN 总共创建了 9 行。 通常,如果第一个表有 n 行,第二个表有 m 行,则交叉连接
将产生 n x m 行。
6. SQL Server自连接
自联接用于将表连接到自身(同一个表)。 它对于查询分层数据或比较同一个表中的行很有用。
由于使用自联接的查询引用同一个表,因此表别名用于为查询中的表分配不同的名称。
例:
select * from sc a
Inner join sc b on a.ano = b.sno
在上面的例子中,a 和 b 是我们给表自定义的一个名称。如果我们不使用表别名,那它会报错,因为在连表时它引用了同一个ID或列名,不使用表别名就无法判断你要查询的是那个表里面的字段。
注:如果在不使用表别名的情况下在查询中多次引用同一个表,则会出现错误。
7.SQL Server全外链接
FULL OUTER JOIN当左表或右表中存在匹配项时,该命令将返回所有行。
语法:
select * from student a
FULL OUTER JOIN sc b on a.sno = b.sno