MySQL统计函数记录——Join连接详解
MySQL JOIN 语法概述
SQL(MySQL)JOIN⽤于根据两个或多个表中的字段之间的关系,从这些表中得到数据。
JOIN通常与ON关键字搭配使⽤,基本语法如下:
... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona
table1通常称为左表,table2称为右表。ON关键字⽤于设定匹配条件,⽤于限定在结果集合中想要哪些⾏。如果需要指定其他条件,后⾯可以加上或者以限制记录返回数⽬等。
下⾯以最常见的两表连接来说明MySQLJOIN 的⽤法,关于多表JOIN请参见《》。
MySQLJOIN 分类
JOIN按照功能⼤致分为如下三类:
(内连接):取得两个表中存在连接匹配关系的记录。
(左连接):取得左表(table1)完全记录,即是右表(table2)并⽆对应匹配记录。
(右连接):与LEFTJOIN 相反,取得右表(table2)完全记录,即是左表(table1)并⽆匹配对应记录。
关于MySQLFULL JOIN 全连接
MySQL没有提供SQL标准中的FULLJOIN(全连接):两个表记录都取出,⽽不管彼此是否有对应记录。要解决此问题,可以使⽤UNION关键字来合并LEFTJOIN 与RIGHTJOIN,达到模拟FULLJOIN 的⽬的。
MySQLINNER JOIN
INNERJOIN ⽤于取得两个表中存在连接匹配关系的记录。下⾯是两个原始数据表:
article⽂章表:
aid title content uid
1⽂章1⽂章1正⽂内容 (1)
2⽂章2⽂章2正⽂内容 (1)
3⽂章3⽂章3正⽂内容 (2)
4⽂章4⽂章4正⽂内容 (4)
user⽤户表:
uid username email
1admin admin@5idev
2⼩明xiao@163
3Jack jack@gmail
article表中⽂章的所属⽤户是通过uid这个字段与user表关联起来的。通过观察数据不难发现,对于uid=3的⽤户,并没有发表任何⽂章;⽽⽂章中aid=4却⽆法在uid表中到对应记录
(可能是该⽤户被删除⽽其所属的⽂章却被保留了下来)。
我们列出所⽤⽂章与⽤户⼀⼀对应的数据。
< INNER JOIN ... ON 语句如下:
SELECT article.aid,article.title,user.username FROM article INNER JOIN user ON article.uid = user.uid
返回查询结果如下:
aid title username
1⽂章1admin
2⽂章2admin
3⽂章3⼩明
对于INNERJOIN,等同与下⾯的SQL语句:
SELECT article.aid,article.title,user.username FROM article,user WHERE article.uid = user.uid
CROSSJOIN
CROSSJOIN 即交叉连接,在不指定ON条件下:
SELECT article.aid,article.title,user.username FROM article CROSS JOIN user
得到的结果是被连接的两个数据表的乘积,即。
实际上,在MySQL中(仅限于MySQL)CROSSJOIN 与INNERJOIN 的表现是⼀样的,在不指定ON条件得到的结果都是笛卡尔积,反之取得两个表完全匹配的结果。
INNERJOIN 与CROSSJOIN 可以省略INNER或CROSS关键字,因此下⾯的SQL效果是⼀样的:
... FROM table1 INNER JOIN table2
... FROM table1 CROSS JOIN table2
... FROM table1 JOIN table2
MySQLLEFT JOIN 语法
SQL(MySQL)LEFTJOIN 会取得左表(table1)全部记录,即使右表(table2)并⽆对应匹配记录。LEFTJOIN 基本语法如下:
... FROM table1 LEFT JOIN table2 ON condition ...
MySQLLEFT JOIN ⽤法实例
下⾯是两个原始数据表:
article⽂章表:
aid title content uid
1⽂章1⽂章1正⽂内容 (1)
2⽂章2⽂章2正⽂内容 (1)
3⽂章3⽂章3正⽂内容 (2)
4⽂章4⽂章4正⽂内容 (4)
user⽤户表:
uid username email
1admin admin@5idev
2⼩明xiao@163
3Jack jack@gmail
我们列出所有的⽂章及对应的所属⽤户,即使没有⽤户的⽂章也列出。
< LEFT JOIN ... ON 语句如下:
SELECT article.aid,article.title,user.username FROM article LEFT JOIN user ON article.uid = user.uid
返回查询结果如下:
aid title username
1⽂章1admin
2⽂章2admin
3⽂章3⼩明
4⽂章4NULL
可以看出来,与明显的区别是,左表记录被全部取出,即使右表⽆对应匹配记录。
提⽰
这⾥所谓记录被“全部”取出,是相对于INNERJOIN 的限制来说的。其实可以在上⾯的SQL语句后⾯加个WHERE条件或者LIMIT等关键字以同⼀般SQL语句⼀样对结果集做⼀个范围限制。ISNULL
在上⾯的例⼦中,对于右表中没有对应匹配的数据记录,其所有的列都被置为NULL,因此要查询这部分记录(如在上⾯例⼦中体现为查aid=4这类⽆对应⽤户的⽂章记录),可以附
加ISNULL 条件:
SELECT article.aid,article.title,user.username FROM article LEFT JOIN user
ON article.uid = user.uid WHERE user.uid IS NULL
MySQLRIGHT JOIN 语法
SQL(MySQL)RIGHTJOIN 会取得右表(table2)全部记录,即使左表(table2)并⽆对应匹配记录。RIGHTJOIN 基本语法如下:
... FROM table1 RIGHT JOIN table2 ON condition ...
MySQLRIGHT JOIN ⽤法实例
下⾯是两个原始数据表:
article⽂章表:
aid title content uid
1⽂章1⽂章1正⽂内容 (1)
sql left join 多表连接2⽂章2⽂章2正⽂内容 (1)
3⽂章3⽂章3正⽂内容 (2)
4⽂章4⽂章4正⽂内容 (4)
user⽤户表:
uid username email
1admin admin@5idev
2⼩明xiao@163
3Jack jack@gmail
我们列出所有的⽤户,以及他们可能拥有的⽂章。
< RIGHT JOIN ... ON 语句如下:
SELECT article.aid,article.title,user.username FROM article RIGHT JOIN user ON article.uid = user.uid
返回查询结果如下:
aid title username
1⽂章1admin
2⽂章2admin
3⽂章3⼩明
NULL NULL Jack
对⽐返回的查询结果,RIGHTJOIN 返回的结果与其刚好“相反”。
ISNULL
在上⾯的例⼦中,对于左表中没有对应匹配的数据记录,其所有的列都被置为NULL,因此要查询这部分记录(如在上⾯例⼦中体现为查username=Jack这类⽆对应⽂章的所有⽤户),可以附加ISNULL 条件:
SELECT article.aid,article.title,user.username FROM article LEFT JOIN user
ON article.uid = user.uid WHERE article.aid IS NULL
MySQLJOIN 多表连接
除了常⽤的两个表连接之外,SQL(MySQL)JOIN语法还⽀持多表连接。多表连接基本语法如下:
... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON condition INNER|LEFT|RIGHT JOIN table3 ON condition ...
JOIN多表连接实现了从多个表中获取相关数据,下⾯是三个原始数据表:
article⽂章表:
aid title content uid tid
1⽂章1⽂章1正⽂内容 (11)
2⽂章2⽂章2正⽂内容 (12)
3⽂章3⽂章3正⽂内容 (21)
5⽂章5⽂章5正⽂内容 (41)
user⽤户表:
uid username email
1admin admin@5idev
2⼩明xiao@163
3Jack jack@gmail
type⽂章类型表:
tid typename
1普通⽂章
2精华⽂章
3草稿
MySQLINNER JOIN 多表
我们使⽤列出三个表中都具有关联关系的数据:
SELECT article.aid,article.title,user.pename FROM article INNER JOIN user
ON article.uid=user.uid INNER JOIN type ON article.tid=type.tid
返回查询结果如下:
aid title username typename
1⽂章1admin普通⽂章
2⽂章2admin精华⽂章
3⽂章3⼩明普通⽂章
MySQLLEFT JOIN 多表
使⽤三个表查询:
SELECT article.aid,article.title,user.pename FROM article LEFT JOIN user
ON article.uid=user.uid LEFT JOIN type ON article.tid=type.tid
返回查询结果如下:
aid title username typename 1⽂章1admin普通⽂章2⽂章2admin精华⽂章3⽂章3⼩明普通⽂章4⽂章4NULL普通⽂章
MySQLRIGHT JOIN 多表
使⽤三个表查询:
SELECT article.aid,article.title,user.pename FROM article RIGHT JOIN user
ON article.uid=user.uid RIGHT JOIN type ON article.tid=type.tid
返回查询结果如下:
aid title username typename
1⽂章1admin普通⽂章
2⽂章2admin精华⽂章
3⽂章3⼩明普通⽂章
NULL NULL NULL草稿
可见,在RIGHTJOIN 右连接中,只是列出最后⼀个右连接表的所有数据。
说明
对于MySQL多表JOIN,还可以INNER、LEFT和RIGHT混⽤,其返回结果与各关键字顺序有关,感兴趣可⾃⾏测试。MySQLSTRAIGHT_JOIN
STRAIGHT_JOIN是MySQL对标准SQL的扩展,⽤于在多表查询时指定表载⼊的顺序。在JOIN表连接中,同样可以指定表载⼊的顺序,本⽂只讲述STRAIGHT_JOIN在表连接JOIN中的应⽤。
MySQLSTRAIGHT_JOIN 语法如下:
... FROM table1 STRAIGHT_JOIN table2 ON condition ...
STRAIGHT_JOIN实际上与表现完全⼀致,不同的是使⽤了STRAIGHT_JOIN后,table1会先于table2载⼊。
提⽰
MySQL在执⾏INNERJOIN 的时候,会根据⾃⼰内部的优化规则来决定先载⼊table1还是table2,如果您确认MySQL载⼊表的顺序并不是最优化的时候,就可以使⽤STRAIGHT_JOIN以替代INNERJOIN。
MySQLSTRAIGHT_JOIN 例⼦
SELECT article.aid,article.title,user.username FROM article STRAIGHT_JOIN user ON article.uid=user.uid
注意:该SQL仅仅是STRAIGHT_JOIN使⽤⽰例,并不表⽰其合理性。
如果有更多表进⾏连接,那么使⽤STRAIGHT_JOIN后,其载⼊顺序就遵循从左往右的规则。最后,STRAIGHT_JOIN⽆法应⽤于LEFTJOIN 或RIGHTJOIN。
MySQLNATURAL JOIN
NATURALJOIN 也叫⾃然连接,实际是属于JOIN的⼀种。
MySQLNATURAL JOIN 语法如下:
... FROM table1 NATURAL  JOIN table2 ...
使⽤NATURALJOIN 时,MySQL将表中具有相同名称的字段⾃动进⾏记录匹配,⽽这些同名字段类型可以不同。因此,NATURALJOIN 不⽤指定匹配条件。NATURALJOIN 默认是同名字段完全匹配的INNERJOIN,也可以使⽤或。⼀些例⼦如下:
SELECT article.aid,article.title,user.username FROM article NATURAL JOIN user
// LEFT
SELECT article.aid,article.title,user.username FROM article NATURAL LEFT JOIN user
/
/ RIGHT
SELECT article.aid,article.title,user.username FROM article NATURAL RIGHT JOIN user

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。