메뉴 건너뛰기

2017.11.16 11:02

mysql(union,join)

조회 수 1116 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

union


여러 테이블에서 추출한 데이터를 단순하게 하나의 결과로 표시할 때에는 union 을 사용합니다.

구조가 다른 테이블에서도 데이터를 추출할 수 있습니다.

기본적으로 함께 표시할 칼럽의 자료형은 일치해야합니다.

단, 실제로 mysql은 자료형이 달라도 추출할 수 있는 데이터는 모두 추출합니다.




셈플DB


    


2개의 테이블에서 레코드 추출하기

select 칼럼이름1 from 테이블이름1 union select 칼럼이름2 from 테이블이름2;


ex) select * from tb1 union select * from tb2;


조건을 설정해서 여러개의 추출 결과를 하나로 표시하기

ex) 1) tb에서 sales이 200 이상인 number 과 2) tb1에서 age가 35 이상인 사원번호

select number from tb where sales>=200 union select number from tb1 where age>=35;

 



여러 개의 추출 결과를 합쳐서 표시하기 - 중복 허용

앞선 쿼리문에서는 데이터가 3개가 추출되었는데 사실 1)의 결과는 A101, A102   2)의 결과는 A101, A105 입니다.

따라서 A101,A102,A101,A105 이렇게 추출되야하는데 그렇지 않고 중복되었던 A101의 값은 한번만 추출되었습니다.

그 이유는 중복된 데이터는 제외한다 라는 명령도 함께 실행 되었기 때문입니다.

union all 을 사용하면 중복된 데이터 또한 추출할 수 있습니다.


ex) select number from tb where sales>=200 union all select number from tb1 where age>=35;

 



추가적인 내용

1) 데이터 형식이 다를때

number = varchar(10) , age  = int

ex) select number from tb union select age from tb1;

 


2) union 으로 연결된 두 select 문이 지정한 컬럼의 수가 일지하지 않으면 에러가 발생합니다.

ex) select * from tb1 union select age from tb1;

 




JOIN 

여러 겨의 테이블을 특정 키로 연결하는 것이 '조인' 입니다. 실제로 웹상에서 운용되는 데이터베이스는 수많은 데이터로 구성되어 있습니다.따라서 하나의 거대한 테이블로만 처리할 수는 없기때문데 조인을 사용합니다.


2개의 테이블 조인으로 결합하기

SELECT 칼럼이름 FROM 테이블1 JOIN 결함할 테이블2 ON 테이블1의칼럼=테이블2의칼럼


ON~ 에 2개의 테이블을 연결하는 키가 되는 칼럼이 같다는 조건을 작성합니다.


ex) select * from tb join tb1 on tb.number=tb1.number;

 

결과를 보면 테이블 tb 의 칼럼 number 와 tb1의 number와 일치하는 레코드를 결합해서 추출하였습니다.

(A107이 추출되지 않은 이유는 tb1에 A107이 존재하지 않아서 입니다.)


이처럼 일치하는 레코드만 가져오는 결합을 내부 조인이라고 합니다(INNER JOIN).

쿼리문에 내부 조인을 명시적으로 표시하려면 select * from tb inner join tb1 on tb.number=tb1.number; 으로 하면 됩니다.


칼럼을 선택해서 표시하기

표시할 레코드를 선택해서 추출할때는 단순히 컬럼명만 기술해서는 어떤테이블의 칼럼인지 알 수 가 없습니다. 이럴때 칼럼이름을 

'테이블이름.칼럼이름' 으로 기술해야합니다.


ex) select tb.number, tb1.name, tb.sales from tb join tb1 on tb.number=tb1.number;

 

(확실하게 하기위해 컬럼마다,테이블명을 써주지만, 두 테이블의 공통인 number 만 구분해주면 되기때문에 number에만 테이블명을 붙어도 된다.)


ON 데신 USING

ON~ 에 2개의 테이블을 연결하는 키가 되는 칼럼이 같다는 조건을 작성을 하지만, 이는 칼럼의 데이트는 일치하나 칼럼명이 틀릴때 를 위해서이고 칼럼명을 알고 두 테이블의 칼럼명이 같다는것을 알때에는 USING을 사용해도 된다.

ex) select tb.number, name,sales from tb join tb1 using(number);



where 로 조건 주기 

ex) select tb.number, name,sales from tb join tb1 using(number) where sales>=100;


join 여러개 사용하기

ex) select tb.number,name,age,city from tb join tb1 using(number) join tb3 using(number);

 



외부조인

내부조인에의한 키가 일치하는 레코드만 추출한다. 그렇기 때문에, 테이블 tb나 tb1에만 존재하는 레코드는 무시됩니다. 하지만 레코드가 존재하는 이상 모두 표시해야 할때에는 외부조인을 사용합니다.


left join

두 테이블의 일치하는 레코드와 테이블1(쿼리문상 왼쪽에 있는 테이블)의 모든 레코드를 표시합니다.

ex) select tb.number,name,sales from tb left join tb1 using(number);

 

두 테이블을 비교했을때 tb(쿼리문구성상 왼쪽)에는 A107 이 있고, tb1에는 A107 이 존재하지 않지만

left join 을 통하여 tb에만 존재하는 A107 또한 추출되었다.


right join

left join 의 반대로가 생각하면 쉽다.

ex) select tb.number,name,sales from tb right join tb1 using(number);


하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved