본문 바로가기
  • think normal
새로워지기/서른의 생활코딩

삼팔광땡~ MYSQL 입문기 07 - 복수의 테이블 다루기

by 청춘만화 2019. 2. 13.

삼팔광땡~ MYSQL 입문기 07 - 복수의 테이블 다루기


다 끝난 줄 알았던 입문기 06를 다시 보강하고 다시 입문기 07회로 복귀.. 

자, 이제 썰어 볼까요~

이번 실습은 하나가 아닌 여러테이블을 활용해 데이터를 검색해보는 실습을 하게 될 예정입니다.

( 아, 미리 언지를 드리면 실습에 사용되는 테이블은 동일하지만 책에서 설명하고있는 예제와는 똑같지는 않습니다.  >< ) 



1. 집합 연산  

1) SQL에서의 집합과 요소의 관계 - 타원형들로 구성된 벤다이어그램 기억 나시나요?  집합 : 요소 = 원 : 포함하고 있는 값 = 테이블 : 행(가로, 컬럼) 로 이해하면 어떨까합니다. 


2) 합집합(UNION) - 합집합을 실행하니까 아래 결과와 같이 겹치는 부분은 생략되네요 

select * from sample71_a;
select * from sample71_b;
select * from sample71_a union select * from sample71_b;


3) 합집합(UNION) + 정렬(order by)

union 결합을 진행하면서 order by로 정렬하려는 경우에는 어느 한쪽 select명령에만 지정할 수는 없습니다. Alias를 통해 union 결과에 대해 정렬을 할 수 있습니다.

select a c from sample71_a 
union 
select b c from sample71_b
order by c;


4) 중복을 제거하지 않고 합쳐야하는 경우 

select a c from sample71_a 
union all
select b c from sample71_b
order by c;


5) 교집합과 차집합

교재에서는 이부분을 간략히 넘겼습니다...그래서... 구글에서 관련 예제를 찾아서 응용해보았습니다.

(1) 교집합 

select * from 
  sample71_a , sample71_b 
where 
  sample71_a.a = sample71_b.b;


(2) 차집합 -2개의 테이블을 outer join 한후에 b테이블의 정보가 없는 리스트를 찾아서 차집합의 효과를 낸다. 라고 하는데 outer join 에 대해서는 아직 진행하지 않았는데요.. 아래쪽에 관련 실습이 자세히 등장할 예정이니, 우선 느낌적인 느낌으로 이렇게-돌아가는 구나 정도만 확인해도 좋을 것 같다는 느낌적인 느낌입니다.

i) sample71_a- sample71_b

select 
  a
from 
  sample71_a a left outer join sample71_b b 
on 
  a.a = b.b 
where 
  b.b is null;


ii) sample71_b- sample71_a

select 
  b
from 
  sample71_a a right outer join sample71_b b 
on 
  a.a = b.b 
where 
  a.a is null;


2. 테이블 결합 

1) 교차결합 cross join 하면 곱 집합 cartesian product 으로 계산된다

UNION과의 차이점 : union은 경우 세로(행)방향으로 더해지는 반면 from구에서 결합하는 곱집합의 경우 결합은 가로(열)방향으로 확대된다.

select * from sample72_x, sample72_y;


2) from 구에서 ,로 구분한 내부결합

실제 시스템에서는 다양한 데이터 테이블이 존재할 수 있습니다. 이러한 테이블을 교차결합하게되면 조합의 수가 기하급수 적으로 증가하여 사용하기 힘든 데이터가 되어 버립니다. 이를 고려하여 실무에서는 주로 내부 결합을 자주 사용하고 있습니다.

더불어 관계형 데이터베이스에서는 각 각의 테이블의 데이터가 유일한 값(기본키 primary key)을 가지도록 권장하고 있습니다. 이는 다른 테이블의 데이터를 참조해야하는 경우 참조할 테이블의 기본키와 동일한 자료형, 동일한 이름 열을 만들어서 행을 연결하기 위함입니다.


* 그럼, 식료품 중 재고수가 200, 500인 상품의 이름을 포함한 테이블을 만들어 볼까요 ;D

* 아, 참고로 아래 예제 테이블 명들이 다 한글인데요... 한글은 사용하지 않습니다. 이해를 돕기위해 임의로 한글로 만드신 거 같으니 참고하세용~


(1) 먼저 테이블 전체를 훑어 볼까요? - 상품과 재고 수 테이블 교차결합  

select * from 상품, 재고수; 

(2) 교차결합의 경우 중복된 데이터도 모두 보여주기 때문에 데이터베이스를 정돈해줄 필요가 있습니다. 위에 결과를 보니 두 테이블이 동일하게 상품코드를 가지고 있음을 알 수 있습니다. 동일한 기준을 바탕으로 다시 열거해보겠습니다.

select * from 
  상품, 재고수 
where 
  상품.상품코드 = 재고수.상품코드;

(3) 데이터베이스가 많이 간소화되었네요. 그럼 이제 우리에게 필요한 식료품 분류만 모아보아요. 

select 
  상품.상품명, 재고수.재고수 
from 
  상품, 재고수 
where 
  상품.상품코드 = 재고수.상품코드 
and 
  상품.상품분류='식료품';

3) inner join 으로 내부결합

상품 테이블과 재고수 테이블을 활용하여  -> 식료품에 해당하는 상품명, 재고수를 구해보겠습니다.

select 
  상품.상품명, 재고수.재고수 
from 
  상품 
inner join 
  재고수 
on 
  상품.상품코드 = 재고수.상품코드
where
 상품.상품분류='식료품';

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

상품2 테이블과 메이커 테이블을 활용하여  -> 식료품에 해당하는 상품명, 재고수를 구해보겠습니다.

select * from 상품2, 메이커; 
select * from 상품2 s, 메이커 m where s.메이커코드=m.메이커코드;
select 
  s.상품명, m.메이커명
from 
  상품2 s
inner join 
  메이커 M
on 
  s.메이커코드=m.메이커코드;


5) 외부결합 

내부결합의 경우 열의 값 일부가 없는 행은 출력하지 않습니다. 때문에 일부 값이 비어있더라도 목록으로 출력하고자 한다면 외부결합을 사용하여야 합니다. 사실 외부 결합은 앞서 차집합 예제를 만들어 진행하면서 해봤는데요. 이번에 다시한번 집고 넘어가보겠습니다.

실습 내용은 상품3 테이블과 재고수 테이블을 이용하여 -> 식료품에 해당하는 상품명 별 재고수를 구하는 예제입니다.

1) 내부결합

select 
  s.상품명, m.재고수
from 
  상품3 s
inner join 
  재고수 M
on 
  s.상품코드=m.상품코드
where 
  s.상품분류='식료품';


2) 외부결합 

기준이 되는 상품테이블을 JOIN의 왼쪽에 기술했음으로 LEFT JOIN으로 선언했습니다.

앞서 차집합을 진행할때도 동일한 패턴으로  (1) A-B의 경우에는 LEFT JOIN, (2) B-A의 경우에는 RIGHT JOIN 으로 선었했었던 것이었던 것이었습니다.

select 
  s.상품명, m.재고수
from 
  상품3 s
left join 
  재고수 M
on 
  s.상품코드=m.상품코드
where 
  s.상품분류='식료품';



+ 참고  :  도움이 될 것 같아보이는, 나도 아직 해보지 않은 사이트 링크 

댓글