[PHP] MySQL 2개 이상의 테이블 묶어 사용하기 UNION

2022. 10. 8. 05:10Program/PHP

126_PHP MySQL 2개 이상의 테이블 묶어 사용하기 UNION

[요약]

  • 2개 이상의 테이블을 하나의 테이블인 것처럼 사용하는 명령문 UNION 등에 대해 알아보자.

2개 이상의 테이블을 사용할 때 JOIN을 사용했다. JOIN은 일치하는 특정 필드를 기준으로 테이블과 테이블을 연결했다.

UNION은 사용하려는 테이블들을 하나의 테이블인 것처럼 사용하게 해주는 기능을 제공한다.

이해하기 쉽게 테이블을 2개 생성하자.

하나의 테이블은 2021년에 탈퇴한 회원의 이름과 이메일 정보를 담고 있으며, 또 하나의 테이블은 2022년에 탈퇴한 회원의 이름과 이메일 정보를 담고 있다. 어떤 회원은 2021년도에 탈퇴했고, 2022년에 가입후 또 탈퇴를 해서 2021년도 테이블과 2022년도 테이블에도 존재한다. 그리고 2021년도와 2022년도에 탈퇴한 회원에게 다시 이용해달라고 요청하는 이메일을 보내기 위해 데이터를 출력하는 작업을 해야 한다. 2021년도 탈퇴 회원의 테이블의 이름은 dropOutOld이며, 2022년도 탈퇴 회원의 테이블 이름은 dropOutNew로 하겠다.

 

다음은 dropOutNew 테이블과 dropOutOld 테이블의 생성 쿼리문이다.

[dropOutOld 테이블 생성 쿼리문]

CREATE TABLE dropOutOld(
dropOutOldID INT unsigned NOT NULL AUTO_INCREMENT,
name VARCHAR(10) NOT NULL,
email VARCHAR(30) NOT NULL,
PRIMARY KEY (dropOutOldID))
CHARSET=utf8 COMMENT '2021년 탈퇴 회원';

[dropOutNew 테이블 생성 쿼리문]

CREATE TABLE dropOutNew(
dropOutNewID INT unsigned NOT NULL AUTO_INCREMENT,
name VARCHAR(10) NOT NULL,
email VARCHAR(30) NOT NULL,
PRIMARY KEY (dropOutNewID))
CHARSET=utf8 COMMENT '2022년 탈퇴 회원';

 

테이블을 생성했으므로 생성한 2개의 테이블에 임의의 데이터를 입력하도록 하자.

 

다음은 2개의 테이블에 데이터를 입력하는 예제이다.

[예제: 129-1_createTb.php ]

<?php
    include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';

    $dropOutOld = "CREATE TABLE dropOutOld(";
    $dropOutOld .= "dropOutOldID INT UNSIGNED NOT NULL AUTO_INCREMENT,";
    $dropOutOld .= "name VARCHAR(10) NOT NULL,";
    $dropOutOld .= "email VARCHAR(10) NOT NULL,";
    $dropOutOld .= "PRIMARY KEY(dropOutOldID))";
    $dropOutOld .= "CHARSET=utf8";

    $dropOutNew = "CREATE TABLE dropOutNew(";
    $dropOutNew .= "dropOutNewID INT UNSIGNED NOT NULL AUTO_INCREMENT,";
    $dropOutNew .= "name VARCHAR(10) NOT NULL,";
    $dropOutNew .= "email VARCHAR(10) NOT NULL,";
    $dropOutNew .= "PRIMARY KEY(dropOutNewID))";
    $dropOutNew .= "CHARSET=utf8";

    $sqlList = array();

    $sqlList['dropOutOld'] = $dropOutOld;
    $sqlList['dropOutNew'] = $dropOutNew;

    foreach ($sqlList as $key => $sl) {
      $result = $dbConnect->query($sl);

      if ($result) {
        echo "{$key} 테이블 생성 완료";
      } else {
        echo "{$key} 테이블 생성 실패";
      }
      echo '<br>';
    }
?>

실행결과

2개의 테이블을 생성했다.

 

이제 dropOutOld 테이블에 레코드 6개, dropOutNew 테이블에 레코드 4개를 넣어보자.

[예제: 129-2_insert.php ]

<?php
    include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';

    $oldList = array();
    $oldList[0] = ['손흥민', 'son@gmail.com'];
    $oldList[1] = ['김연아', 'yuna@gmail.com'];
    $oldList[2] = ['박찬호', 'chan@gmail.com'];
    $oldList[3] = ['유재석', 'seok@gmail.com'];
    $oldList[4] = ['조세호', 'ho@gmail.com'];
    $oldList[5] = ['강호동', 'hodong@gmail.com'];

    $newList = array();
    $newList[0] = ['강호동', 'hodong@gmail.com'];
    $newList[1] = ['마돈나', 'madonna@gmail.com'];
    $newList[2] = ['마이클', 'michael@gmail.com'];

    $inputList = array();
    $inputList['dropOutOld'] = $oldList;
    $inputList['dropOutNew'] = $newList;

    $cnt = 0;

    foreach ($inputList as $key => $il) {
      foreach ($il as $i) {
        $sql = "INSERT INTO {$key}(name, email) VALUES('{$i[0]}', '{$i[1]}')";
        $result = $dbConnect->query($sql);
        $cnt++;

        if ($result) {
          echo $cnt . " 데이터 입력 성공";
        } else {
          echo $cnt . " 데이터 입력 실패";
        }
        echo '<br>';
      }
    }
?>

실행결과

이제 두 테이블에 데이토도 입력했다.


이제 UNION 명령문에 대해 알아보자.

[UNION 사용 방법]

(첫 번째 테이블의 SELECT문) UNION (두 번째 테이블의 SELECT문)

SELECT 문을 사용하면 다음과 같다.

(SELECT 필드명 FROM dropOutOld) UNION (SELECT 필드명 FROM dropOutNew);

 

서로 다른 테이블의 SELECT 문을 작성하고 그 사이에 UNION이 위치하도록 한다.

단, SELECT문에서 불러올 필드명을 기입할 때에는 필드의 수가 간ㅌ아야 한다는 점에 주의해야 한다.

첫 번째 테이블에서 필드 3개를 선택하고, 두 번째 테이블에서 필드 3개를 선택하지 않으면 문법 에러가 발생한다.

 

다음은 UNION을 사용하여 두 테이블에 있는 데이터를 출력하는 쿼리문이다.

(SELECT name, email FROM dropOutOld) UNION (SELECT name, email FROM dropOutNew);

 

다음은 위의 쿼리문을 활용한 예제이다.

[예제: 129-3_union.php ]

<?php
    include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';

    $sql = "(SELECT name, email FROM dropOutOld)";
    $sql .= " UNION (SELECT name, email FROM dropOutNew)";

    $result = $dbConnect->query($sql);

    $dataCount = $result->num_rows;

    for ($i = 0; $i < $dataCount; $i++) {
      $memberInfo = $result->fetch_array(MYSQLI_ASSOC);
      echo '이름 : ' . $memberInfo['name'];
      echo '<br>';
      echo '이메일 : ' . $memberInfo['email'];
      echo '<hr>';
    }
?>

실행결과

결과를 보면 dropOutOld 테이블과 dropOutNew 테이블에 있는 이름이 강호동인 레코드는 1회만 출력된것을 확인할 수 있다.

동일 데이터이면 각 테이블에 있는 데이터라도 1회만 출력한다.

 

중복된 정보도 함께 보려면 UNION 대신 UNION ALL을 사용해야 한다.

다음은 UNION ALL을 사용한 쿼리문이다.

(SELECT name, email FROM dropOutOld) UNION ALL (SELECT name, email FROM dropOutNew);

 

다음은 UNION ALL을 사용한 예제이다.

[예제 129-3]에서 UNION을 UNION ALL로 변경한것 외에는 차이가 없다.

[예제: 129-4_unionAll.php ]

<?php
    include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';

    $sql = "(SELECT name, email FROM dropOutOld)";
    $sql .= " UNION ALL (SELECT name, email FROM dropOutNew)";

    $result = $dbConnect->query($sql);

    $dataCount = $result->num_rows;

    for ($i = 0; $i < $dataCount; $i++) {
      $memberInfo = $result->fetch_array(MYSQLI_ASSOC);
      echo '이름 : ' . $memberInfo['name'];
      echo '<br>';
      echo '이메일 : ' . $memberInfo['email'];
      echo '<hr>';
    }
?>

실행결과

UNION ALL을 사용하여 중복된 데이터도 모두 표시한다.

 

 

 


 

 

 

초보자를 위한 PHP 200제
김태영 지음 | 정보문화사