小谈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
题外话
实践出真知识,大家可以很多尝试,比如一个表中有多条重复记录的,有多个相同的数据等等情况。
小谈SQL表的连接的更多相关文章
- sql 表的连接与查找
A.left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行. SQL: select a.a, a.b, a.c, b.c, b.d, b.f fro ...
- 戈多编程-小谈sql语句的优化分析
在sqlserver大数据查询中,避免不了查询效率减慢,暂且抛弃硬件原因和版本原因,仅从sql语句角度分析. 一. sql 语句性能不达标,主要原因有一下几点: 1. 未建索引,检索导致全表扫描 2. ...
- sql 表的连接 inner join、full join、left join、right join、natural join
一.内连接-inner jion : SELECT * FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2 INN ...
- 3、sql 表的连接
摘自: https://blog.csdn.net/holly2008/article/details/25704471 表连接分为:CROSS JOIN.INNERT JOIN.OUTER JOIN ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 《SQL CookBook 》笔记-第三章-多表查询-连接查询
目录 1 内连接(inner join) 1.1 隐式的内连接 1.2 显式的内连接 2 外连接(outer join) 2.1 左连接(left outer join) 2.2 右连接(right ...
- SQL表连接查询(inner join、full join、left join、right join)
SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...
- SQL表连接查询
SQL表连接查询(inner join.full join.left join.right join) 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和 ...
- sql表连接left join,right join,inner join三者之间的区别
sql表连接left join,right join,inner join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 (以左表数据为基准,不足补为NULL) ...
随机推荐
- PF_RING install in centos7
很多centos7是最小化安装. 这样很多kernel就没有安装全,而且很多开发库也没有. 在安装PF_RING过程中,会缺少很多依赖. 首先安装依赖包: yum -y install numactl ...
- IIS网站本机可以访问但局域网其他机器无法访问 解决方法
在IIS部署网站的时候,发现只有本机可以访问,通过localhost和IP地址都可以,但是当局域网其他机器访问我的网站的时候,无响应. 我的是WIN10的系统 解决方法: 网站所对应的端口必须对外 ...
- 在Notepad++中添加运行快捷键
在Notepad++中有运行的快捷键,想着如果编辑完Python文件能直接运行就好了,于是尝试了一下. 我安装的是win8.1,安装的notepad++将运行快捷键的文件shortcuts.xml,放 ...
- 【swift-总结】函数
swift的函数在swift2中的使用改变了不少 /** *param: personName 參数 *returns: String为返回值 */ func sayHello(personName: ...
- iOS 开发人员不可缺少的75个工具
原文出处: Ben Scheirman 译文出处: Njuxjy 假设你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完毕不同的任务. 软件开发相同如此. 你能够从软件开发人员怎样使用工具 ...
- Codeforces 149 E. Martian Strings
正反两遍扩展KMP,维护公共长度为L时.出如今最左边和最右边的位置. . .. 然后枚举推断... E. Martian Strings time limit per test 2 seconds m ...
- 在应用中更新App版本号
在应用中, 为了提高用户体验, 会提供更新版本号的功能. 那么怎样实现呢? 我写了一个简单的Demo, 说明一下, 须要注意几个细节. 使用了Retrofit和Rx处理网络请求. Github下载地址 ...
- Vue深度学习(6)- 组件
使用组件 在Vue中,可以用 Vue.extend() 创建一个组件构造器: var MyComponent = Vue.extend({ template:'..........' //选项 }) ...
- 基于MATLAB边缘检测算子的实现
基于MATLAB边缘检测算子的实现 作者:lee神 1. 概述 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点.图像属性中的显著变化通常反映了属性的重要 ...
- idea的快捷键
idea的快捷键大全 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+ ...