小谈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) ...
随机推荐
- CCF-201509-3-生成模板系统
问题描述 试题编号: 201509-3 试题名称: 模板生成系统 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同 ...
- 用python的requests第三方模块抓取王者荣耀所有英雄的皮肤
本文使用python的第三方模块requests爬取王者荣耀所有英雄的图片,并将图片按每个英雄为一个目录存入文件夹中,方便用作桌面壁纸 下面时具体的代码,已通过python3.6测试,可以成功运行: ...
- mysql数据库插入数据获取自增主键的三种方式(jdbc PreparedStatement方式、mybatis useGeneratedKeys方式、mybatis selectKey方式)
通常来说对于mysql数据库插入数据获取主键的方法是采用selectKey的方式,特别是当你持久层使用mybatis框架的时候. 本文除此之外介绍其它两种获取主键的方式. 为了方便描述我们先建一张my ...
- 基于跳跃表的 ConcurrentSkipListMap 内部实现(Java 8)
我们知道 HashMap 是一种键值对形式的数据存储容器,但是它有一个缺点是,元素内部无序.由于它内部根据键的 hash 值取模表容量来得到元素的存储位置,所以整体上说 HashMap 是无序的一种容 ...
- 使用milang出错:LookupError: unknown encoding: idna
今天同事安装了milang,结果发现例如以下出错: Traceback (most recent call last): File "F:\vmid.py", line 11, i ...
- 在dotnet core web api中支持CORS(跨域访问)
最近在写的Office add-in开发系列中,其中有一个比较共性的问题就是在add-in的客户端脚本中访问远程服务时,要特别注意跨域访问的问题. 关于CORS的一些基本知识,请参考维基百科的说明:h ...
- chrome调试,打完断点后关于JS的几个控制介绍
打完断点之后,关于JS的几个控制介绍. 快捷键:F8 "逐过程执行",继续执行代码,直到遇到下一个断点. 详细解释: 暂停和开始.当设置了断点之后,js的执行就暂停了,如果我们想要 ...
- 为eclipse离线安装hibernate tools插件
工具/原料 eclipse luna jboss hibernate tools 方法/步骤 下载hibernate tools插件 在eclipse根目录下创建myplugins和l ...
- Intellij IDEA更新SVN没有提示语
更新SVN时IDE下方没有提示语句 解决方法: 点击编辑器右下方的 Event Log 按钮 打开 Show balloons 就可以显示了.
- 小白的Python之路 day2 列表、元组操作
1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names = ['Tom','Jack','Qian'] 通过下标访问列表中 ...