Sql 中内连接、外连接、全连接、交叉连接的区别

article/2025/9/22 5:34:10

外连接(out join)

外连接分为外左连接(left outer join)和外右连接(right outer join)

注释:left outer join 与 left join 等价,    一般写成left join 
           right outer join 与 right join等价,一般写成right join

左连接,取左边的表的全部,右边的表按条件,符合的显示,不符合则显示null

举例:select <select list> from A left join B on A.id=B.id

 

右连接:取右边的表的全部,左边的表按条件,符合的显示,不符合则显示null

举例:select <select list> from A right join B on A.id=B.id

 

 

内连接(inner join)

内连接:也称为等值连接,返回两张表都满足条件的部分

注释:inner join 就等于 join 

SQL INNER JOIN

 

交叉连接(CROSS JOIN)

交叉连接:返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积

首先,先简单解释一下笛卡尔积:笛卡尔乘积是指在数学中,两个集合XY的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员

举例:

现在,我们有两个集合A和B。

A = {0,1}     B = {2,3,4}

集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。

从以上的数据分析我们可以得出以下两点结论:

1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;

2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;

 

交叉连接有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。
例如:下面的语句1和语句2的结果是相同的。

语句1:隐式的交叉连接,没有CROSS JOIN。
SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME
FROM ORDERS O , CUSTOMERS C
WHERE O.ID=1;

语句2:显式的交叉连接,使用CROSS JOIN。
SELECT O.ID,O.ORDER_NUMBER,C.ID,
C.NAME
FROM ORDERS O CROSS JOIN CUSTOMERS C
WHERE O.ID=1;
 

 

内连接和where的区别:

数据库表连接数据行匹配时所遵循的算法就是以上提到的笛卡尔积,表与表之间的连接可以看成是在做乘法运算。

比如现在数据库中有两张表,student表和 student_subject表,如下所示:

  

我们执行以下的sql语句,只是纯粹的进行表连接。

SELECT * from student JOIN student_subject;
SELECT * from student_subject JOIN student;

看一下执行结果:

  

     表1.0                            表1.1

从执行结果上来看,结果符合我们以上提出的两点结论(红线标注部分);

以第一条sql语句为例我们来看一下他的执行流程,

1,from语句把student表 和 student_subject表从数据库文件加载到内存中。

2,join语句相当于对两张表做了乘法运算,把student表中的每一行记录按照顺序和student_subject表中记录依次匹配。

3,匹配完成后,我们得到了一张有 (student中记录数 × student_subject表中记录数)条的临时表。 在内存中形成的临时表如表1.0所示。我们又把内存中表1.0所示的表称为‘笛卡尔积表’。  

再看一下sql中主要关键字的执行顺序:

from  
on  
join  
where  
group by  
having  
select  
distinct  
union  
order by  

 我们看到on是在join和where前面的

       如果两张表的数据量都比较大的话,那样就会占用很大的内存空间这显然是不合理的。所以,我们在进行表连接查询的时候一般都会使用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,也就是说两张表数据行之间进行匹配的时候,会先判断数据行是否符合ON语句后面的条件,再决定是否JOIN。

  因此,有一个显而易见的SQL优化的方案是,当两张表的数据量比较大,又需要连接查询时,应该使用 FROM table1 JOIN table2 ON xxx的语法,避免使用 FROM table1,table2 WHERE xxx 的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,增加了内存的开销。

 

全连接(Full join)

全外连接是在结果中除了显示满足连接的条件的行外,还显示了join两侧表中所有满足检索条件的行

 


http://chatgpt.dhexx.cn/article/9LvnDvoQ.shtml

相关文章

谈谈你对计算机的发展,结合您目前对计算机的认识,请您谈谈对计算机发展趋势的看法。...

计算机从出现至今&#xff0c;经历了机器语言、程序语言、简单操作系统和Linux、Macos、BSD、Windows等现代操作系统四代&#xff0c;运行速度也得到了极大的提升&#xff0c;第四代计算机的运算速度已经达到几十亿次每秒。 计算机也由原来的仅供军事科研使用发展到人人拥有&am…

对计算机科学与技术专业课程的认识,计算机科学与技术专业课程

计算机科学与技术专业课程计算机科学与技术专业课程 二、课程简介 TOP 1.数字逻辑电路: “数字逻辑”是计算机专业本科生的一门主要课程,具有自身的理论体系和很强的实践性。它是计算机组成原理的主要先导课程之一,是计算机应用专业关于计算机系统结构方面的主干课程之一。…

计算机网络技术的专业认识,计算机网络技术课程学习后的自我认识

计算机网络技术课程学习后的自我认识 随着计算机、多媒体、现代通讯网络为代表的信息技术的迅猛发展&#xff0c;信息技术已经渗透到了教育领域&#xff0c;在教育领域中引起了一场深刻的变化。小编是YJBYS小编整理的计算机网络技术课程学习后的自我认识&#xff0c;欢迎阅读 信…

计算机专业认识和规划,计算机科学与技术专业认识与规划

计算机科学与技术专业认识与规划 专业认识与规划专业认识与规划对于这个专业的学生&#xff0c;它要求学生的英语水平&#xff0c;数学水平很高。最主要的是&#xff0c;它的专业课程很多&#xff0c;很复杂&#xff0c;很累人&#xff0c;它需要你付出很多的努力&#xff0c;…

对计算机网络的认识论文800,对计算机的认识论文

为毕业生写对计算机的认识论文提供对计算机的认识论文范文参考,涵盖硕士、大学本科毕业论文范文和职称论文范文&#xff0c;包括论文选题、开题报告、文献综述、任务书、参考文献等&#xff0c;是优秀免费对计算机的认识论文网站。 对计算机软件属性和保护方式的认识 摘要&…

JS取整,取余

1、取整 // 丢弃小数部分,保留整数部分 parseInt(5/2)  // 2 2.向上取整 // 向上取整,有小数就整数部分加1 Math.ceil(5/2)  // 3 3.向下取整 // 向下取整,丢弃小数部分 Math.floor(5/2)  // 2 4四舍五入 // 四舍五入 Math.round(5/2)  // 3 5 取余 // 取余 6…

JS中的求余和求模

在JS中有两个操作符&#xff0c;求余和求模&#xff0c;它们本质上并没有区别&#xff0c;但仍有一些差异&#xff0c;今天就给大家区分一下它们 求余 符号&#xff1a;% 写法&#xff1a;a % b 求余&#xff1a;a % b &#xff0c;表示为a rem b&#xff0c;相当于 a - n * …

js数据取整,取余,保留小数,数据脱敏等的一些处理方式

一个经典的解决四舍五入问题后js保留两位小数的方法&#xff1a; 1.四舍五入保留2位小数&#xff08;若第二位小数为0&#xff0c;则保留一位小数&#xff09; function keepTwoDecimal(num) {var result parseFloat(num);if (isNaN(result)) {alert(传递参数错误&#xff0…

js中小数计算时精度问题

js中的number为双精度浮点型&#xff0c;计算时需要先进行进制转换&#xff0c;将十进制换成二进制&#xff0c;而进制转换时&#xff0c;小数就有可能出现精度问题了&#xff0c;原因如下 整数转二进制&#xff1a;除二取余法&#xff08;没有问题&#xff09; 4 除以 2 取余…

JavaScript数学运算(取整,取余和取模)

来源 | https://www.fly63.com 这篇文章主要介绍js取整、取余和取模的实现方法和它们之间的区别&#xff0c;以及Math对象的常用方法函数介绍&#xff0c;有需要的朋友可以参考下。 取整 在项目开发过程中&#xff0c;有时要对小数取整操作&#xff0c;JavaScript也提供了4种方…

JavaScript数字取整、取余总结

一、取整&#xff1a; 取整 //丢弃小数部分&#xff0c;保留整数部分 parseInt(85.5)//85向上取整 //向上取整&#xff0c;有余数或者小数&#xff0c;整数位1 Math.ceil(7/3) //3 Math.ceil(85.6) //86 Math.ceil(72.1) //73向下取整 //向下取整&#xff0c;有余数或者小数…

QuickSort 拿下!

剑指 Offer 45. 把数组排成最小的数   输入一个非负整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 由于这一题的解题思路是&#xff1a;首先将数组转换为字符数组&#xff0c;然后根据规则对其进行排序&#xff…

经典算法之快速排序(QuickSort)

​ 活动地址&#xff1a;CSDN21天学习挑战赛 目录 快速排序算法原理图解Java代码实现 算法分析 快速排序 通过一趟排序将待排元素分成独立的两部分&#xff0c;其中一部分为比基准数小的元素&#xff0c;另一部分则是比基准数大的元素。然后对这两部分元素再按照前面的算法进行…

QuickSort(快速排序)——C语言实现

前言&#xff1a; 快速排序可真是太经典啦&#xff01;当然&#xff0c;我的复现并没有实现调用一个排序参考函数来实现对不同类型数据进行排序这一功能。 快速排序其中的一大重要思想就是分而治之&#xff0c;采取不断二分的方式进行排序&#xff0c;时间复杂度O&#xff08;n…

快速排序算法Quicksort()

快速排序的思想是用数组的首元素作为标准将A划分成前后两部分&#xff0c;比首元素小的元素构成数组的前部分&#xff0c;比首元素大的元素构成数组的后部分&#xff0c;这两部分构成两个新的子问题&#xff0c;算法接着分别对这两部分递归进行排序 伪代码&#xff1a; 输入&am…

QuickSort c++

QuickSort c 简介 算法导论 原理 from Wiki 执行顺序&#xff1a; 左侧排序完 在执行右侧 实验结果&#xff1a; C code #include"QUICKSORT.h" #pragma once #include<vector>int Partition(std::vector<int>& A, const int& p, const…

java快速排序quicksort

public class QuickSortDemo {public static void main(String[] args) {int[] arr {12,36,56,44,9,44,18};sort(arr , 0 , arr.length-1);System.out.println("排序后&#xff1a;"Arrays.toString(arr));}public static void sort(int[] arr, int left, int right…

QuickSort

一、结果显示 二、QuickSort.h #include<iostream>using namespace std;template<class T> class QuickSort { private:T a[10] {d,a,f,c,v,b,a,g,s,z};int size sizeof(a); public:QuickSort(){cout<<"size "<<size<<endl;}void…

快速排序(QuickSort)算法介绍

算法简介 快速排序&#xff08;Quicksort&#xff09;是对冒泡排序的一种改进算法。由C. A. R. Hoare在1960年提出。该算法使用广泛、效率很高&#xff0c;是最重要的排序算法之一。 该算法的实现基本可分为以下几步&#xff1a; 在数组中选一个基准数&#xff08;通常为数组…

快速排序(Quicksort)详解

引言 这篇文章是我在2015年写的&#xff0c;当时正在看算法导论中关于快排的部分&#xff0c;因此写下文章总结一下当时对快排的理解。这几天我一直在review一下我先前写的blog&#xff0c;发现有些地方写的不算太好&#xff0c;还有一些错误的地方。今天我重新修改一下这篇文…