什么是MySQL连接查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
1作用
在数据库中<代码>与代码>操作被称为连接,作用是能连接多个表的数据(通过连接条件),从多个表中获取数据合并在一起作为结果集返回给客户端,例如:
表答:
引用> idnameage1A182B193C20表B:
引用> iduidgender11F22M通过连接可以获取到合并两个表的数据:
选择a * B。性别从左加入B> 2连接关键字连接两个表我们可以用两个关键字:<代码> 代码>,<代码>使用代码>。<代码> 代码>可以指定具体条件,使用代码> <代码>则指定<强>相同名字强>和<强>数据类型强>的列作为等值判断的条件,多个则通过逗号隔开。
如下::select * from A加入B> 3连接类型3.1内连接
内连接和交叉连接
<李>语法:<代码>,加入|内连接|,交叉连接B 代码> 李> <李>表现:A和B满足连接条件记录的交集,如果没有连接条件,则是A和B的笛卡尔积李> <李>特点:在MySQL中,<代码>交叉连接代码>,<代码>内连接代码>和<代码>与代码>所实现的功能是一样的。因此在MySQL的官方文档中,指明了三者是等价的关系。李>
隐式连接
<李>语法:<代码>从A, B, C代码> 李> <李>表现:相当于无法使用<代码> 代码>和<代码>使用代码>的<代码>与代码> 李> <李>特点:逗号是隐式连接运算符。隐式连接是SQL92中的标准内容,而在SQL99中显式连接才是标准,虽然很多人还在用隐私连接,但是它已经从标准中被移除。从使用的角度来说,还是推荐使用显示连接,这样可以更清楚的显示出多个表之间的连接关系和连接依赖的属性。李>
3.2外连接
左外连接
<李>语法:<代码>左加入B 代码> 李> <李>表现:左表的数据全部保留,右表满足连接条件的记录展示,不满足的条件的记录则全是零代码> <代码> 李>
右外连接
<李>语法:<代码>右加入B 代码> 李> <李>表现:右表的数据全部保留,左表满足连接条件的记录展示,不满足的条件的记录则全是零代码> <代码> 李>
全外连接
MySQL不支持全外连接,只支持左外连接和右外连接。如果要获取全连接的数据,要可以通过合并左右外连接的数据获取到,如<代码> select *从左加入B> 3.3自然连接
<李>语法:<代码>自然连接B====自然左连接B====自然权利加入B 代码> 李> <李>表现:相当于不能指定连接条件的连接,MySQL会使用左右表内相同名字和类型的字段作为连接条件。李> <>李特点:自然连接也分自然内连接,左外连接,右外连接,其表现和上面提到的一致,只是连接条件由MySQL自动判定。李>
4执行顺序
在连接过程中,MySQL各关键字执行的顺序如下:
5连接算法<代码>与>代码有三种算法,分别是<代码>嵌套循环联接代码>,<代码>散列连接代码>,<代码>排序合并连接> 代码.MySQL官方文档中提到,MySQL只支持<代码>嵌套循环联接> 代码这一种算法。
具体来说<代码>嵌套循环联接> 代码又分三种细分的算法:
<李> SNLJ李> <>李BNLJ李> <李> INLJ李>
我们来看下对于连接语句<代码> select *从左加入B> 5.1简单的嵌套循环联接(SNLJ)
<代码> SNLJ> 代码是在没有使用到索引的情况下,通过两层循环全量扫描连接的两张表,得到符合条件的两条记录则输出。也就是让两张表做笛卡尔积进行扫描,是比较暴力的算法,会比较耗时。其过程如下:
(一分之一){ 在b (b) { 如果(一个。id==b.tid) { b>输出& lt;;; } } }当然,MySQL即使在无索引可用,或者判断全表扫描可能比使用索引更快的情况下,还是不会选择使用过于粗暴的<代码> SNLJ 代码>算法,而是采用下面的算法。
5.2块嵌套循环联接(BNLJ)
<代码> INLJ> 代码是MySQL无法使用索引的时候采用的<代码>与代码>算法。会将外层循环的行分片存入<代码> 代码,加入缓冲区内层循环的每一行与整个<代码> 代码>中缓冲的记录做比较,从而减少内层循环的次数,具体逻辑如下:
什么是MySQL连接查询