小谈SQL表的连接
简述SQL连接
SQL连接呢,主要分为以下几种内连接,左连接,右连接,全连接(当然还有很多官方的说法,这里就讲讲最常用的)。
既然都叫连接了,那至少要有两个对象,也就是说,至少要有两个表,要怎么样的表才能进行互相连接呢,至少存在说有共同的列的表才能连接到一起。
我们知道,关系型数据库里面的表,其实就是一个Excel,里面有行和列。其实你可以把数据库表连接,想像成两个excel表进行连接,是怎么样的。
从上面的简述:我们知道连接,必须是两个表之间的进行的,然后两个表要进行连接,必须要有相同的列名。一个查询语句呢是可以包含多个连接的(Join可以出现多次)
特别注意
SQL连接还要注意的地方就是,要区分好主表和从表。每个连接都要区分好哪个是主表哪个是从表。啥意思呢?就是你要找到两个表要进行做连接的时候,要根据自己的需要确定一个主表(表A),也就是要确定如果其中一个表的数据和另一个表中的数据匹配不上的时候,应该做什么处理呢。这个处理方式有很多种,(1)你可以选择不要匹配不上的数据了(2)你可以选择要主表的数据(表A)(3)你可以选择要从表的数据。(4)你可以选择同时要主表和从表的数据。根据这些关系呢,就分出了下面几种常见的连接。
(1)你可以选择不要匹配不上的数据(官方说法,SQL内连接)。
从上面这个图中,可以看到内连接的结果,就是公共部分(INNER JOIN),两个表都有的,才会被选出来。
(2) 你可以选择以主表(也就是在左边的这个表为主表,如果从表中没有匹配的数据,则会相应的列会赋值为NULL)。这个就是左连接(Left Join)
(3) 如果你选择主表的时候,以游标这个表为主。这个就是右连接(right Join)
(4)你可以两个表的数据都要(全连接FullJoin).
全连接,就是把两个表的数据都筛选出来了(平时用的比较少)
案例学习
在我们平时用的最多的是,内连接(Join),和左连接(Left Join),右连接(Right Join)。
下面分别来举例学习这几个连接。
开始前准备,先创建两个表Orders(OrderId,CustomerId,OrderDate),Customers(CustomerId,CustomerName,ContactName,Country) 和插入测试数据。
CREATE TABLE Orders ( OrderId INT IDENTITY(1, 1) , CustomerId INT , OrderDate DATETIME ); CREATE TABLE Customers ( CustomerId INT , CustomerName NVARCHAR(50) , ContactName NVARCHAR(50) , Country NVARCHAR(50) ); ---向Orders插入数据 INSERT INTO dbo.Orders ( CustomerId, OrderDate ) VALUES ( 2, -- CustomerId - int GETDATE() -- OrderDate - datetime ); INSERT INTO dbo.Orders ( CustomerId, OrderDate ) VALUES ( 3, -- CustomerId - int GETDATE() -- OrderDate - datetime ); INSERT INTO dbo.Orders ( CustomerId, OrderDate ) VALUES ( 5, -- CustomerId - int GETDATE() -- OrderDate - datetime ); --向Customers插入数据 INSERT INTO dbo.Customers ( CustomerId , CustomerName , ContactName , Country ) VALUES ( 2 , -- CustomerId - int N'aaaa' , -- CustomerName - nvarchar(50) N'aaa' , -- ContactName - nvarchar(50) N'aaa' -- Country - nvarchar(50) ); INSERT INTO dbo.Customers ( CustomerId , CustomerName , ContactName , Country ) VALUES ( 3 , -- CustomerId - int N'bbb' , -- CustomerName - nvarchar(50) N'bbb' , -- ContactName - nvarchar(50) N'bbb' -- Country - nvarchar(50) ); INSERT INTO dbo.Customers ( CustomerId , CustomerName , ContactName , Country ) VALUES ( 4 , -- CustomerId - int N'ccc' , -- CustomerName - nvarchar(50) N'ccc' , -- ContactName - nvarchar(50) N'ccc' -- Country - nvarchar(50) );
Orders表的数据
Customer表的数据
很明显,这两个表是通过CustomerId进行关联的,上面是两个表中的数据,看到这里应该停一下,想想按照我们刚刚说的两个表连接那四种情况,对应的结果应该是怎样的。
---内连接的结果 SELECT * FROM dbo.Orders a JOIN dbo.Customers b ON a.CustomerId=b.CustomerId --左连接 SELECT * FROM dbo.Orders a left JOIN dbo.Customers b ON a.CustomerId=b.CustomerId --右连接 SELECT * FROM dbo.Orders a RIGHT JOIN dbo.Customers b ON a.CustomerId=b.CustomerId --全连接 SELECT * FROM dbo.Orders a FULL JOIN dbo.Customers b ON a.CustomerId=b.CustomerId
题外话
实践出真知识,大家可以很多尝试,比如一个表中有多条重复记录的,有多个相同的数据等等情况。