MySQL 连接的使用
在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。
本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。
你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
●INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
●LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
●RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
在命令提示符中使用 INNER JOIN
我们制作了两张样表 tcount_tbl 和 gtxyzz_tbl。两张数据表数据如下:
实例
尝试以下实例:
测试实例数据
mysql>useGTXYZZ; Databasechanged mysql>SELECT*FROMtcount_tbl; +---------------+--------------+ |tcount_author|tcount_count| +---------------+--------------+ |1818IP|20| |Google|25| |Java教程|10| |MySQL教程|10| |SQL教程|10| |京东|30| +---------------+--------------+ 6rowsinset(0.00sec)
mysql>SELECT*FROMgtxyzz_tbl; +-----------+--------------+---------------+-----------------+ |gtxyzz_id|gtxyzz_title|gtxyzz_author|submission_date| +-----------+--------------+---------------+-----------------+ |1|学习MySQL|MySQL教程|2022-03-21| |2|学习css|css教程|2022-03-20| |3|学习SQL|SQL教程|2022-01-01| |4|学习Java|Java教程|2022-03-21| +-----------+--------------+---------------+-----------------+ 4rowsinset(0.00sec)
接下来我们就使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取gtxyzz_tbl表中所有gtxyzz_author字段在tcount_tbl表对应的gtxyzz_count字段值:
INNER JOIN
mysql>SELECTa.gtxyzz_id,a.gtxyzz_author,b.tcount_countFROMgtxyzz_tblaINNERJOINtcount_tblbONa.gtxyzz_author=b.tcount_author; +-----------+---------------+--------------+ |gtxyzz_id|gtxyzz_author|tcount_count| +-----------+---------------+--------------+ |1|MySQL教程|10| |3|SQL教程|10| |4|Java教程|10| +-----------+---------------+--------------+ 3rowsinset(0.00sec)
以上 SQL 语句等价于:
WHERE 子句
mysql>SELECTa.gtxyzz_id,a.gtxyzz_author,tcount_countFROMgtxyzz_tbla,tcount_tblbWHEREa.gtxyzz_author=b.tcount_author; +-----------+---------------+--------------+ |gtxyzz_id|gtxyzz_author|tcount_count| +-----------+---------------+--------------+ |1|MySQL教程|10| |3|SQL教程|10| |4|Java教程|10| +-----------+---------------+--------------+ 3rowsinset(0.00sec)
MySQL LEFT JOIN
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
实例
尝试以下实例,以 gtxyzz_tbl 为左表,tcount_tbl 为右表,理解 MySQL LEFT JOIN 的应用:
LEFT JOIN
mysql>SELECTa.gtxyzz_id,a.gtxyzz_author,tcount_countFROMgtxyzz_tblaLEFTJOINtcount_tblbONa.gtxyzz_author=b.tcount_author; +-----------+---------------+--------------+ |gtxyzz_id|gtxyzz_author|tcount_count| +-----------+---------------+--------------+ |1|MySQL教程|10| |2|css教程|NULL| |3|SQL教程|10| |4|Java教程|10| +-----------+---------------+--------------+ 4rowsinset(0.00sec)
以上实例中使用了 LEFT JOIN,该语句会读取左边的数据表 gtxyzz_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl中 没有对应的 gtxyzz_author 字段值。
MySQL RIGHT JOIN
MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
实例
尝试以下实例,以 gtxyzz_tbl 为左表,tcount_tbl 为右表,理解MySQL RIGHT JOIN的应用:
RIGHT JOIN
mysql>SELECTa.gtxyzz_id,a.gtxyzz_author,tcount_countFROMgtxyzz_tblaRIGHTJOINtcount_tblbONa.gtxyzz_author=b.tcount_author; +-----------+---------------+--------------+ |gtxyzz_id|gtxyzz_author|tcount_count| +-----------+---------------+--------------+ |NULL|NULL|20| |NULL|NULL|25| |4|Java教程|10| |1|MySQL教程|10| |3|SQL教程|10| |NULL|NULL|30| +-----------+---------------+--------------+ 6rowsinset(0.00sec)
以上实例中使用了 RIGHT JOIN,该语句会读取右边的数据表 tcount_tbl 的所有选取的字段数据,即便在左侧表 gtxyzz_tbl 中没有对应的gtxyzz_author 字段值。
在 PHP 脚本中使用 JOIN
PHP 中使用 mysqli_query() 函数来执行 SQL 语句,你可以使用以上的相同的 SQL 语句作为 mysqli_query() 函数的参数。
尝试如下实例:
MySQL ORDER BY 测试:
<?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,"setnamesutf8"); $sql='SELECTa.gtxyzz_id,a.gtxyzz_author,tcount_countFROMgtxyzz_tblaINNERJOINtcount_tblbONa.gtxyzz_author=b.tcount_author'; mysqli_select_db($conn,'GTXYZZ'); $retval=mysqli_query($conn,$sql); if(!$retval) { die('无法读取数据:'.mysqli_error($conn)); } echo'<h2>1818IP教程MySQLJOIN测试<h2>'; echo'<tableborder="1"><tr><td>教程ID</td><td>作者</td><td>登陆次数</td></tr>'; while($row=mysqli_fetch_array($retval,MYSQLI_ASSOC)) { echo"<tr><td>{$row['gtxyzz_id']}</td>". "<td>{$row['gtxyzz_author']}</td>". "<td>{$row['gtxyzz_count']}</td>". "</tr>"; } echo'</table>'; mysqli_close($conn); ?>