메뉴 건너뛰기

2017.11.16 20:02

mysql(union,join)

조회 수 3837 추천 수 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);


List of Articles
번호 제목 날짜 조회 수
126 한글정렬 order by 2019.02.19 2424
125 하나의 쿼리로 여러 테이블의 데이터 삭제 file 2020.07.28 888
124 필드 변경, 추가, 삭제 2016.12.23 6085
123 특정 테이블만 replication 하거나 제외하는 방법 2018.07.18 2810
122 특정 COLUMN을 제외하고 SELECT/INSERT하는 방법 2017.11.16 8858
121 테이블, 컬럼 charset 변경 2021.03.26 186
120 테이블, 레코드 복사 2021.03.26 162
119 테이블 파티셔닝 2017.12.22 4940
118 테이블 타입(Heap, MyIsam, InnoDB...) 변경하기 2017.04.12 5272
117 테이블 체크, 백업 2016.12.23 7478
116 테이블 복사, 테이블 비우기 2016.12.23 5781
115 컬럼에 포함된 특정문자열을 검색해서 그 문자로 또 다른 테이블검색하기 2016.08.30 6606
114 컬럼내 특정 문자를 다른문자로 변경하고자 할때 2014.02.27 6012
113 중복데이터 하나만 빼고 삭제 2019.01.11 3163
112 전체 텍스트 검색과 파티션 file 2017.12.22 3868
111 전체 텍스트 검색과 파티션 file 2017.12.22 3946
110 일반적인 오류를 해결하는 유용한 정보들 file 2020.11.23 3858
109 이벤트 스케줄러 등록하기 file 2020.06.29 303
108 월의 마지막 일수를 반환하는 함수입니다 2015.12.19 5996
107 외부접근 권한 주기 file 2016.12.23 5949
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved