내부 조인 (INNER JOIN)은 일치하는 키 값의 데이터만 출력합니다. 2개의 테이블의 컬럼 과 컬럼을 처리하여 데이터를 출력합니다. 내부 조인은 JOIN 키워드 외에 INNER JOIN 이라고 입력해도 됩니다.
| 쿼리 문법 |
SELECT 컬럼, 컬럼 from 테이블1 JOIN 테이블2 ON 테이블1.컬럼 = 테이블2.컬럼;
위의 문법은 간단한 JOIN입니다. 결합되는 조건은 JOIN 키워드 다음에 결합할 테이블명 과 키 값의 조건을 작성합니다. 결합 조건 ON 키워드 다음에 결합의 기준이 되는 컬럼 조 건을 설정합니다.
컬럼의 조건을 선언할 때는 컬럼명과는 의미가 없습니다. 즉 JOIN 결합하고자 하는 테이 블에 일치하는 이름의 컬럼을 만들거나, 이름 규격을 유지하지 않아도 됩니다. 예로 table1.aaa = table2.bbb 형태로 작성해도 됩니다.
20.1.1 쿼리 실습
JOIN 키워드를 통하여 내부 조인 처리 방법을 실습해 보도록 하겠습니다. 다음 예제는 회원 테이블과 주문 목록 테이블의 데이터를 결합합니다. 결합하는 조건은 각각의 테이블에 있는 이메일 주소 값을 기준으로 합니다.
| 예제 쿼리 |
SELECT * from members JOIN orders1 ON members.email = orders1.email;
| 콘솔 실습 화면 |
mysql> SELECT * from members JOIN orders1 ON members.email = orders1.email;
+----+----------+-----------+-----------+-------+---------+-----------+-------------------+----+-------+-------------------+
| Id | LastName | FirstName | Address | City | Country | manager | email | Id | code | email |
+----+----------+-----------+-----------+-------+---------+-----------+-------------------+----+-------+-------------------+
| 1 | hojin | lee | shinchon | seoul | korea | infohojin | hojin@jinyphp.com | 1 | O_001 | hojin@jinyphp.com |
| 1 | hojin | lee | shinchon | seoul | korea | infohojin | hojin@jinyphp.com | 2 | O_002 | hojin@jinyphp.com |
| 4 | eric | jung | seocho-gu | busan | korea | info | eric@jinyphp.com | 3 | O_003 | eric@jinyphp.com |
+----+----------+-----------+-----------+-------+---------+-----------+-------------------+----+-------+-------------------+
3 rows in set (0.00 sec)
이메일 주소가 동일한 데이터를 기준으로 2개의 테이블의 데이터가 출력됩니다.
JOIN은 컬럼 안에 들어 있는 데이터를 기준으로 결합합니다. 만일 2개 테이블의 컬럼 이 름이 동일하다면 USING 키워드를 이용하여 조건 값 앞에 붙어 있는 테이블명을 생략할 수 있습니다.
| 예제 쿼리 |
SELECT * from members JOIN orders1 ON USING(email);
와일드 카드 *
는 결합되는 테이블의 모든 컬럼 필드가 출력됩니다. 출력할 컬럼을 직접 입 력하면 선택된 컬럼만 출력됩니다. 컬럼을 선택할 때는 테이블명.컬럼명 형태로 입력합니다.
| 콘솔 실습 화면 |
mysql> SELECT members.FirstName, members.LastName, orders1.code, orders1.email from members JOIN orders1 ON members.email = orders1.email;
+-----------+----------+-------+-------------------+
| FirstName | LastName | code | email |
+-----------+----------+-------+-------------------+
| lee | hojin | O_001 | hojin@jinyphp.com |
| lee | hojin | O_002 | hojin@jinyphp.com |
| jung | eric | O_003 | eric@jinyphp.com |
+-----------+----------+-------+-------------------+
3 rows in set (0.01 sec)
조인 결합 시에는 테이블명과 컬럼명을 함께 입력하기 때문에 쿼리의 작성 문법이 길어질 수 있습니다. 또한 길어진 이름은 철자 오류를 발생할 수도 있습니다. 이런 경우 별칭을 이용하면 매우 편리합니다.
별칭은 테이블명, 컬럼 이름 모두 사용 가능합니다. 별칭을 사용하면 길어진 이름을 짧게 처리할 수 있습니다.
| 콘솔 실습 화면 |
mysql> SELECT a.FirstName, a.LastName, b.code, b.email from members AS a JOIN orders1 as b ON a.email = b.email;
+-----------+----------+-------+-------------------+
| FirstName | LastName | code | email |
+-----------+----------+-------+-------------------+
| lee | hojin | O_001 | hojin@jinyphp.com |
| lee | hojin | O_002 | hojin@jinyphp.com |
| jung | eric | O_003 | eric@jinyphp.com |
+-----------+----------+-------+-------------------+
3 rows in set (0.00 sec)
20.1.2 조건 추가
JOIN으로 결합된 출력 결과에 추가로 WHERE 조건을 설정하여 데이터를 필터링할 수 있습니다. 다음 예제는 별칭을 이용하여 JOIN을 설정합니다. 또한 Where 조건을 추가하여 데이터를 출력합니다.
| 예제 쿼리 |
SELECT a.FirstName, a.LastName, b.code, b.email from members AS a JOIN orders1 as b ON a.email=b.email WHERE a.email = 'eric@hojin.io';
| 콘솔 실습 화면 |
mysql> SELECT a.FirstName, a.LastName, b.code, b.email from members AS a JOIN orders1 as b ON a.email=b.email WHERE a.email = 'eric@jinyphp.com';
+-----------+----------+-------+------------------+
| FirstName | LastName | code | email |
+-----------+----------+-------+------------------+
| jung | eric | O_003 | eric@jinyphp.com |
+-----------+----------+-------+------------------+
1 row in set (0.00 sec)
출력 결과에서 조건을 추가하여 결과를 필터링합니다.
20.1.3 다수 테이블
JOIN은 여러 개의 테이블의 데이터를 필터링하여 결과를 결합할 수 있습니다.
| 쿼리 문법 |
SELECT 컬럼, 컬럼 from 테이블1 JOIN 테이블2 ON 테이블1.컬럼 = 테이블2.컬럼 JOIN 테이블3 ON USING (컬럼) ... JOIN 테이블4 ON 테이블1.컬럼 = 테이블4.컬럼;
JOIN 키워드를 통하여 결합 조건을 연결하면 됩니다.
20.1.4 PHP 실습
PHP 코드를 통하여 JOIN 결합 처리를 실습해 보도록 합니다. 내부 조인 메서드를 추가 하여 실습하도록 하겠습니다.
| PHP 예제 | mysql.class.php 파일에 메서드 예제를 추가합니다.
// 내부조인을 처리합니다.
public function innerJoin($tbname1, $tbname2, $onWhere, $fields)
{
$queryString = "SELECT ";
// 컬럼필드 선택여부를 지정
if ($fields) {
$queryString .= $fields." ";
} else {
$queryString .= "* ";
}
$queryString .= "from $tbname1 JOIN $tbname2 ON $onWhere";
if ($result = mysqli_query($this->dbcon, $queryString)) {
$this->msgEcho("쿼리성공] ".$queryString);
$rowss = "";
$row_cnt = mysqli_num_rows($result);
for ($i=0; $i<$row_cnt; $i++) {
$rowss[$i] = mysqli_fetch_object($result);
}
$result->free();
return $rowss;
} else {
$this->msgEcho("Error] ".$queryString);
}
}
예제 파일 | join-01.php
<?php
include "dbinfo.php";
include "mysql.class.php";
// ++ Mysqli DB 연결.
$db = new JinyMysql();
if ($rowss = $db->innerJoin("members","orders","members.email=orders.email")) {
echo "tables fields = ". count($rowss) . "<br>";
for($i=0;$i<count($rowss);$i++){
echo $i."=";
print_r($rowss[$i]);
echo "<br>";
}
}
?>
화면 출력
mysql connected!
쿼리성공] SELECT * from members JOIN orders ON members.email=orders.email
tables fields = 2
0=stdClass Object ( [Id] => 1 [LastName] => hojin [FirstName] => lee [Address] => shinchon [City] => seoul [Country] => Korea [manager] => infohojin [email] => hojin@jinyphp.com [code] => O_001 )
1=stdClass Object ( [Id] => 2 [LastName] => hojin [FirstName] => lee [Address] => shinchon [City] => seoul [Country] => Korea [manager] => infohojin [email] => hojin@jinyphp.com [code] => O_002 )