Artikkelihakemisto
Kuinka käyttää sisäistä liitosta useiden taulukoiden kanssa MySQL-tietokannassa ? Mikä on vasemman liitoksen tehokkuus?
Mysql yhteyden käyttöä
Aiemmissa luvuissa olemme oppineet lukemaan tietoja yhdestä taulukosta, mikä on suhteellisen yksinkertaista, mutta todellisissa sovelluksissa on usein tarpeen lukea tietoja useista tietotaulukoista.
Tässä luvussa näytämme, kuinka voit käyttää MySQL:n JOIN-toimintoa kahden tai useamman taulukon tietojen kyselyyn.
Voit käyttää Mysql:n JOIN-komentoa SELECT-, UPDATE- ja DELETE-käskyissä usean taulukon kyselyjen yhdistämiseen.
JOIN on karkeasti jaettu kolmeen luokkaan sen toiminnan mukaan:
- INNER JOIN (sisäliitos tai tasaliitos): Hae tietueet, joissa on vastaavat kentät kahdessa taulukossa.
- LEFT JOIN (vasen liittyminen):Hae kaikki tietueet vasemmassa taulukossa, vaikka oikeanpuoleisessa taulukossa ei olisi vastaavia tietueita.
- RIGHT JOIN (oikea liittyminen): Toisin kuin LEFT JOIN, sitä käytetään saamaan kaikki tietueet oikeaan taulukkoon, vaikka vasemmassa taulukossa ei olisi vastaavia tietueita.
INNER JOIN käyttö komentokehotteessa
Meillä on kaksi taulukkoa tcount_tbl ja chenweiliang_tbl chenweiliang-tietokannassa.Kahden tietotaulukon tiedot ovat seuraavat:
Ilmentymä
Kokeile seuraavia esimerkkejä:
testiesiintymän tiedot
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)
Seuraavaksi käytämme MySQL:n INNER JOIN -funktiota (voit jättää INNER-funktion pois ja käyttää JOIN-funktiota, vaikutus on sama) yhdistääksemme kaksi yllä olevaa taulukkoa ja lukeaksemme chenweiliang_tbl-taulukon chenweiliang_author-kentän arvot ja niitä vastaavat chenweiliang_count-kenttien arvot tcount_tbl-taulukosta:
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)
Yllä oleva SQL-lause vastaa:
WHERE-lauseke
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 LEFT LIITY
MySQL vasen liittyminen on eri asia kuin join. MySQL LEFT JOIN lukee kaikki tiedot vasemmassa tietotaulukossa, vaikka oikealla taulukolla ei olisi vastaavaa tietoa.
Ilmentymä
Kokeile seuraavaa esimerkkiä, jossa vasemmanpuoleisena taulukkona on chenweiliang_tbl ja oikeanpuoleisena taulukkona tcount_tbl , ymmärtääksesi MySQL LEFT JOIN -funktion sovelluksen:
LEFT LIITY
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)
Yllä olevassa esimerkissä käytetään LEFT JOIN, ja tämä käsky lukee kaikki vasemmalla olevan tietotaulukon chenweiliang_tbl valitut kenttätiedot, vaikka oikeanpuoleisessa taulukossa tcount_tbl ei olisi vastaavaa chenweiliang_author-kentän arvoa.
MySQL RIGHT LIITY
MySQL RIGHT JOIN lukee kaikki tiedot oikealla olevasta tietotaulukosta, vaikka vastaavaa tietoa ei olisi vasemmalla olevassa taulukossa.
Ilmentymä
Kokeile seuraavaa esimerkkiä, jossa vasemmanpuoleisena taulukkona käytetään chenweiliang_tbl: ää ja oikeanpuoleisena taulukkona tcount_tbl:ää, ymmärtääksesi MySQL RIGHT JOIN -komennon sovelluksen:
OIKEA LIITTYMINEN
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)
Yllä olevassa esimerkissä käytetään RIGHT JOIN -käskyä, tämä käsky lukee kaikki oikean tietotaulukon tcount_tbl valitut kenttätiedot, vaikka vasemmassa taulukossa chenweiliang_tbl ei olisi vastaavaa chenweiliang_author -kentän arvoa.
JOIN käyttö PHP-skriptissä
Mysqli_query()-funktiota käytetään PHP:ssä SQL-lauseiden suorittamiseen, voit käyttää samaa SQL-lausetta kuin yllä mysqli_query()-funktion parametrina.
Kokeile seuraavaa esimerkkiä:
MySQL ORDER BY testi:
<?
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);
?>Toivottavasti Chen Weiliangin blogissa ( https://www.chenweiliang.com/ ) jaetusta artikkelista "MySQL-tietokannan sisäisen liitoksen käyttö useissa taulukoissa? Vasemman liitoksen tehokkuus" on sinulle hyötyä.
Voit vapaasti jakaa tämän artikkelin linkin: https://www.chenweiliang.com/cwl-488.html
