简述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表的连接的更多相关文章

  1. sql 表的连接与查找

    A.left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行. SQL: select a.a, a.b, a.c, b.c, b.d, b.f fro ...

  2. 戈多编程-小谈sql语句的优化分析

    在sqlserver大数据查询中,避免不了查询效率减慢,暂且抛弃硬件原因和版本原因,仅从sql语句角度分析. 一. sql 语句性能不达标,主要原因有一下几点: 1. 未建索引,检索导致全表扫描 2. ...

  3. 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 ...

  4. 3、sql 表的连接

    摘自: https://blog.csdn.net/holly2008/article/details/25704471 表连接分为:CROSS JOIN.INNERT JOIN.OUTER JOIN ...

  5. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  6. 《SQL CookBook 》笔记-第三章-多表查询-连接查询

    目录 1 内连接(inner join) 1.1 隐式的内连接 1.2 显式的内连接 2 外连接(outer join) 2.1 左连接(left outer join) 2.2 右连接(right ...

  7. SQL表连接查询(inner join、full join、left join、right join)

    SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...

  8. SQL表连接查询

    SQL表连接查询(inner join.full join.left join.right join) 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和 ...

  9. sql表连接left join,right join,inner join三者之间的区别

    sql表连接left join,right join,inner join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 (以左表数据为基准,不足补为NULL) ...

随机推荐

  1. HDU 1698 Just a Hook 线段树+lazy-target 区间刷新

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. Spring之bean二生命周期

    上一博客主要学习了下bean的配置.注入.自定义属性编辑器,今天来熟悉bean的生命周期.在开发中生命周期是一个很常见的名词,基本每种编程语言都能找到与它关联的.关于bean的生命周期我在网上也找了好 ...

  3. OBS源码解析(2)run_program函数

    static int run_program(fstream &logFile, int argc, char *argv[]){ /*初始化和读取profile相关信息*/ int ret ...

  4. Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长

    Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com ...

  5. Django使用遇到的各种问题及解决方法

    从Django的 搭建开始,遇到的问题就不断,网站还没有发布,就出错了,我查了好多资料,啃得了不少东西,也没有找到合适的方法,终于没办法了,自己硬着头皮往下读,终于解决了这些问题,下面分享给大家. 代 ...

  6. Python笔记·第六章——字典 (dict) 的增删改查及其他方法

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...

  7. (三)—Linux文件传输与mysql数据库安装

    文件传输工具使用    为了速成,关于linux系统的学习都先放一放,用到哪个知识点就查哪个,这里想在linux下装一些服务练练手,最先想到的就是装个mysql数据库试试. 因为我用的是虚拟机下的li ...

  8. memcached subList序列化问题

    某个业务场景需要将list超过10个元素时截取前10个然后再丢memcached缓存,因此写了这么一行代码 if(list.size()>10){ list=list.subList(0, 10 ...

  9. db2 update 异常

    报错: -错误的sql语句:update Persons SET FirstName = 'Fred' WHERE id_P = 1com.ibm.db2.jcc.am.SqlException: O ...

  10. Java中enum的学习总结

    一.通常的定义常量的方法 public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; } ...