课程表

MySQL课程

工具箱
速查手册

Mysql 连接的使用

当前位置:免费教程 » 数据库/运维 » MySQL

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

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

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

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

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

本章节使用的数据库结构及数据下载:W3xue.sql


在命令提示符中使用 INNER JOIN

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

实例

尝试以下实例:

  1. root@host# mysql -u root -p password;
  2. Enter password:*******
  3. mysql> use W3xue;
  4. Database changed
  5. mysql> SELECT * FROM tcount_tbl;
  6. +-----------------+----------------+
  7. | W3xue_author | W3xue_count |
  8. +-----------------+----------------+
  9. | mahran | 20 |
  10. | mahnaz | NULL |
  11. | Jen | NULL |
  12. | Gill | 20 |
  13. | John Poul | 1 |
  14. | Sanjay | 1 |
  15. +-----------------+----------------+
  16. 6 rows in set (0.01 sec)
  17. mysql> SELECT * from W3xue_tbl;
  18. +-------------+----------------+-----------------+-----------------+
  19. | W3xue_id | W3xue_title | W3xue_author | submission_date |
  20. +-------------+----------------+-----------------+-----------------+
  21. | 1 | Learn PHP | John Poul | 2007-05-24 |
  22. | 2 | Learn MySQL | Abdul S | 2007-05-24 |
  23. | 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
  24. +-------------+----------------+-----------------+-----------------+
  25. 3 rows in set (0.00 sec)
  26. mysql>

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

  1. mysql> SELECT a.W3xue_id, a.W3xue_author, b.W3xue_count FROM W3xue_tbl a INNER JOIN tcount_tbl b ON a.W3xue_author = b.W3xue_author;
  2. +-----------+---------------+--------------+
  3. | W3xue_id | W3xue_author | W3xue_count |
  4. +-----------+---------------+--------------+
  5. | 1 | John Poul | 1 |
  6. | 3 | Sanjay | 1 |
  7. +-----------+---------------+--------------+
  8. 2 rows in set (0.00 sec)

以上 SQL 语句等价于:

  1. mysql> SELECT a.W3xue_id, a.W3xue_author, b.W3xue_count FROM W3xue_tbl a, tcount_tbl b WHERE a.W3xue_author = b.W3xue_author;
  2. +-------------+-----------------+----------------+
  3. | W3xue_id | W3xue_author | W3xue_count |
  4. +-------------+-----------------+----------------+
  5. | 1 | John Poul | 1 |
  6. | 3 | Sanjay | 1 |
  7. +-------------+-----------------+----------------+
  8. 2 rows in set (0.01 sec)
  9. mysql>


MySQL LEFT JOIN

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

实例

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

  1. root@host# mysql -u root -p password;
  2. Enter password:*******
  3. mysql> use W3xue;
  4. Database changed
  5. mysql> SELECT a.W3xue_id, a.W3xue_author, b.W3xue_count FROM W3xue_tbl a LEFT JOIN tcount_tbl b ON a.W3xue_author = b.W3xue_author;
  6. +-------------+-----------------+----------------+
  7. | W3xue_id | W3xue_author | W3xue_count |
  8. +-------------+-----------------+----------------+
  9. | 1 | John Poul | 1 |
  10. | 2 | Abdul S | NULL |
  11. | 3 | Sanjay | 1 |
  12. +-------------+-----------------+----------------+
  13. 3 rows in set (0.02 sec)

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


MySQL RIGHT JOIN

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

实例

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

  1. root@host# mysql -u root -p password;
  2. Enter password:*******
  3. mysql> use W3xue;
  4. Database changed
  5. mysql> SELECT b.W3xue_id, b.W3xue_author, a.W3xue_count FROM tcount_tbl a RIGHT JOIN W3xue_tbl b ON a.W3xue_author = b.W3xue_author;
  6. +-------------+-----------------+----------------+
  7. | W3xue_id | W3xue_author | W3xue_count |
  8. +-------------+-----------------+----------------+
  9. | 1 | John Poul | 1 |
  10. | 2 | Abdul S | NULL |
  11. | 3 | Sanjay | 1 |
  12. +-------------+-----------------+----------------+
  13. 3 rows in set (0.02 sec)

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


在PHP脚本中使用JOIN

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

尝试如下实例:

  1. <?php
  2. $dbhost = 'localhost:3036';
  3. $dbuser = 'root';
  4. $dbpass = 'rootpassword';
  5. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  6. if(! $conn )
  7. {
  8. die('Could not connect: ' . mysql_error());
  9. }
  10. $sql = 'SELECT a.W3xue_id, a.W3xue_author, b.W3xue_count FROM W3xue_tbl a INNER JOIN tcount_tbl b ON a.W3xue_author = b.W3xue_author';
  11.  
  12. mysql_select_db('W3xue');
  13. $retval = mysql_query( $sql, $conn );
  14. if(! $retval )
  15. {
  16. die('Could not get data: ' . mysql_error());
  17. }
  18. while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
  19. {
  20. echo "Author:{$row['W3xue_author']} <br> ".
  21. "Count: {$row['W3xue_count']} <br> ".
  22. "Tutorial ID: {$row['W3xue_id']} <br> ".
  23. "--------------------------------<br>";
  24. }
  25. echo "Fetched data successfully\n";
  26. mysql_close($conn);
  27. ?>
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号