English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。
本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。
你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
本章节使用的数据库结构及数据下载:w3codebox-mysql-join-test.sql。
我们在w3codebox数据库中有两张表 tcount_tbl 和 w3codebox_tbl。两张数据表数据如下:
尝试以下示例:
mysql> use w3codebox; Database changed mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | w3codebox_author | w3codebox_count | +---------------+--------------+ | 基础教程网 | 10 | | oldtoolbag.com | 20 | | Google | 22 | +---------------+--------------+ 3 rows in set (0.01 sec) mysql> SELECT * from w3codebox_tbl; +-----------+---------------+---------------+-----------------+ | w3codebox_id | w3codebox_title | w3codebox_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | تعلم PHP | موقع تعليم الأساسيات | 2017-04-12 | | 2 | تعلم MySQL | موقع تعليم الأساسيات | 2017-04-12 | | 3 | تعلم Java | oldtoolbag.com | 2015-05-01 | | 4 | تعلم Python | oldtoolbag.com | 2016-03-06 | | 5 | تعلم C | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 rows in set (0.01 sec)
سنستخدمMySQLINNER JOIN (يمكن أيضًا تمرير INNER و JOIN، ويكون التأثير متساويًا)لإتصال بجدولين أعلاه لقراءة قيمة حقل w3codebox_author في جدول w3codebox_tbl في جدول w3codebox_count في tcount_tbl:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a INNER JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | بقعة التعليم الأساسي | 10 | | 2 | بقعة التعليم الأساسي | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | +-------------+-----------------+----------------+ 4 أسطر في مجموعة (0.00 ثانية)
هذه جملة SQL متساوية
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a, tcount_tbl b WHERE a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | بقعة التعليم الأساسي | 10 | | 2 | بقعة التعليم الأساسي | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.01 sec)
MySQL left join يختلف عن join. MySQL LEFT JOIN سيقرأ جميع بيانات الجدول الأيسر، حتى لو لم يكن هناك بيانات تتناسب مع الجدول الأيمن.
تجربة الأمثلة التالية، لـ w3codebox_tbl للجنب الأيسر،tcount_tbl للجنب الأيمن، تفسير تطبيق MySQL LEFT JOIN:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a LEFT JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | بقعة التعليم الأساسي | 10 | | 2 | بقعة التعليم الأساسي | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
في الأمثلة السابقة تم استخدام LEFT JOIN، هذه الجملة ستقرأ جميع حقول الجدول الأيسر w3codebox_tbl، حتى لو لم يكن هناك بيانات تناسب w3codebox_author في الجدول الأيمن tcount_tbl.
MySQL RIGHT JOIN سيقرأ جميع بيانات الجدول الأيمن، حتى لو لم يكن هناك بيانات تتناسب مع الجدول الأيسر.
تجربة الأمثلة التالية، لـ w3codebox_tbl للجنب الأيسر،tcount_tbl للجنب الأيمن، تفسير تطبيق MySQL RIGHT JOIN:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a RIGHT JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | بقعة التعليم الأساسي | 10 | | 2 | بقعة التعليم الأساسي | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
استخدم JOIN في المثال أعلاه، هذا الجسر سيقرأ جميع الحقول المختارة من جدول tcount_tbl، حتى لو لم يكن هناك قيمة w3codebox_author في جدول w3codebox_tbl.
استخدم دالة mysqli_query() في PHP للتنفيذ جملة SQL، يمكنك استخدام نفس جملة SQL التي تم ذكرها أعلاه كمعامل لدالة mysqli_query().
حاول الأعمدة التالية:
<?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.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a INNER JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author'; mysqli_select_db($conn, 'w3codebox'); $retval = mysqli_query($conn, $sql);} if(! $retval ) { die('فشل في قراءة البيانات: ' . mysqli_error($conn)); } echo '<h2>شبكة تعليميات الأساس MySQL JOIN اختبار<h2>'; echo '<table border="1"><tr><td>تعليميات</td><td>كاتب</td><td>عدد الولوج</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['w3codebox_id']}</td> ". "<td>{$row['w3codebox_author']} </td> ". "<td>{$row['w3codebox_count']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
النتيجة كما ترون في الشكل التالي: