小谈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) ...
随机推荐
- Scala入门系列(九):函数式编程
引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...
- 【NOI2005】维护数列
https://daniu.luogu.org/problem/show?pid=2042 一道伸展树维护数列的很悲伤的题目,共要维护两个标记和两个数列信息,为了维护MAX-SUM还要维护从左端开始的 ...
- 数组a和&a区别
假设我们定义一个数组char a[16]; 那么a与&a分别代表什么呢?它们完全一样吗? a其实代表的是数组中首元素的地址,即a[0]的地址,&a代表的是整个数组的起始地址.我们做个测 ...
- 从源代码到Runtime发生的重排序
源代码和Runtime时执行的代码很可能不一样,这是因为编译器.处理器常常会为了追求性能对改变执行顺序.然而改变顺序执行很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时. 从源 ...
- java集合框架07——Map架构与源代码分析
前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...
- javaWeb中URLEncoder.encode空格问题
近期开发一个在线坐席的功能.发现推送的消息中空格变成了+ .查询发现URLEncoder.encode的问题.曾经用的时候也没注意过,解决的方法网上是对URLEncoder.encode的之后的字符串 ...
- httpfs安装指南
httpfs安装指南 安装环境 Linux maven3 jdk1.6 本地的maven源(有些依赖的jar包Cloudera已不再维护) 1.下载httfs源代码包 https://github.c ...
- Python3简单的输入输出及内置函数查看
工作之余和女朋友一起学Python3,代码都是她敲的,有点辣眼睛,仅做参考. 1.题目:输入"姓名",输出"你好,姓名" 有关安装和打开Python shell ...
- Shell编程实践之批量安装JDK
实验环境 只有两台机子,一台虚拟机192.168.1.200,另外一台物理机192.168.1.201. 目标 执行一个shell脚本,给这两台机子自动安装jdk. 实验步骤 1.自动设置ssh免密码 ...
- div元素宽度不定的情况下如何居中显示
最近由于工作的原因碰到一个问题,就是在一个弹窗宽度不定的情况下还能是该弹窗居中显示,思考许久未找到合适办法,于是在网上找到一些办法在此总结记录下来方便以后的学习. 方法一:兼容IE67 <div ...