连接查询
基本含义
连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。
将两个表以“并排”的方式,连接起来,成为“更多字段”的一个新表。
根据连接的不同方式和条件的不同,得到的新表的行数会有不同。
实际上,两个表的完全连接是这样的一个过程:
左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后得到所有数据行的结果。
注意:连接之后,并非形成了一个新的数据表,而只是一种“内存形态”。
如图所示,两个独立表及连接示意图:
连接之后:
连接语法的基本形式
from 表1 [连接方式] join 表2 [on 连接条件];
连接的结果可以当作一个“表”来使用。常用有以下几种连接方式:
交叉连接
语法
:
from 表1 [cross] join 表2;
注意:交叉连接只是没有on条件而已。cross这个词也可以省略,还可以使用inner这个词代替。
交叉连接:连接的结果其实是两个表中的所有数据“两两对接”。这种连接通常也被叫做“笛卡尔积”。
实际上,交叉连接是将两个表不设定任何条件的连接结果。
表1:
表2:
交叉连接:
内连接
语法
:
from 表1 [inner] join 表2 on 连接条件(表1.字段1=表2.字段2);
含义:找出(过滤)在交叉连接的结果表中表1的字段1的值等于表2的字段2的值的那些行。
内连接:inner关键字可以省略,也可以用cross代替。
on 连接条件是设定在连接后所得到的数据表中,设定一个条件以取得所需要的数据。
通常连接都是指两个有关联的表,则连接条件就是这两个表的关联字段的一个关系(通常都是相等关系)。
如果没有设定此条件,则表示将左表的 m 行数据跟右表 n 行数据进行“完全连接”,结果就会有 m*n 行数据,这通
常都不是应用所需。
示例
:
交叉连接的“无意义性”
:
select * from product join product_type where 1
内连接的“有意义性”
:
select * from product as t1 join product_type as t2 on t1.protype_id = t2.protype_id where 1
可见,在现实的常见需求中,上述内连接的结果就都是“有意义”的数据。
也可以指定只列出其中部分字段:
SELECT t1.pro_id, pro_name, price, t2.protype_name FROM product as t1 join product_type as t2 on t1.protype_id=t2.protype_id WHERE 1
结果:
左[外]连接
语法
:
from 表1 left [outer] join 表2 on 连接条件;
# left是关键字,连接条件跟内连接一样
含义:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应本应放右边表的字段的位置就自动补为“null”值。
则左连接结果为:
左外连接:将左边的表的数据跟右边的表的数据以给定的条件连接,并将左边的表中无法满足条件的数据也一并取得——即左边的表的数据肯定都取出来了。
注意:此连接的on条件是必须写的。
示例:
右[外]连接
语法
:
from 表1 right [outer] join 表2 on 连接条件;
# right是关键字,连接条件跟内连接一样
含义:在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为“null”值。
右外连接:将左边的表的数据跟右边的表的数据以给定的条件连接,并将右边的表中无法满足条件的数据也一并取得——即右边的表的数据肯定都取出来了。
注意:此连接的on条件是必须写的。
示例:
全[外]连接
语法
:
from 表1 full [outer] join 表2 on 连接条件;
含义:其实是左右连接的“并集”(消除重复项),即内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。
注意:mysql中其实不支持全[外]连接语法,即mysql这个软件本身不支持全连接的语法。此概念在其他数据库有的支持。
连接查询示例
原始数据:
- 找出索尼4G手机所属类别名称:
- 找出所有属于手机数码的产品: