SQL- join多表关联

article/2025/10/16 0:31:44

一、SQL 连接(JOIN)

1、笛卡尔积

(1)当多张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是多张表条数的乘积

如A表15条(行)数据,B表20条(行)数据,结果查询两张表时,会产生 15 * 20 = 300条(行)数据

select empname,deptname from emp, dept;

(2)避免笛卡尔积现象

select empname,deptname from emp, deptwhereemp.deptno = dept.deptno;// 或者select e.empname,d.deptname from emp e, dept dwheree.deptno = d.deptno; //SQL92语法

最终得出结果会减少,但是查询次数依然是两张表行数的乘积

因此:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数

2、SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段(跨表查询

SQL92:1992年的SQL语法
SQL99:1999年的SQL语法

从一张表中单独查询,称为单表查询

下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法

3、SQL JOIN 类型

(1)INNER JOIN:内连接

【1】等值连接,返回两个表中连接字段相等的行(条件是等量关系)

【2】非等值连接,条件不是一个等量关系

【3】自连接,同一张表看成多张表

注:

        INNER 可以省略

        两张表没有主次关系;平等

(2)OUTER JOIN :外连接

LEFT (OUTER) JOIN:左(外)连接,即使右表中没有匹配,也从左表返回所有的行(将join关键字左边的表看成主表,主要是为了将左表的数据全部查询出来,捎带着关联查询右边的表)

RIGHT (OUTER) JOIN:右(外)连接,即使左表中没有匹配,也从右表返回所有的行(将join关键字右边的表看成主表,主要是为了将右表的数据全部查询出来,捎带着关联查询左边的表)

FULL (OUTER) JOIN :全(外)连接

外连接,只要其中一个表中存在匹配,则返回;即返回两个表中的行:left join + right join

注:

        OUTER 可以省略

        在外连接当中,两张表连接,产生了主次关系

(3)交叉连接

CROSS JOIN: 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数

4、SQL INNER JOIN

INNER JOIN 关键字在表中存在至少一个匹配时返回行

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;或者SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
INNER JOIN 与 JOIN 是相同的

(1)等值连接

SQL92语法:select e.ename,d.dnamefromemp e, dept dwheree.deptno = d.deptno;
//sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。SQL99语法:select e.ename,d.dnamefromemp ejoindept done.deptno = d.deptno;//inner可以省略(带着inner可读性更好!!!一眼就能看出来是内连接)select e.ename,d.dnamefromemp einner joindept done.deptno = d.deptno; // 条件是等量关系,所以被称为等值连接。
//sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where

 inner可以省略,带着inner可读性更好

sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面

sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where

(2)非等值连接

select e.ename, e.sal, s.grade
fromemp e
joinsalgrade s
one.sal between s.losal and s.hisal; // 条件不是一个等量关系,称为非等值连接。select e.ename, e.sal, s.grade
fromemp e
inner joinsalgrade s
one.sal between s.losal and s.hisal;

(3)自连接

一张表看成两张表

select a.ename as '员工名', b.ename as '领导名'
fromemp a
joinemp b
ona.mgr = b.empno; //员工的领导编号 = 领导的员工编号

 INNER JOIN 与 JOIN 是相同的

5、SQL LEFT JOIN

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL

将join关键字左边的表看成主表,主要是为了将左表的数据全部查询出来,捎带着关联查询右边的表

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;或SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN

如下: 

select e.ename,d.dname
fromdept d 
left (outer) join emp e
one.deptno = d.deptno;

在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN

关键字 on 
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户

在使用 left jion 时,on 和 where 条件的区别如下:

(1) on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
(2)where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

假设有两张表:

 两条 SQL:

select * from tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'select * from tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')

 以上结果的关键原因就是 left join、right join、full join 的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。 而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

【6】SQL RIGHT JOIN

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL

将join关键字右边的表看成主表,主要是为了将右表的数据全部查询出来,捎带着关联查询左边的表

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;或SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN

如下: 

select e.ename,d.dname
fromemp e 
right (outer) join dept d
one.deptno = d.deptno;

在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN

【7】SQL FULL OUTER JOIN

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行

FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果(MySQL中不支持 FULL OUTER JOIN)

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

总结如下:

A inner join B 取交集。

A left join B 取 A 全部,B 没有对应的值为 null。

A right join B 取 B 全部 A 没有对应的值为 null。

A full outer join B 取并集,彼此没有对应的值为 null

如: "user" 表中的 "deptId" 列指向 "dept" 表中的字段 "id";上面这两个表是通过 "deptId" 列联系起来的

select u.id,d.id,d.name,d.number 
from user u left join dept d 
on u.deptId = d.id;或select u.id,u.name,d.id,d.name,d.number 
from user u inner join dept d 
on u.deptId = d.id;

查询结果相同


http://chatgpt.dhexx.cn/article/lJHKftp7.shtml

相关文章

SQL语言多表关联查询

新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。&…

[转载]静息态fMRI、DTI、VBM

[转载]静息态fMRI、DTI、VBM (2014-06-19 19:00:15) 转载▼ 标签: 转载 分类: fMRI-EEG 原文地址:静息态fMRI、DTI、VBM作者:426l 一、 简介 1、静息态fMRI数据处理学习内容 BOLD-fMRI技术自1990年发明至今,已经成…

用FSL进行VBM统计分析

用FSL进行VBM统计分析 总体步骤概览1.准备数据1.1 T1数据格式1.2 Template_list查看数据 2.剥头皮:fslvbm_1_bet3.数据分割生成模板:fslvbm_2_template4.后处理(标准化、调制、平滑):fslvbm_3_proc5.统计检验5.2查看结…

[spm操作] VBM分析中,modulation的作用

本帖作为 《用Matlab和SPM批量处理被试的经验总结》 的一部分 目录贴请见 http://home.52brain.com/forum.ph ... 1&extra#pid158525 在VBM分析中,通常都有一个modulation的选项,有些滴友对这个步骤的作用有点不太理解。 我先举一个例子&#xff…

不同的工具包对Voxel-based morphometry (VBM)计算结果的影响

​《本文同步发布于“脑之说”微信公众号,欢迎搜索关注~~》 前期大量的MRI研究已经表明,精神分裂患者很多脑区的局部灰质体积(regional grey matter volume)出现异常变化,但是这些研究的结果似乎并不一致。而这种结果…

如何提取差异脑区的灰质体积与临床量表算相关?——基于体素的形态学方法(VBM)

基于体素的形态学方法(VBM)是分析大脑解剖学(结构)差异最常用方法之一, 其通过给大脑volume逐体素打标签(分类)的方式来进行组织分割,过程高度自动化,比传统的基于ROI先验假设的分析方式得到的结果,更加具有稳定性和可重复性。VBM可以定量地测量出脑组织中各组织成分的…

VBM后的双样本t检验

上一篇文章写到做完了VBM,做完后因为数据一般都是患者组和HC组,这两个组之间需要进行比较,那么我们就要进行双样本t检验。 这里介绍双样本t检验的做法。 依然使用的是SPM-fMRI。 1.第一步是选择Specify 2nd-level 打开以后我们可以看到这个界…

VBM后的配对t检验以及xjview使用

之前写了VBM后的双样本t检验,再记录一下配对t检验。 配对t检验和双样本t检验的过程基本一致。包括以下三个步骤。 第一步输入两组被试时,应该成对输入,共有几个被试就有几个pair。 但是这里我在做的过程中没有加协变量,不知道会不…

Visual Basic

目录 一,Visual Basic 二,控制台程序 三,可视化程序 1,IDE 2,实例——加法计算器 一,Visual Basic Visual Basic是可视化的Basic,简称VB VB是第一个可视化编程语言。 二,控制…

VBM法MRI图像处理——记第一次使用cat12

1.环境 MATLAB 2015b SPM12 CAT12 2.SPM部分 命令行输入 spm 出现 以及 点击Toolbox 出现 3.CAT部分 点击上图 设置请根据自己需求 多分割了一种surface皮层数据,当做皮层统计分析SBM时需要提取surface皮层指标时会用到。 我本意只是获得灰质、白质的体积…

VBM_DARTEL算法对灰质变化的计算

根据一些文献得知,VBM目前比较新的算法是DARTEL算法,这一算法被集成在SPM里,这里记录一下做法。 VBM是对T1像进行分割得到灰质等。所以要有结构T1加权像数据。 整个流程应该是这样: 1.手动调整前联合(AC) …

基于cat12搞定VBM的ROI分析——vertex水平和ROI水平的双样本T检验

前言 本来上周要更新此篇的,但由于本身有问题没有解决清楚,再加上导师给了数据处理的任务下来了,两下耽搁,就等到现在了。上回说到,做了VBM和SBM的指标提取及双样本T检验的统计分析,那接下来我们还可以做什…

基于cat12和SPM12进行VBMSBM数据分析笔记1——数据预处理

前言 今年是小编步入研究生生活的第一年,研究方向待定,但主要以磁共振成像为主,以后会不断地总结这方面的知识,涉及MRI,数据分析基础方法理论,软件操作教程,文献阅读笔记总结等等,用…

基于cat12和SPM12进行大脑VBM数据分析笔记2——统计分析

小白一顿操作猛如虎——拿下VBM的双样本t检验 前言 培训的deadline到了,小编需要交作业了,所以就在此先把笔记记下来。作业需要提交一个报告,but这个报告我应该如何写呢,培训总结?哎,现在还是不清楚&…

磁共振影像分析之: 基于FSL的VBM分析(1)

磁共振影像分析之: 基于FSL的VBM分析(1) 基本概念 在开始之前, 先给出几个基本概念: 磁共振成像 磁共振成像(Magnetic Resonance Imaging, MRI)是一种基于核磁共振原理和射频波探测组织结构和功能的医学影像技术. 值得一提的是, 磁共振成像技术没有辐射, 对人体没有影响. …

MRI图像处理:VBM原理和步骤

VBM是voxel-based morphometry的缩写, 是对被试之间灰质体素粒度统计分析。VBM可以得到人群中volume和gyrification的不同,对clinical score进行相关性分析,VBM不仅仅可以用于结构数据(T1),还可以用在fmri和…

MRI脑影像分析从哲学到技术:一文搞懂VBM预处理基本原理(全网最详细解析)

基于体素的形态学方法(voxel-based morphometry, VBM),是分析大脑解剖学(结构)差异最常用方法之一。 其通过给大脑volume逐体素打标签(分类)的方式来进行组织分割(segmentation&…

LabVIEW程序测试

LabVIEW程序测试 工程师经常不太关注测试,将更多时间用于其他开发。通过一定程度的测试,可以保证节省时间。 开发人员必须清楚地了解对测试的期望程度。此外,还必须标准化测试方法并跟踪测试结果。在开发需求和设计规范时,还要制…

史上最详细的小程序测试用例模板,以后再也不怕测试用例不会写了

目录 1. 文档介绍 1.1 文档目的 1.2 文档范围 1.3 读者对象 1.4 术语与缩写解释 2. 功能测试用例 2.1 被测试对象的介绍 2.2 测试范围与目的 2.3 测试环境与测试辅助工具的描述 2.4 功能测试用例 附录:评审意见 1. 文档介绍 1.1 文档目的 设计测试用例…