복수의 테이블 다루기

07장 복수의 테이블 다루기

UNION으로 합집합 구하기

UNION으로 합집합 구하기

SELECT * FROM sample71_a;

+------+
| a |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
SELECT * FROM sample71_b;

+------+
| b |
+------+
| 2 |
| 10 |
| 11 |
+------+
3 rows in set (0.00 sec)

두개의 SELECT 명령을 UNION해서 합집합 구하기

SELECT * FROM sample71_a
UNION
SELECT * FROM sample71_b;

결과

+------+
| a |
+------+
| 1 |
| 2 |
| 3 |
| 10 |
| 11 |
+------+
5 rows in set (0.00 sec)
  • UNION 연산을 하기 위해서는 SELECT 명령의 열의 내용이 서로 일치해야 한다.
  • UNION을 사용할 경우 각 SECECT명령에 ORDER BY를 지정해 정렬할 수는 없다. 마지막 SELECT 명령에만 지정하도록 한다.

두개의 SELECT 명령에 UNION ALL을 적용해 합집합 구하기

SELECT * FROM sample71_a
UNION ALL
SELECT * FROM sample71_b;

결과

+------+
| a |
+------+
| 1 |
| 2 |
| 3 |
| 2 |
| 10 |
| 11 |
+------+
6 rows in set (0.00 sec)

테이블 결합

교차 결합

FROM 구로 곱집합 구하기

FROM구에 테이블 두개를 지정해 곱집합 구하기

SELECT * FROM sample72_x, sample72_y;

결과

+------+------+
| x | y |
+------+------+
| A | 1 |
| B | 1 |
| C | 1 |
| A | 2 |
| B | 2 |
| C | 2 |
| A | 3 |
| B | 3 |
| C | 3 |
+------+------+
9 rows in set (0.00 sec)

내부 결합

상품 테이블과 재고수 테이블을 교차결합하기

SELECT * FROM 상품, 재고수;

결과

+--------------+-----------+--------------+--------+--------------+--------------+------------+-----------+
| 상품코드 | 상품명 | 메이커명 | 가격 | 상품분류 | 상품코드 | 입고일 | 재고수 |
+--------------+-----------+--------------+--------+--------------+--------------+------------+-----------+
| 0001 | 상품1 | 메이커1 | 100 | 식료품 | 0001 | 2014-01-03 | 200 |
| 0002 | 상품2 | 메이커2 | 200 | 식료품 | 0001 | 2014-01-03 | 200 |
| 0003 | 상품3 | 메이커3 | 1980 | 생활용품 | 0001 | 2014-01-03 | 200 |
| 0001 | 상품1 | 메이커1 | 100 | 식료품 | 0002 | 2014-02-10 | 500 |
| 0002 | 상품2 | 메이커2 | 200 | 식료품 | 0002 | 2014-02-10 | 500 |
| 0003 | 상품3 | 메이커3 | 1980 | 생활용품 | 0002 | 2014-02-10 | 500 |
| 0001 | 상품1 | 메이커1 | 100 | 식료품 | 0003 | 2014-02-14 | 10 |
| 0002 | 상품2 | 메이커2 | 200 | 식료품 | 0003 | 2014-02-14 | 10 |
| 0003 | 상품3 | 메이커3 | 1980 | 생활용품 | 0003 | 2014-02-14 | 10 |
+--------------+-----------+--------------+--------+--------------+--------------+------------+-----------+
9 rows in set (0.00 sec)

상품코드가 같은 행을 검색하기

SELECT* FROM 상품, 재고수 WHERE 상품. 상품코드 = 재고수.상품코드;

결과

+--------------+-----------+--------------+--------+--------------+--------------+------------+-----------+
| 상품코드 | 상품명 | 메이커명 | 가격 | 상품분류 | 상품코드 | 입고일 | 재고수 |
+--------------+-----------+--------------+--------+--------------+--------------+------------+-----------+
| 0001 | 상품1 | 메이커1 | 100 | 식료품 | 0001 | 2014-01-03 | 200 |
| 0002 | 상품2 | 메이커2 | 200 | 식료품 | 0002 | 2014-02-10 | 500 |
| 0003 | 상품3 | 메이커3 | 1980 | 생활용품 | 0003 | 2014-02-14 | 10 |
+--------------+-----------+--------------+--------+--------------+--------------+------------+-----------+

검색할 행과 반환할 열 제한하기

SELECT 상품.상품명, 재고수.재고수 FROM 상품, 재고수
WHERE 상품.상품코드 = 재고수.상품코드
AND 상품.상품분류 = '식료품';

결과

+-----------+-----------+
| 상품명 | 재고수 |
+-----------+-----------+
| 상품1 | 200 |
| 상품2 | 500 |
+-----------+-----------+
2 rows in set (0.00 sec)

내부결합을 활용한 데이터 관리

상품 테이블과 메이커 테이블을 내부 결합하기

SELECT S.상품명, M.메이커명
FROM 상품2 S INNER JOIN 메이커 M
ON S.메이커코드 = M.메이커코드;

결과

+-----------+--------------+
| 상품명 | 메이커명 |
+-----------+--------------+
| 상품1 | 메이커1 |
| 상품2 | 메이커1 |
| 상품3 | 메이커2 |
+-----------+--------------+
3 rows in set (0.01 sec)

상품 테이블을 자기결합 하기

SELECT S1.상품명, S2.상품명
FROM 상품 S1 INNER JOIN 상품 S2
ON S1.상품코드 = S2.상품코드;

결과

+-----------+-----------+
| 상품명 | 상품명 |
+-----------+-----------+
| 상품1 | 상품1 |
| 상품2 | 상품2 |
| 상품3 | 상품3 |
+-----------+-----------+
3 rows in set (0.00 sec)

내부결합에서는 상품코드가 0009인 상품이 제외된다.

SELECT 상품3.상품명, 재고수.재고수
FROM 상품3 INNER JOIN 재고수
ON 상품3.상품코드 = 재고수.상품코드
WHERE 상품3.상품분류='식료품';

결과

+-----------+-----------+
| 상품명 | 재고수 |
+-----------+-----------+
| 상품1 | 200 |
| 상품2 | 500 |
+-----------+-----------+
2 rows in set (0.01 sec)

외부결합으로 상품코드 0009인 상품도 결과에 포함하기

SELECT 상품3.상품명, 재고수.재고수
FROM 상품3 LEFT JOIN 재고수
ON 상품3.상품코드 = 재고수.상품코드
WHERE 상품3.상품분류 = '식료품';

결과

+--------------+-----------+
| 상품명 | 재고수 |
+--------------+-----------+
| 상품1 | 200 |
| 상품2 | 500 |
| 추가상품 | NULL |
+--------------+-----------+
3 rows in set (0.00 sec)
Share