小谈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) ...
随机推荐
- Elasticsearch的基友Logstash
Logstash 是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理. 一.原理 Input 可以从文件中.存储中.数据库中抽取数据,Input有两 ...
- Ubuntu 环境 TensorFlow (最新版1.4) 源码编译、安装
Ubuntu 环境 TensorFlow 源码编译安装 基于(Ubuntu 14.04LTS/Ubuntu 16.04LTS/) 一.编译环境 1) 安装 pip sudo apt-get insta ...
- UWP 常用文件夹
①KnownFolders KnownFolders.PicturesLibrary 等等列举 ②ApplicationData.Current ApplicationData.Current.Loc ...
- django模板语法之include
假如我们有以下模板index.html,代码为: <!DOCTYPE html> <html lang="en"> <head> <met ...
- 《RabbitMQ Tutorial》译文 第 4 章 路由
原文来自 RabbitMQ 英文官网的教程(4.Routing),其示例代码采用了 .NET C# 语言. In the previous tutorial we built a simple log ...
- Android自定义processor实现bindView功能
一.简介 在现阶段的Android开发中,注解越来越流行起来,比如ButterKnife,Retrofit,Dragger,EventBus等等都选择使用注解来配置.按照处理时期,注解又分为两种类型, ...
- Nginx事件处理中的connection和read、write事件的关联
/********************************************************************* * Author : Samson * Date ...
- js清除cookie有时无法清除
最近写页面遇到一个问题,退出的时候需要清除cookie,但是刚开始一直清除不掉,代码如下: //清除函数 function delCookie(name) { var date= new Date() ...
- 十三、 Spring Boot 启动加载数据 CommandLineRunner
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...
- mysql 常用sql语句 一
创建数据库 create database if not exists wsp_test default charset utf8 collate utf8_general_ci 使用数据库 use ...