English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL JOIN 사용

이전 장에서는 하나의 테이블에서 데이터를 읽는 방법을 배웠습니다. 이는 상대적으로 간단하지만, 실제 응용 프로그램에서는 여러 데이터 테이블에서 데이터를 읽는 것이 자주 필요합니다。

이 장에서는 MySQL의 JOIN을 사용하여 두 개나 많은 테이블에서 데이터를 쿼리하는 방법을 소개할 것입니다。

SELECT, UPDATE 및 DELETE 문에서 MySQL의 JOIN을 사용하여 다중 테이블을 조인할 수 있습니다。

JOIN은 기능에 따라 다음과 같은 세 가지 주요 카테고리로 나뉩니다:

  • INNER JOIN(내 조인, 또는 등가 조인):두 테이블의 필드 매칭 관계를 가진 기록을 가져옵니다。

  • LEFT JOIN(왼쪽 조인):왼쪽 테이블의 모든 기록을 가져옵니다. 오른쪽 테이블에 해당하는 기록이 없더라도。

  • RIGHT JOIN(오른쪽 조인): LEFT JOIN과 반대로, 왼쪽 테이블에 해당하는 기록이 없더라도 오른쪽 테이블의 모든 기록을 가져옵니다。

이 장에서 사용하는 데이터베이스 구조 및 데이터 다운로드는 다음과 같습니다:w3codebox-mysql-join-test.sql

명령 프롬프트에서 INNER JOIN을 사용하여

우리는 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)

그제서야 MySQL의INNER JOIN(INNER를 생략할 수도 있으며, 결과는 같습니다)위 두 테이블을 연결하여 w를 읽기 위해 사용합니다3codebox_tbl 테이블에 모든 w3codebox_author 필드가 tcount_tbl 테이블에 해당하는 w3codebox_count 필드 값:

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 | NULL |
| 4           | oldtoolbag.com | 20 | NULL |
+-------------+-----------------+----------------+
4 rows in set (0.00 sec)

위 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 | NULL |
| 4           | oldtoolbag.com | 20 | NULL |
+-------------+-----------------+----------------+
4 rows in set (0.01 sec)

MySQL LEFT JOIN

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 | NULL |
| 4           | oldtoolbag.com | 20 | NULL |
| 5           | FK              | NULL           |
+-------------+-----------------+----------------+
5 rows in set (0.01 sec)

위 예제에서 LEFT JOIN이 사용되었습니다. 이 문장은 왼쪽 데이터 테이블 w를 읽습니다;3codebox_tbl의 모든 선택된 필드 데이터를 읽습니다. 오른쪽 테이블 tcount_tbl에 해당하는 w가 없더라도;3codebox_author 필드 값.

MySQL RIGHT JOIN

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 | NULL |
| 4           | oldtoolbag.com | 20 | NULL |
| NULL | NULL | NULL | 22             |
+-------------+-----------------+----------------+
5 rows in set (0.01 sec)

위 예제에서 RIGHT JOIN을 사용했습니다. 이 문장은 왼쪽 테이블 w에서 선택된 모든 필드 데이터를 읽습니다. 그리고 왼쪽 테이블 w에 해당하는 데이터가 없더라도.3codebox_tbl에 해당하는 w가 없습니다.3codebox_author 필드 값.

PHP 스크립트에서 JOIN 사용

PHP 스크립트에서 mysqli_query() 함수를 사용하여 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, 'w' )}3codebox' );
$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, 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);
?>

출력 결과는 다음과 같습니다: