数据库之SQL(多表连接查询:多个数据表的多种连接方式)
分类:
文章
•
2024-01-03 22:32:40
之前的博客内容我们分享了数据表的查询与管理,但那只是针对数据库中的一个表格进行的查询管理,现在如果我们想要同时看到两个数据表中的数据的话,那要怎么办呢?采用多连接查询的方式。
SQL中有哪几种多连接的方式?
有七种连接的方式:
基本连接,内连接,左外连接,右外连接,全外连接,交叉连接,自连接
如果对连接方式了解的人看到这里会感到很熟悉,但对于不了解的人则是一头雾水,没关系,我们来梳理一下,了解的人可以再重复一遍, 顺便可以提点意见^_^,不了解的人我们来先初步认识一下以上七种连接方式。
一、基本连接
①什么是基本连接?
基本连接又称多表连接,是对多个表内容的查询与连接。
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM2LzA2NGI5MDQ2NWQ2MDg5NDk1MzVkZmIzOTFjZWQ5NzM0LnBuZw==)
②为什么会有多表连接的存在?
基于数据库的范式理论,数据库的数据查询一个表格未能把信息全部查询出来,所以就涉及到了多表连接的查询。
③多表连接如何连接?
select 不同表格中的列名
from 不同表格
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg4Mi9mNDk5NGFhZmIwNmVlZGYwZmYyZThiYjQ4ODcyYjg0YS5wbmc=)
问题一
A,B代表什么?
AB是此代码中的简化定义,在From子句中,表格后面加一个空格即表示可以创建快捷访问或者是重新命名,即班级信息为A表,梅里号为B表
问题二
为什么搜索出来这么多信息?
梅里号表中的数据如下:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1OC8yNjM2NmYzMWNkOTRiM2ZmODg5NTdhNGQ4ODgzMzEwZS5wbmc=)
因为以上只是select from 的查询语句,而代码则设置了7个内容,所以共查询了7次。以上表格只是简单的查询语句,我们还没有完成多表的连接,多表连接的三要素中我们还差一个where语句。
问题三
加上where语句的效果?
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE3LzA1YzQzNGYzNjUzNDliNzA3MThhNDc0MDgzNDZiM2I5LnBuZw==)
这就查询出来咯,所以,通过以上的例子让我们更加清晰的看到了多表连接的三个必要条件。
问题四
where 在这里起什么作用呢?
关系连接:A表中的班级与B表中的班级建立关联。
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI4Ni9jYzM1OTE4ZGMxZDg3NTEzOWEyYzgyMzk1ZGI1ZWIwZS5wbmc=)
二、内连接
①什么是内连接?
内连接也是多表连接,对多表数据进行查询和连接
②那与基本连接有什么区别呢?
我们先看一下他的代码及操作效果:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2LzJlNjhkM2QyYzM4ODU3ZTczM2VjMDk5ZDg0YzY2YTdhLnBuZw==)
会发现与基本连接的查询结果是一样的。
那区别在哪里?
内连接与基本连接的查询效果是一样的,都是对多表的查询,只是表现形式,代码不一样而已。
我们看一下代码区别:
基本连接:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE0NS84MDEzYTgwNzQyMTQ4ZTcyMDg3YmI0ZGQ5NTc4ZjQyOS5wbmc=)
内连接:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzEyMC9mY2RkZmUxNzRiZGVkNWYwYWY2OTgxMGY3MzI1NjQ2OC5wbmc=)
即在第二个和第三个必备条件上面有区别。
三、外连接,左外连接,右外连接,全外连接
①什么是外连接?
在了解外连接之前我们再重申一下内连接
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。
左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。
右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
全外连接:左外连接 + 右外连接。
②内连接与外连接如何区分?
我的个人理解,内外可看做是符合条件内的行与符合条件外的行
③外连接、左外连接、右外连接,全外连接有什么区别?
我们拿代码及其效果来说话:
A表:梅里号数据:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI0OC80OWNiZTQ4NGM0YjJlZGYzZjQ4MmI1NDc3Yjg3MTY0OC5wbmc=)
B表:班级信息数据
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyLzIxNTNlMzMyOWZmYWNiNWNjZDNhNjk2M2YxZmY3YTY0LnBuZw==)
内连接:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg3Mi9mZWIzZWVhN2FmNmQyODcwNDViY2ZiZGQzMTNlOGI5MC5wbmc=)
连接结果仅包含符合连接条件的行
外连接:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg5Ny80NDg1Mjg1YTJjZTY2N2E0NTIzYzAwODhjMTI5ZmI4OS5wbmc=)
连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。
左外连接:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI4Mi8wNmFmZTk4MWVmOTY4NTEzOGVkZmY3OTdjYjY2YmVhYS5wbmc=)
不仅包含1-6符合条件的行,还包含左侧的梅里号表中的不符合条件的其他全部数据。
右外连接:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ2OS9iOGIzNmU2ZWYwNzE1ZWY0M2FlZWMwZTg2NjQ2OTdlZC5wbmc=)
不仅包含1-6符合条件的行,还包含右侧的班级信息表中的其他不符合条件的全部数据。
全外连接:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE4Lzg1ZGIwYjFjOWY3NDVlNzY2Mzg1MjgwY2FmNjMzMmNhLnBuZw==)
不仅包含1-6符合条件的行,还包含左右两侧的班级信息表及梅里号表中的其他不符合条件的全部数据。
四、交叉连接
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzcwOC9lZDU1NTRiOTNhMjdmN2Q1MzQ2YWNkMzBkYTkyNmI0NC5wbmc=)
我们来看一下示例就会清晰多了:
交叉连接不带where子句,返回的连接数是第一个表中符合查询条件的数据行数乘以第二个表中符合条件的数据行数,一下表格中第一表中7行数据,第二表中7行数据,那么交叉连接的查询数为7*7=49
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY5Ny9lYTRkZGU4NzQ4ZjczODU3OGEyNjMzMmRhYTJkYmU0MS5wbmc=)
问题一:
交叉的连接是按照什么方式连接的呢?
我们来看以下连个表后应该会清楚一些
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzcxLzc3ZmUxZTcwODViY2FkMGUyNTQyYWIxYmE2N2UxMTY3LnBuZw==)
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUxNy9lMzljYWY0YTA0N2ZhNWU0MmQxMDM1MzQyNTdjOTMyNS5wbmc=)
即:以cross join右侧的表格为基数,逐步的一对多。
问题二:
加上where子句是什么样的呢?
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM2OC9hMzIzNTE0ZWQxNjMzYWIyOGVlMTg0MGIyM2RlNzAzMC5wbmc=)
与基本连接,与内连接的结果是一样的,因为查询的where关联条件是AB表中连接部分‘班级’的交叉数据,那不就是相同数据么。
五、自连接
自连接顾名思义:自己与自己连接,一对多,即同一个数据表的多表连接
'梅里号'表格数据:
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzc3NS8wOTU4YzU0N2I0YTYxYmI2YjAwMjI2NWVlZWIwOWY3Zi5wbmc=)
自连接后是什么样的呢?
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyNi82MWNiZjhlZDM1NjkwZDM5M2YyYTM5MTM1YmMyMzI4ZS5wbmc=)
与同一个表格的交叉连接数据相同
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgyNy9jY2ZjMWE1ZDQwNmE5YWYzYjlkOWZmZDgwM2QwZjVhYi5wbmc=)
六、思维导图
![数据库之SQL(多表连接查询:多个数据表的多种连接方式) 数据库之SQL(多表连接查询:多个数据表的多种连接方式)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM5OS8wYmNkNTVmODZiNmFkZTRhZjQwZmRlNGU5MzM2ZTE0Ny5wbmc=)