MySQL JOIN 语句:表连接
MySQL JOIN语句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
JOIN 按照功能大致分为3类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
1. MySQL INNER JOIN
我们在CodeBaoku数据库中有两张表 tcount_tbl 和 codebaoku_tbl。两张数据表数据如下:
MySQL 范例
mysql
>
use
CodeBaoku
;
Database
changed
mysql
>
SELECT
*
FROM
tcount_tbl
; +---------------+--------------+ |
author
|
count
| +---------------+--------------+ | 编程宝库 |
10
| |
CodeBaoku
.
COM
|
20
| |
Google
|
22
| +---------------+--------------+
3
rows
in
set
(
0.01
sec
)
mysql
>
SELECT
*
from
codebaoku_tbl
; +-----------+---------------+---------------+-----------------+ |
id
|
title
|
author
|
submission_date
| +-----------+---------------+---------------+-----------------+ |
1
| 学习
PHP
| 编程宝库 |
2017
-
04
-
12
| |
2
| 学习
MySQL
| 编程宝库 |
2017
-
04
-
12
| |
3
| 学习
Java
|
CodeBaoku
.
COM
|
2015
-
05
-
01
| |
4
| 学习
Python
|
CodeBaoku
.
COM
|
2016
-
03
-
06
| |
5
| 学习
C
|
FK
|
2017
-
04
-
05
| +-----------+---------------+---------------+-----------------+
5
rows
in
set
(
0.01
sec
)
接下来我们就使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取codebaoku_tbl表中所有author字段在tcount_tbl表对应的count字段值:
MySQL 范例
mysql
>
SELECT
a
.
id
,
a
.
author
,
b
.
count
FROM
codebaoku_tbl
a
INNER
JOIN
tcount_tbl
b
ON
a
.
author
=
b
.
author
; +-------------+-----------------+----------------+ |
a
.
id
|
a
.
author
|
b
.
count
| +-------------+-----------------+----------------+ |
1
| 编程宝库 |
10
| |
2
| 编程宝库 |
10
| |
3
|
CodeBaoku
.
COM
|
20
| |
4
|
CodeBaoku
.
COM
|
20
| +-------------+-----------------+----------------+
4
rows
in
set
(
0.00
sec
)
以上 SQL 语句等价于:
MySQL 范例
mysql
>
SELECT
a
.
id
,
a
.
author
,
b
.
count
FROM
codebaoku_tbl
a
,
tcount_tbl
b
WHERE
a
.
author
=
b
.
author
; +-------------+-----------------+----------------+ |
a
.
id
|
a
.
author
|
b
.
count
| +-------------+-----------------+----------------+ |
1
| 编程宝库 |
10
| |
2
| 编程宝库 |
10
| |
3
|
CodeBaoku
.
COM
|
20
| |
4
|
CodeBaoku
.
COM
|
20
| +-------------+-----------------+----------------+
4
rows
in
set
(
0.01
sec
)

2. MySQL LEFT JOIN
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
尝试以下范例,以 codebaoku_tbl 为左表,tcount_tbl 为右表,理解 MySQL LEFT JOIN 的应用:
MySQL 范例
mysql
>
SELECT
a
.
id
,
a
.
author
,
b
.
count
FROM
codebaoku_tbl
a
LEFT
JOIN
tcount_tbl
b
ON
a
.
author
=
b
.
author
; +-------------+-----------------+----------------+ |
a
.
id
|
a
.
author
|
b
.
count
| +-------------+-----------------+----------------+ |
1
| 编程宝库 |
10
| |
2
| 编程宝库 |
10
| |
3
|
CodeBaoku
.
COM
|
20
| |
4
|
CodeBaoku
.
COM
|
20
| |
5
|
FK
|
NULL
| +-------------+-----------------+----------------+
5
rows
in
set
(
0.01
sec
)
以上范例中使用了 LEFT JOIN,该语句会读取左边的数据表 codebaoku_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl中 没有对应的 author 字段值。

3. MySQL RIGHT JOIN
MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
尝试以下范例,以 codebaoku_tbl 为左表,tcount_tbl 为右表,理解MySQL RIGHT JOIN的应用:
MySQL 范例
mysql
>
SELECT
a
.
id
,
a
.
author
,
b
.
count
FROM
tbl
a
RIGHT
JOIN
tcount_tbl
b
ON
a
.
author
=
b
.
author
; +-------------+-----------------+----------------+ |
a
.
id
|
a
.
author
|
b
.
count
| +-------------+-----------------+----------------+ |
1
| 编程宝库 |
10
| |
2
| 编程宝库 |
10
| |
3
|
CodeBaoku
.
COM
|
20
| |
4
|
CodeBaoku
.
COM
|
20
| |
NULL
|
NULL
|
22
| +-------------+-----------------+----------------+
5
rows
in
set
(
0.01
sec
)
以上范例中使用了 RIGHT JOIN,该语句会读取右边的数据表 tcount_tbl 的所有选取的字段数据,即便在左侧表 tbl 中没有对应的author 字段值。

4. 在 PHP 脚本中使用 JOIN
PHP 中使用 mysqli_query() 函数来执行 SQL 语句,你可以使用以上的相同的 SQL 语句作为 mysqli_query() 函数的参数。
MySQL 范例
<?php
$dbhost
=
'
localhost
'
;
//
mysql服务器主机地址
$dbuser
=
'
root
'
;
//
mysql用户名
$dbpass
=
'
123456
'
;
//
mysql用户名密码
$conn
=
mysqli_connect
(
$dbhost
,
$dbuser
,
$dbpass
)
;
if
(
!
$conn
)
{
die
(
'
连接失败:
'
.
mysqli_error
(
$conn
)
)
;
}
//
设置编码,防止中文乱码
mysqli_query
(
$conn
,
"
set names utf8
"
)
;
$sql
=
'
SELECT a.id, a.author, b.count FROM tbl a INNER JOIN tcount_tbl b ON a.author = b.author
'
;
mysqli_select_db
(
$conn
,
'
CodeBaoku
'
)
;
$retval
=
mysqli_query
(
$conn
,
$sql
)
;
if
(
!
$retval
)
{
die
(
'
无法读取数据:
'
.
mysqli_error
(
$conn
)
)
;
}
echo
'
<h2>编程宝库 MySQL JOIN 测试<h2>
'
;
echo
'
<table border="1"><tr><td>教程 ID</td><td>作者</td><td>登陆次数</td></tr>
'
;
while
(
$row
=
mysqli_fetch_array
(
$retval
,
MYSQLI_ASSOC
)
)
{
echo
"
<tr><td>
{$row['id']}
</td>
"
.
"
<td>
{$row['author']}
</td>
"
.
"
<td>
{$row['count']}
</td>
"
.
"
</tr>
"
;
}
echo
'
</table>
'
;
mysqli_close
(
$conn
)
;
?>