Article Directory
MySQL маалымат базасында бир нече таблицалар менен ички бириктирүүнү кантип колдонсо болот ? Сол жактагы бириктирүүнүн эффективдүүлүгү кандай?
MySQL Байланыштарды колдонуу
Мурунку бөлүмдөрдө биз бир таблицадагы маалыматтарды окууну үйрөндүк, бул салыштырмалуу жөнөкөй, бирок реалдуу тиркемелерде көп учурда бир нече маалымат таблицаларынан маалыматтарды окуу керек болот.
Бул бөлүмдө биз эки же андан көп таблицалардагы маалыматтарды суроо үчүн MySQL'тин JOINди кантип колдонууну тааныштырабыз.
Бир нече таблица сурамдарына кошулуу үчүн SELECT, UPDATE жана DELETE билдирүүлөрүндө Mysql'дин JOIN колдонсоңуз болот.
JOIN функциялары боюнча болжол менен төмөнкү үч категорияга бөлүнөт:
- INNER JOIN (ички кошулуу же эквиваленттүү кошулуу): Эки таблицадагы талаа дал келген мамилелердин жазууларын алыңыз.
- LEFT JOIN (солго кошулуу):Оң таблицада тиешелүү жазуулар жок болсо да, сол таблицадагы бардык жазууларды алыңыз.
- ОҢ КОШУЛУУ (оңго кошулуу): LEFT JOINден айырмаланып, ал оң жадыбалдагы бардык жазууларды алуу үчүн колдонулат, ал тургай, сол жадыбалда тиешелүү жазуулар жок болсо да.
Буйрук тилкесинде INNER JOIN колдонуу
Бизде chenweiliang маалымат базасында tcount_tbl жана chenweiliang_tbl деген эки таблица бар. Эки маалымат таблицасындагы маалыматтар төмөнкүдөй:
Instance
Төмөнкү мисалдарды колдонуп көрүңүз:
Сыноо үлгүсү
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)
Андан кийин, биз жогорудагы эки таблицаны бириктирүү жана chenweiliang_tbl таблицасындагы chenweiliang_author талаасынын маанилерин жана аларга тиешелүү tcount_tbl таблицасындагы chenweiliang_count талаасынын маанилерин окуу үчүн MySQLдин INNER JOIN функциясын колдонобуз (сиз INNER функциясын өткөрүп жиберип, JOIN функциясын колдоно аласыз, натыйжасы бирдей) :
ички 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 оң жадыбалда тиешелүү маалыматтар жок болсо да, сол жактагы маалыматтар таблицасындагы бардык маалыматтарды окуйт.
Instance
MySQL LEFT JOIN колдонуусун түшүнүү үчүн төмөнкү мисалды колдонуп көрүңүз, сол жадыбал катары chenweiliang_tbl жана оң жадыбал катары tcount_tbl колдонуп:
СОЛ КОШУЛУУ
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 жогорудагы мисалда колдонулат. Бул билдирүү оң жактагы tcount_tbl таблицасында тиешелүү chenweiliang_author талаасынын мааниси жок болсо да, сол жактагы chenweiliang_tbl маалымат таблицасындагы бардык тандалган талаа маалыматтарын окуйт.
MySQL ОҢГО КОШУЛУУ
MySQL RIGHT JOIN, сол жадыбалда тиешелүү маалыматтар жок болсо да, оң маалымат таблицасындагы бардык маалыматтарды окуйт.
Instance
MySQL RIGHT JOIN колдонууну түшүнүү үчүн төмөнкү мисалды колдонуп көрүңүз, сол жагындагы таблица катары chenweiliang_tbl жана оң жагындагы таблица катары tcount_tbl колдонуп:
ТУУРА КОШУЛУУ
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 жогорудагы мисалда колдонулат. Бул билдирме chenweiliang_tbl сол жадыбалында тиешелүү chenweiliang_author талаасынын мааниси жок болсо да, tcount_tbl оң маалымат таблицасындагы бардык тандалган талаа маалыматтарын окуйт.
PHP скрипттеринде JOIN колдонуу
mysqli_query() функциясы PHPде SQL операторлорун аткаруу үчүн колдонулат.Сиз жогорудагы ошол эле SQL операторун mysqli_query() функциясынын параметри катары колдонсоңуз болот.
Төмөнкү мисалды колдонуп көрүңүз:
Сыноо боюнча MySQL ТАРТИП:
<?
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);
?>Чен Вэйлиангдын блогунда ( https://www.chenweiliang.com/ ) бөлүшүлгөн "MySQL маалымат базасынын ички бириктирүүсүн бир нече таблицаларда колдонуу? Сол жактагы бириктирүүнүн натыйжалуулугу" деген макала сизге пайдалуу болот деп үмүттөнөбүз.
Бул макаланын шилтемеси менен бөлүшүүдөн тартынбаңыз: https://www.chenweiliang.com/cwl-488.html
