首页 > 数据库 >7.7 SQL Server连接查询

7.7 SQL Server连接查询

时间:2023-01-29 10:55:31浏览次数:52  
标签:name hr Server 7.7 SQL fullname 联接 id

SQL Server 连接查询

目录

简介

在关系数据库中,数据分布在多个逻辑表中。要获得完整的有意义的数据集,需要使用联接从这些表中查询数据。SQL Server支持多种联接,包括内部联接、左联接、右联接、完全外部联接和交叉联接。每个联接类型指定SQL Server如何使用一个表中的数据来选择另一个表的行。

先创建示例表进行演示。

创建示例表

首先,创建一个名为hr的新schema(架构):

CREATE SCHEMA hr;
GO

然后在hrschema中创建两张表分别是candidates(候选人)、employees(员工):

CREATE TABLE hr.candidates(
    id INT PRIMARY KEY IDENTITY,
    fullname VARCHAR(100) NOT NULL
);

CREATE TABLE hr.employees(
    id INT PRIMARY KEY IDENTITY,
    fullname VARCHAR(100) NOT NULL
);

两张表分别插入几行数据:

INSERT INTO 
    hr.candidates(fullname)
VALUES
    ('John Doe'),
    ('Lily Bush'),
    ('Peter Drucker'),
    ('Jane Doe');


INSERT INTO 
    hr.employees(fullname)
VALUES
    ('John Doe'),
    ('Jane Doe'),
    ('Michael Scott'),
    ('Jack Sparrow');

我们将候选人表称为左表,将员工表称为右表。

SQL Server内连接

内联接生成一个数据集,其中包括左表中的行,与右表中相匹配的行

下面示例连接candidatesemployees表,通过条件candidates.fullname=employees.fullname
也就是从candidates表中获取行,这些行的fullnameemployees表的fullname列具有相同值的相应行:

SELECT  
    c.id candidate_id,
    c.fullname candidate_name,
    e.id employee_id,
    e.fullname employee_name
FROM 
    hr.candidates c
    INNER JOIN hr.employees e 
        ON e.fullname = c.fullname;

下面的Venn图说明了两个结果集的内部联接的结果:

SQL Server左联接

左联接选择数据从左表开始,并在右表中匹配行。左联接返回左表中的所有行和右表中的匹配行。如果左表中的一行与右表中的行不匹配,则右表的列将为空。

左联(Left Join)接也称为左外联接(Left Outer Join)。Outer关键字可省略。

下面的语句使用左联接将候选人表与员工表联接起来:

SELECT  
	c.id candidate_id,
	c.fullname candidate_name,
	e.id employee_id,
	e.fullname employee_name
FROM 
	hr.candidates c
	LEFT JOIN hr.employees e 
		ON e.fullname = c.fullname;

下面的Venn图说明了两个结果集左连接的结果:

要获取仅在左表中可用但在右表中不可用的行(即左表中与右表没匹配上的行),可以在上面的查询中添加WHERE子句:

SELECT  
    c.id candidate_id,
    c.fullname candidate_name,
    e.id employee_id,
    e.fullname employee_name
FROM 
    hr.candidates c
    LEFT JOIN hr.employees e 
        ON e.fullname = c.fullname
WHERE 
    e.id IS NULL;


下面的Venn图说明了左联接的结果,该联接选择仅在左表中可用的行:

SQL Server右连接

右联接或右外联接选择从右表开始的数据。它是左联接的反向版本。

右联接返回一个结果集,其中包含右表中的所有行和左表中的匹配行。如果右表中的行在左表中没有匹配的行,则左表中的所有列都将为Null。

使用右联接查询候选人表与员工表:

SELECT  
    c.id candidate_id,
    c.fullname candidate_name,
    e.id employee_id,
    e.fullname employee_name
FROM 
    hr.candidates c
    RIGHT JOIN hr.employees e 
        ON e.fullname = c.fullname;

注意,右表(employees)中的所有行都包含在结果集中。

Venn图说明了两个结果集的右连接:

类似地,通过向上述查询添加WHERE子句,可以获得仅在右表中可用的行(右表中与左表没匹配上的行),如下所示:

SELECT  
    c.id candidate_id,
    c.fullname candidate_name,
    e.id employee_id,
    e.fullname employee_name
FROM 
    hr.candidates c
    RIGHT JOIN hr.employees e 
        ON e.fullname = c.fullname
WHERE
    c.id IS NULL;

Venn图:

SQL Server全联接

全外联接或全联接返回一个结果集,该结果集包含左表和右表中的所有行,以及两侧的匹配行(如果可用)。如果不匹配,则缺少的一侧将为空值。

在候选人表和员工表之间做全联接查询:

SELECT  
    c.id candidate_id,
    c.fullname candidate_name,
    e.id employee_id,
    e.fullname employee_name
FROM 
    hr.candidates c
    FULL JOIN hr.employees e 
        ON e.fullname = c.fullname;

全(外)联接的Venn图:

要选择左表或右表中存在的行,可以通过添加WHERE子句排除两个表共有的行,如以下查询所示:

SELECT  
    c.id candidate_id,
    c.fullname candidate_name,
    e.id employee_id,
    e.fullname employee_name
FROM 
    hr.candidates c
    FULL JOIN hr.employees e 
        ON e.fullname = c.fullname
WHERE
    c.id IS NULL OR
    e.id IS NULL;

Venn图:

标签:name,hr,Server,7.7,SQL,fullname,联接,id
From: https://www.cnblogs.com/michaelshen/p/17072016.html

相关文章

  • SQLSERVER 事务日志的 LSN 到底是什么?
    SQLSERVER事务日志的LSN到底是什么? 一:背景1.讲故事大家都知道数据库应用程序 它天生需要围绕着数据文件打转,诸如包含数据的 .mdf,事务日志的 .ldf,很多时候深......
  • docker安装Mysql5.7
    Linuxdocker安装Mysql1.docker镜像地址配置vim/etc/docker/daemon.json2.加入配置信息{"registry-mirrors":["https://wghlmi3i.mirror.aliyuncs.com","https://d......
  • MySQL基础:通过SQL对数据库进行CRUD
    MySQL基础今日目标:能通过SQL对数据库进行CRUD文章目录MySQL基础一、MySQL数据模型二、SQL概述2.1SQL简介2.2通用语法2.3SQL分类三、DDL:操作数据库3.1查询3.2创建数据......
  • PaddlePaddle与Serverless架构结合
    PaddlePaddle介绍PaddlePaddle(飞桨)以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发、功能完备、开源的产业级深度学习平台,集深度学习核心训练和推理框架、......
  • 文本情感分析在Serverless架构下的应用
    文本情感分析是指对包含人们观点、喜好、情感等的主观性文本进行检测。该领域的发展和快速起步得益于社交媒体。越来越多的用户从单纯地获取互联网信息向创造互联网信息转变......
  • PyTorch与Serverless架构结合
    PyTorch介绍2017年1月,FAIR(FacebookAIResearch)发布了PyTorch。其标志如下所示。PyTorch是在Torch基础上用Python语言重新打造的一款深度学习框架,Torch是用Lua语言打造的机......
  • scikit-learn与Serverless架构结合
    1scikit-learn介绍scikit-learn是一个面向Python的第三方提供的非常强力的机器学习库,简称sklearn,标志如下所示。它建立在NumPy、SciPy和Matplotlib上,包含从数据预处理到训......
  • MySql IN 和 EXISTS 的区别
    一、in关键字确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比......
  • MySql多字段大表的优化方法
    主从同步+读写分离:这个表在有设备条件的情况下,读写分离,这样能减少很多压力,而且数据稳定性也能提高纵向分表:根据原则,每个表最多不要超过5个索引,纵向拆分字段,将部分......
  • MySQL事务Read Committed隔离级别的数据可见性
    预先创建一张表test,表中只有一个字段state。createtabletest(stateintnotnull)engine=InnoDBcharset=utf8mb4;在两个终端中分别开启两个事务:事务的隔离......