第21章 MySQL 连接的使用教程

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

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

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

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

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

本章节使用的database结构及数据download :liulianjiangcsdn-mysql-join-test.sql。


在命令提示符中使用 INNER JOIN

咱们在liulianjiangcsdndatabase中有两张表 tcount_tbl 和 liulianjiangcsdn_tbl。两张数据表数据如下:

实例

尝试以下实例:


    测试实例数据
     
    
    mysql> use liulianjiangcsdn;
    Database changed
    mysql> SELECT * FROM tcount_tbl;
    +---------------+--------------+
    | liulianjiangcsdn_author | liulianjiangcsdn_count |
    +---------------+--------------+
    | liulianjiangcsdn教程  | 10           |
    | liulianjiangcsdn.COM    | 20           |
    | Google        | 22           |
    +---------------+--------------+
    3 rows in set (0.01 sec)
     
    mysql> SELECT * from liulianjiangcsdn_tbl;
    +-----------+---------------+---------------+-----------------+
    | liulianjiangcsdn_id | liulianjiangcsdn_title  | liulianjiangcsdn_author | submission_date |
    +-----------+---------------+---------------+-----------------+
    | 1         | 学习 PHP    | liulianjiangcsdn教程  | 2017-04-12      |
    | 2         | 学习 MySQL  | liulianjiangcsdn教程  | 2017-04-12      |
    | 3         | 学习 Java   | liulianjiangcsdn.COM    | 2015-05-01      |
    | 4         | 学习 Python | liulianjiangcsdn.COM    | 2016-03-06      |
    | 5         | 学习 C      | FK            | 2017-04-05      |
    +-----------+---------------+---------------+-----------------+
    5 rows in set (0.01 sec)

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

 INNER JOIN

   
    mysql> SELECT a.liulianjiangcsdn_id, a.liulianjiangcsdn_author, b.liulianjiangcsdn_count FROM liulianjiangcsdn_tbl a INNER JOIN tcount_tbl b ON a.liulianjiangcsdn_author = b.liulianjiangcsdn_author;+-------------+-----------------+----------------+| a.liulianjiangcsdn_id | a.liulianjiangcsdn_author | b.liulianjiangcsdn_count |+-------------+-----------------+----------------+| 1           | liulianjiangcsdn教程    | 10             || 2           | liulianjiangcsdn教程    | 10             || 3           | liulianjiangcsdn.COM      | 20             || 4           | liulianjiangcsdn.COM      | 20             |+-------------+-----------------+----------------+4 rows in set (0.00 sec)


以上 SQL 语句等价于:


    WHERE 子句
     
    
    mysql> SELECT a.liulianjiangcsdn_id, a.liulianjiangcsdn_author, b.liulianjiangcsdn_count FROM liulianjiangcsdn_tbl a, tcount_tbl b WHERE a.liulianjiangcsdn_author = b.liulianjiangcsdn_author;
    +-------------+-----------------+----------------+
    | a.liulianjiangcsdn_id | a.liulianjiangcsdn_author | b.liulianjiangcsdn_count |
    +-------------+-----------------+----------------+
    | 1           | liulianjiangcsdn教程    | 10             |
    | 2           | liulianjiangcsdn教程    | 10             |
    | 3           | liulianjiangcsdn.COM      | 20             |
    | 4           | liulianjiangcsdn.COM      | 20             |
    +-------------+-----------------+----------------+
    4 rows in set (0.01 sec)


MySQL LEFT JOIN

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

实例

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


    LEFT JOIN
     
    mysql> SELECT a.liulianjiangcsdn_id, a.liulianjiangcsdn_author, b.liulianjiangcsdn_count FROM liulianjiangcsdn_tbl a LEFT JOIN tcount_tbl b ON a.liulianjiangcsdn_author = b.liulianjiangcsdn_author;
    +-------------+-----------------+----------------+
    | a.liulianjiangcsdn_id | a.liulianjiangcsdn_author | b.liulianjiangcsdn_count |
    +-------------+-----------------+----------------+
    | 1           | liulianjiangcsdn教程    | 10             |
    | 2           | liulianjiangcsdn教程    | 10             |
    | 3           | liulianjiangcsdn.COM      | 20             |
    | 4           | liulianjiangcsdn.COM      | 20             |
    | 5           | FK              | NULL           |
    +-------------+-----------------+----------------+
    5 rows in set (0.01 sec)

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


MySQL RIGHT JOIN

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

实例

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


    RIGHT JOIN 
     
    mysql> SELECT a.liulianjiangcsdn_id, a.liulianjiangcsdn_author, b.liulianjiangcsdn_count FROM liulianjiangcsdn_tbl a RIGHT JOIN tcount_tbl b ON a.liulianjiangcsdn_author = b.liulianjiangcsdn_author;
    +-------------+-----------------+----------------+
    | a.liulianjiangcsdn_id | a.liulianjiangcsdn_author | b.liulianjiangcsdn_count |
    +-------------+-----------------+----------------+
    | 1           | liulianjiangcsdn教程    | 10             |
    | 2           | liulianjiangcsdn教程    | 10             |
    | 3           | liulianjiangcsdn.COM      | 20             |
    | 4           | liulianjiangcsdn.COM      | 20             |
    | NULL        | NULL            | 22             |
    +-------------+-----------------+----------------+
    5 rows in set (0.01 sec)

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


在 PHP 脚本中使用 JOIN

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

尝试如下实例:


    MySQL ORDER BY 测试: 
     输出结果如下图所示: 
    
    
    <?php
    $dbhost = 'localhost';  // mysqlserver 主机地址
    $dbuser = 'root';            // mysql用户名
    $dbpass = '123456';          // mysql用户名password 
    $conn = mysqli_connect($dbhost, $dbuser, $dbpass);
    if(! $conn )
    {
        die('连接失败: ' . mysqli_error($conn));
    }
    // 设置编码,防止中文乱码
    mysqli_query($conn , "set names utf8");
     
    $sql = 'SELECT a.liulianjiangcsdn_id, a.liulianjiangcsdn_author, b.liulianjiangcsdn_count FROM liulianjiangcsdn_tbl a INNER JOIN tcount_tbl b ON a.liulianjiangcsdn_author = b.liulianjiangcsdn_author';
     
    mysqli_select_db( $conn, 'liulianjiangcsdn' );
    $retval = mysqli_query( $conn, $sql );
    if(! $retval )
    {
        die('无法读取数据: ' . mysqli_error($conn));
    }
    echo '<h2>liulianjiangcsdn教程 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['liulianjiangcsdn_id']}</td> ".
             "<td>{$row['liulianjiangcsdn_author']} </td> ".
             "<td>{$row['liulianjiangcsdn_count']} </td> ".
             "</tr>";
    }
    echo '</table>';
    mysqli_close($conn);
    ?>

本专栏所有文章

第1章 MySQL 教程第2章 MySQL 安装教程
第3章 MySQL 管理教程第4章 MySQL PHP 语法教程
第5章 MySQL 连接教程第6章 MySQL 创建数据库教程
第7章 MySQL 删除数据库教程第8章 MySQL 选择数据库教程
第9章 MySQL 数据类型教程第10章 MySQL 创建数据表教程
第11章 MySQL 删除数据表教程第12章 MySQL 插入数据教程
第13章 MySQL 查询数据教程第14章 MySQL WHERE 子句教程
第15章 MySQL UPDATE 更新教程第16章 MySQL DELETE 语句教程
第17章 MySQL LIKE 子句教程第18章 MySQL UNION教程
第19章 MySQL 排序教程第20章 MySQL 分组教程
第21章 MySQL 连接的使用教程第22章 MySQL NULL 值处理教程
第23章 MySQL 正则表达式教程第24章 MySQL 事务教程
第25章 MySQL ALTER命令教程第26章 MySQL 索引教程
第27章 MySQL 临时表教程第28章 MySQL 复制表教程
第29章 MySQL 元数据教程第30章 MySQL 序列使用教程
第31章 MySQL 处理重复数据教程第32章 MySQL 及 SQL 注入教程
第33章 MySQL 导出数据教程第34章 MySQL 导入数据教程
第35章 MySQL 函数教程第36章 MySQL 运算符教程

寄语

本文有榴莲酱CSDN原创,欢迎点赞、转载,博客地址:https://blog.csdn.net/qq441540598

  • 她平时总与某个人相爱,但她的热情从来得不到回报,所以一直保留着全部的幻想。
  • 在理想的最美好的世界中,一切都是为最美好的目的而设。
  • 为着一个美丽的希望,我们才如此受苦、流泪、滴血。
  • 我对于事业的抱负和梦想,是以“真”为开始,“善”为历程,“美”为最终目标
  • 有时,仅仅需要做的是,往前走一步,哪怕是很小的一步,烦恼疼苦便在你的身后了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴莲酱csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值