MySQL 连接的使用

更新时间: 2019-08-23 12:54

在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。

本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。

你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

在命令提示符中使用 INNER JOIN

我们在CODERCTO数据库中有两张表 tcount_tbl 和 codercto_tbl。两张数据表数据如下:

实例

尝试以下实例:

mysql> use RUNOOB;
Database changed
mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| codercto_author | codercto_count |
+---------------+--------------+
| 码农教程  | 10           |
| RUNOOB.COM    | 20           |
| Google        | 22           |
+---------------+--------------+
3 rows in set (0.01 sec)

mysql> SELECT * from codercto_tbl;
+-----------+---------------+---------------+-----------------+
| codercto_id | codercto_title  | codercto_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1         | 学习 PHP    | 码农教程  | 2017-04-12      |
| 2         | 学习 MySQL  | 码农教程  | 2017-04-12      |
| 3         | 学习 Java   | RUNOOB.COM    | 2015-05-01      |
| 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
| 5         | 学习 C      | FK            | 2017-04-05      |
+-----------+---------------+---------------+-----------------+
5 rows in set (0.01 sec)

接下来我们就使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取codercto_tbl表中所有codercto_author字段在tcount_tbl表对应的codercto_count字段值:

mysql> SELECT a.codercto_id, a.codercto_author, b.codercto_count FROM codercto_tbl a INNER JOIN tcount_tbl b ON a.codercto_author = b.codercto_author;
+-------------+-----------------+----------------+
| a.codercto_id | a.codercto_author | b.codercto_count |
+-------------+-----------------+----------------+
| 1           | 码农教程    | 10             |
| 2           | 码农教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
+-------------+-----------------+----------------+
4 rows in set (0.00 sec)

以上 SQL 语句等价于:

mysql> SELECT a.codercto_id, a.codercto_author, b.codercto_count FROM codercto_tbl a, tcount_tbl b WHERE a.codercto_author = b.codercto_author;
+-------------+-----------------+----------------+
| a.codercto_id | a.codercto_author | b.codercto_count |
+-------------+-----------------+----------------+
| 1           | 码农教程    | 10             |
| 2           | 码农教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
+-------------+-----------------+----------------+
4 rows in set (0.01 sec)

MySQL LEFT JOIN

MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。

实例

尝试以下实例,以 codercto_tbl 为左表,tcount_tbl 为右表,理解 MySQL LEFT JOIN 的应用:

mysql> SELECT a.codercto_id, a.codercto_author, b.codercto_count FROM codercto_tbl a LEFT JOIN tcount_tbl b ON a.codercto_author = b.codercto_author;
+-------------+-----------------+----------------+
| a.codercto_id | a.codercto_author | b.codercto_count |
+-------------+-----------------+----------------+
| 1           | 码农教程    | 10             |
| 2           | 码农教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
| 5           | FK              | NULL           |
+-------------+-----------------+----------------+
5 rows in set (0.01 sec)

以上实例中使用了 LEFT JOIN,该语句会读取左边的数据表 codercto_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl中 没有对应的 codercto_author 字段值。

MySQL RIGHT JOIN

MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。

实例

尝试以下实例,以 codercto_tbl 为左表,tcount_tbl 为右表,理解MySQL RIGHT JOIN的应用:

mysql> SELECT a.codercto_id, a.codercto_author, b.codercto_count FROM codercto_tbl a RIGHT JOIN tcount_tbl b ON a.codercto_author = b.codercto_author;
+-------------+-----------------+----------------+
| a.codercto_id | a.codercto_author | b.codercto_count |
+-------------+-----------------+----------------+
| 1           | 码农教程    | 10             |
| 2           | 码农教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
| NULL        | NULL            | 22             |
+-------------+-----------------+----------------+
5 rows in set (0.01 sec)

以上实例中使用了 RIGHT JOIN,该语句会读取右边的数据表 tcount_tbl 的所有选取的字段数据,即便在左侧表 codercto_tbl 中没有对应的codercto_author 字段值。

在 PHP 脚本中使用 JOIN

PHP 中使用 mysqli_query() 函数来执行 SQL 语句,你可以使用以上的相同的 SQL 语句作为 mysqli_query() 函数的参数。

尝试如下实例:

<?php
$dbhost = 'localhost:3306';  // 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.codercto_id, a.codercto_author, b.codercto_count FROM codercto_tbl a INNER JOIN tcount_tbl b ON a.codercto_author = b.codercto_author';

mysqli_select_db( $conn, 'RUNOOB' );
$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['codercto_id']}</td> ".
         "<td>{$row['codercto_author']} </td> ".
         "<td>{$row['codercto_count']} </td> ".
         "</tr>";
}
echo '</table>';
mysqli_close($conn);
?>
Algorithms Unlocked

Algorithms Unlocked

Thomas H. Cormen / The MIT Press / 2013-3-1 / USD 25.00

Have you ever wondered how your GPS can find the fastest way to your destination, selecting one route from seemingly countless possibilities in mere seconds? How your credit card account number is pro......一起来看看 《Algorithms Unlocked》 这本书的介绍吧!

随机密码生成器

随机密码生成器

多种字符组合密码

HSV CMYK 转换工具

HSV CMYK 转换工具

HSV CMYK互换工具