ລາຍການຫົວເລື່ອງ
ວິທີການໃຊ້ inner join ກັບຫຼາຍຕາຕະລາງ ໃນຖານຂໍ້ມູນ MySQL ? ປະສິດທິພາບຂອງ left join ແມ່ນຫຍັງ?
Mysql ການນໍາໃຊ້ການເຊື່ອມຕໍ່
ໃນບົດທີ່ຜ່ານມາ, ພວກເຮົາໄດ້ຮຽນຮູ້ວິທີການອ່ານຂໍ້ມູນຈາກຕາຕະລາງຫນຶ່ງ, ເຊິ່ງຂ້ອນຂ້າງງ່າຍດາຍ, ແຕ່ໃນການນໍາໃຊ້ຕົວຈິງມັນມັກຈະຈໍາເປັນຕ້ອງອ່ານຂໍ້ມູນຈາກຕາຕະລາງຂໍ້ມູນຫຼາຍ.
ໃນບົດນີ້ພວກເຮົາຈະສະແດງໃຫ້ທ່ານເຫັນວິທີການໃຊ້ MySQL's JOIN ເພື່ອສອບຖາມຂໍ້ມູນໃນສອງຕາຕະລາງຫຼືຫຼາຍກວ່ານັ້ນ.
ທ່ານສາມາດໃຊ້ Mysql's JOIN ໃນ SELECT, UPDATE ແລະ DELETE statements ເພື່ອເຂົ້າຮ່ວມການສອບຖາມຫຼາຍຕາຕະລາງ.
JOIN ແບ່ງອອກເປັນສາມປະເພດຕໍ່ໄປນີ້ຕາມໜ້າທີ່ຂອງມັນ:
- ເຂົ້າຮ່ວມພາຍໃນ (ເຂົ້າຮ່ວມພາຍໃນ, ຫຼື equijoin): ເອົາບັນທຶກທີ່ມີຊ່ອງຂໍ້ມູນທີ່ກົງກັນໃນສອງຕາຕະລາງ.
- LEFT JOIN (ເຂົ້າຮ່ວມຊ້າຍ):ເອົາບັນທຶກທັງຫມົດໃນຕາຕະລາງຊ້າຍ, ເຖິງແມ່ນວ່າບໍ່ມີບັນທຶກທີ່ກົງກັນຢູ່ໃນຕາຕະລາງຂວາ.
- RIGHT JOIN (ເຂົ້າຮ່ວມຂວາ): ກົງກັນຂ້າມກັບ LEFT JOIN, ມັນຖືກນໍາໃຊ້ເພື່ອເອົາບັນທຶກທັງຫມົດໃນຕາຕະລາງທີ່ຖືກຕ້ອງ, ເຖິງແມ່ນວ່າບໍ່ມີບັນທຶກການຈັບຄູ່ທີ່ກົງກັນຢູ່ໃນຕາຕະລາງຊ້າຍ.
ໃຊ້ INNER JOIN ໃນ Command Prompt
ພວກເຮົາມີສອງຕາຕະລາງ tcount_tbl ແລະ chenweiliang_tbl ໃນຖານຂໍ້ມູນ chenweiliang.ຂໍ້ມູນຂອງສອງຕາຕະລາງຂໍ້ມູນມີດັ່ງນີ້:
ຕົວຢ່າງ
ລອງໃຊ້ຕົວຢ່າງຕໍ່ໄປນີ້:
ຂໍ້ມູນຕົວຢ່າງການທົດສອບ
mysql> use chenweiliang; Database changed mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | chenweiliang_author | chenweiliang_count | +---------------+--------------+ | 陈沩亮博客 | 10 | | chenweiliang.com | 20 | | Google | 22 | +---------------+--------------+ 3 rows in set (0.01 sec) mysql> SELECT * from chenweiliang_tbl; +-----------+---------------+---------------+-----------------+ | chenweiliang_id | chenweiliang_title | chenweiliang_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | 学习 PHP | 陈沩亮博客 | 2017-04-12 | | 2 | 学习 MySQL | 陈沩亮博客 | 2017-04-12 | | 3 | 学习 Java | chenweiliang.com | 2015-05-01 | | 4 | 学习 Python | chenweiliang.com | 2016-03-06 | | 5 | 学习 C | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 rows in set (0.01 sec)
ຕໍ່ໄປ, ພວກເຮົາຈະໃຊ້ INNER JOIN ຂອງ MySQL (ທ່ານສາມາດຕັດ INNER ແລະໃຊ້ JOIN, ຜົນກະທົບແມ່ນຄືກັນ) ເພື່ອເຊື່ອມຕໍ່ສອງຕາຕະລາງຂ້າງເທິງ ແລະອ່ານຄ່າຂອງພາກສະໜາມ chenweiliang_author ໃນຕາຕະລາງ chenweiliang_tbl ແລະຄ່າພາກສະໜາມ chenweiliang_count ທີ່ສອດຄ້ອງກັນໃນຕາຕະລາງ tcount_tbl:
INNER JOIN
mysql> SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a INNER JOIN tcount_tbl b ON a.chenweiliang_author = b.chenweiliang_author; +-------------+-----------------+----------------+ | a.chenweiliang_id | a.chenweiliang_author | b.chenweiliang_count | +-------------+-----------------+----------------+ | 1 | 陈沩亮博客 | 10 | | 2 | 陈沩亮博客 | 10 | | 3 | chenweiliang.com | 20 | | 4 | chenweiliang.com | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.00 sec)
ຄໍາຖະແຫຼງທີ່ SQL ຂ້າງເທິງແມ່ນທຽບເທົ່າກັບ:
WHERE ຂໍ້
mysql> SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a, tcount_tbl b WHERE a.chenweiliang_author = b.chenweiliang_author; +-------------+-----------------+----------------+ | a.chenweiliang_id | a.chenweiliang_author | b.chenweiliang_count | +-------------+-----------------+----------------+ | 1 | 陈沩亮博客 | 10 | | 2 | 陈沩亮博客 | 10 | | 3 | chenweiliang.com | 20 | | 4 | chenweiliang.com | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.01 sec)
ເຂົ້າຮ່ວມ MySQL ຊ້າຍ
MySQL ຊ້າຍເຂົ້າຮ່ວມແມ່ນແຕກຕ່າງຈາກເຂົ້າຮ່ວມ. MySQL LEFT JOIN ຈະອ່ານຂໍ້ມູນທັງຫມົດໃນຕາຕະລາງຂໍ້ມູນຊ້າຍ, ເຖິງແມ່ນວ່າຕາຕະລາງຂວາບໍ່ມີຂໍ້ມູນທີ່ສອດຄ້ອງກັນ.
ຕົວຢ່າງ
ລອງໃຊ້ຕົວຢ່າງຕໍ່ໄປນີ້, ໂດຍໃຊ້ chenweiliang_tbl ເປັນຕາຕະລາງເບື້ອງຊ້າຍ ແລະ tcount_tbl ເປັນຕາຕະລາງເບື້ອງຂວາ, ເພື່ອເຂົ້າໃຈການນຳໃຊ້ MySQL LEFT JOIN:
ເຂົ້າຮ່ວມຊ້າຍ
mysql> SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a LEFT JOIN tcount_tbl b ON a.chenweiliang_author = b.chenweiliang_author; +-------------+-----------------+----------------+ | a.chenweiliang_id | a.chenweiliang_author | b.chenweiliang_count | +-------------+-----------------+----------------+ | 1 | 陈沩亮博客 | 10 | | 2 | 陈沩亮博客 | 10 | | 3 | chenweiliang.com | 20 | | 4 | chenweiliang.com | 20 | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
ໃນຕົວຢ່າງຂ້າງເທິງ, LEFT JOIN ຖືກນໍາໃຊ້, ແລະຄໍາຖະແຫຼງນີ້ຈະອ່ານຂໍ້ມູນພາກສະຫນາມທີ່ເລືອກທັງຫມົດຂອງຕາຕະລາງຂໍ້ມູນ chenweiliang_tbl ຢູ່ເບື້ອງຊ້າຍ, ເຖິງແມ່ນວ່າບໍ່ມີຄ່າພາກສະຫນາມທີ່ສອດຄ້ອງກັນຂອງ chenweiliang_author ໃນຕາຕະລາງ tcount_tbl ທາງດ້ານຂວາ.
ເຂົ້າຮ່ວມ MySQL
MySQL RIGHT JOIN ຈະອ່ານຂໍ້ມູນທັງໝົດໃນຕາຕະລາງຂໍ້ມູນຢູ່ເບື້ອງຂວາ, ເຖິງແມ່ນວ່າບໍ່ມີຂໍ້ມູນກົງກັນໃນຕາຕະລາງຢູ່ເບື້ອງຊ້າຍ.
ຕົວຢ່າງ
ລອງໃຊ້ຕົວຢ່າງຕໍ່ໄປນີ້, ໂດຍໃຊ້ chenweiliang_tbl ເປັນຕາຕະລາງເບື້ອງຊ້າຍ ແລະ tcount_tbl ເປັນຕາຕະລາງເບື້ອງຂວາ, ເພື່ອເຂົ້າໃຈການນຳໃຊ້ MySQL RIGHT JOIN:
ເຂົ້າຮ່ວມສິດ
mysql> SELECT a.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a RIGHT JOIN tcount_tbl b ON a.chenweiliang_author = b.chenweiliang_author; +-------------+-----------------+----------------+ | a.chenweiliang_id | a.chenweiliang_author | b.chenweiliang_count | +-------------+-----------------+----------------+ | 1 | 陈沩亮博客 | 10 | | 2 | 陈沩亮博客 | 10 | | 3 | chenweiliang.com | 20 | | 4 | chenweiliang.com | 20 | | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
RIGHT JOIN ຖືກນໍາໃຊ້ໃນຕົວຢ່າງຂ້າງເທິງ, ຄໍາຖະແຫຼງນີ້ຈະອ່ານຂໍ້ມູນພາກສະຫນາມທີ່ເລືອກທັງຫມົດຂອງຕາຕະລາງຂໍ້ມູນທີ່ຖືກຕ້ອງ tcount_tbl, ເຖິງແມ່ນວ່າບໍ່ມີຄ່າພາກສະຫນາມ chenweiliang_author ທີ່ສອດຄ້ອງກັນໃນຕາຕະລາງຊ້າຍ chenweiliang_tbl.
ການນໍາໃຊ້ JOIN ໃນ PHP script
ຟັງຊັນ mysqli_query() ຖືກນໍາໃຊ້ໃນ PHP ເພື່ອປະຕິບັດຄໍາສັ່ງ SQL, ທ່ານສາມາດນໍາໃຊ້ຄໍາສັ່ງ SQL ດຽວກັນກັບຂ້າງເທິງເປັນພາລາມິເຕີຂອງຟັງຊັນ mysqli_query().
ລອງໃຊ້ຕົວຢ່າງຕໍ່ໄປນີ້:
MySQL ORDER ໂດຍການທົດສອບ:
<?
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.chenweiliang_id, a.chenweiliang_author, b.chenweiliang_count FROM chenweiliang_tbl a INNER JOIN tcount_tbl b ON a.chenweiliang_author = b.chenweiliang_author';
mysqli_select_db( $conn, 'chenweiliang' );
$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, MYSQL_ASSOC))
{
echo "<tr><td> {$row['chenweiliang_id']}</td> ".
"<td>{$row['chenweiliang_author']} </td> ".
"<td>{$row['chenweiliang_count']} </td> ".
"</tr>";
}
echo '</table>';
mysqli_close($conn);
?>ຫວັງວ່າ ບົດຄວາມ "ການໃຊ້ຖານຂໍ້ມູນ MySQL ການເຊື່ອມຕໍ່ພາຍໃນໃນຫຼາຍຕາຕະລາງ? ປະສິດທິພາບຂອງການເຊື່ອມຕໍ່ຊ້າຍ" ທີ່ແບ່ງປັນໃນ ບລັອກຂອງ Chen Weiliang ( https://www.chenweiliang.com/ ) ຈະເປັນປະໂຫຍດຕໍ່ທ່ານ.
ຮູ້ສຶກວ່າບໍ່ເສຍຄ່າທີ່ຈະແບ່ງປັນລິ້ງຂອງບົດຄວາມນີ້: https://www.chenweiliang.com/cwl-488.html
