A | B | C |
---|---|---|
1 | a | value |
2 | b | value1 |
3 | c | value2 |
4 | d | value3 |
A | D | E |
---|---|---|
1 | ㄱ | c1 |
2 | ㄴ | c2 |
3 | ㄷ | c3 |
이 두 테이블을 연결했을 때 똑같은 A컬럼이 있다,
이 값을 연결하여 ABCDE컬럼이 연결되어있는 하나의 테이블을 만들수있다.
이때 공통된 컬럼이 A 이기때문에 테이블1의 A와 테이블2의 A같다는것을 쿼리문으로 알려줘야한다.
<old>
select *
from table1, table2
where table1.a = table2.a
이게 예전이 방식이다, 하지만 이제는 join을 사용하여 표기한다
select *
from table1
inner join table2 on table1.a = table2.a //각각 테이블1,2의 a컬럼을 뜻한다
하지만 이 두 테이벌의 컬럼은 이름이 같다 그렇기에 inner줄에서 이런식으로 사용할수있따.
inner join table2 using (a)
이렇게 using과 ()를 사용해 컬럼명이 같다는것을 인싟히킬수있다.
https://sql-joins.leopard.in.ua/
이 사이트를 활용하여 join문을 어떻게 사용하면 좋을지 참고할수있다.
테이블을 더 많이 연결하고 싶다면
select *
from table1
inner join table2 on table1.a = table2.a
inner join table3 using (b)
같이 join절을 계속 붙여주면 된다.
table 1과 table2의 a컬럼의 값이 둘다 있지 않은경우 값이 없는 경우에는 합쳐지지 않는다.
없는 값도 합쳐서 출력하고 싶을때 outer join을 사용한다.
table1
A | B | C |
---|---|---|
1 | a | value |
2 | b | value1 |
3 | c | value2 |
4 | d | value3 |
A | D | E |
---|---|---|
1 | ㄱ | c1 |
2 | ㄴ | c2 |
3 | ㄷ | c3 |
이 데이터의 경우 a컬럼의 4는 연결될 데이터가 없다.
table1을 기준으로 이렇게 작성했다면
select *
from table1//1번 테이블이 기준이다.
join table2 using (A)
A | B | C | D | E |
---|---|---|---|---|
1 | a | value | ㄱ | c1 |
2 | b | value1 | ㄴ | c2 |
3 | c | value2 | ㄷ | c3 |
이 될것이다,
하지만 반대로 table2를 기준으로 작성하면 어떨까?
select *
from table2//2번 테이블이 기준이다.
join table1 using (A)
A | D | E | B | C |
---|---|---|---|---|
1 | ㄱ | c1 | a | value |
2 | ㄴ | c2 | b | value1 |
3 | ㄷ | c3 | c | value2 |
이런식으로 a4의 데이터는 아예 출력되지 않는다,
이때 데이터값이 연결되지 않는 a4의 데이터를 출력하고 싶다면 outer join을 사용한다,
outer join은 left join과 같은 값이 출력되며 자세한 설명은 아래쪽에서 계속된다.
왼쪽 테이블을 기준으로 왼쪽테이블의 전체출력, 오른쪽 테이블의 교집합만 출력하는것이 left join이다.
A | B | C |
---|---|---|
1 | a | value |
2 | b | value1 |
3 | c | value2 |
4 | d | value3 |
null | a | value4 |
A | D | E |
---|---|---|
1 | ㄱ | c1 |
2 | ㄴ | c2 |
3 | ㄷ | c3 |
5 | ㄹ | c4 |
이런데이터를 가지고 있을때 첫번째(왼쪽)테이블에는 마지막에 a컬럼의 값이 null인 열이 존재한다.
select *
from table1
left join table2 on table1.a = table2.a
이런 쿼리문을 작성한다면 왼쪽을 기준으로 왼쪽 컬럼은 전부 출력이 되기때문에
A | B | C | D | E |
---|---|---|---|---|
1 | a | value | ㄱ | c1 |
2 | b | value1 | ㄴ | c2 |
3 | c | value2 | ㄷ | c3 |
4 | d | value3 | null | null |
null | a | value4 | null | null |
이렇게 null인 부분을 포함하여 값을 출력하게 될것이다. (첫번째 테이블은 null이어도 모두 출력됨)
하지만 두번째 테이블의 a5인 열은 첫번째 테이블에 해당값이 없기때문에 출력되지 않는다.
A | B | C |
---|---|---|
1 | a | value |
2 | b | value1 |
3 | c | value2 |
4 | d | value3 |
null | a | value4 |
A | D | E |
---|---|---|
1 | ㄱ | c1 |
2 | ㄴ | c2 |
3 | ㄷ | c3 |
5 | ㄹ | c4 |
이런 같은데이터에서 right join을 사용한다면 이번에는 두번째 테이블을 기준으로 출력하게된다.
select *
from table1
right join table2 on table1.a = table2.a
A | B | C | D | E |
---|---|---|---|---|
1 | a | value | ㄱ | c1 |
2 | b | value1 | ㄴ | c2 |
3 | c | value2 | ㄷ | c3 |
5 | null | null | ㄹ | c4 |
아까와는 정반대로 a4와 anull 행이 조회되지 않는 데이터가 된다.
하지만 왼쪽오른쪽을 바꿀 뿐이기에 보통 left join을 사용한다
본 내용은 데이터리안 'SQL 데이터 분석 캠프 입문반' 을 수강하며 작성한 내용입니다