JOIN에 관해 포스팅하려 합니다 개인적으로는 조금 어려웠습니다..
아래의 그림이 잘 정리가 되어있는데 한번 설명해보겠습니다
LEFT / RIGHT JOIN
LEFT JOIN 기준으로 설명하겠습니다. RIGHT JOIN은 기준 테이블이 반대가 되면 된다
A , B 테이블 중에서 A값의 전체와 A의 KEY와 B의 KEY 가 같은 결과를 리턴
아래의 테이블을 A테이블이라고 하겠다
ID | NAME | AGE | POINT |
1 | 철수 | 15 | 500 |
2 | 영희 | 13 | NULL |
3 | 훈이 | 14 | 200 |
4 | 정우 | 14 | NULL |
아래는 B테이블 이다
ID | SCHOOL | GRADE |
1 | 고구려중학교 | 1 |
3 | 백제중학교 | 3 |
3 | 신라중학교 | 2 |
4 | 발해중학교 | 1 |
5 | 고려중학교 | 2 |
사용법은 아래와 같습니다.
-- JOIN 사용법
SELECT ~~~
FROM TABLE_A
LEFT JOIN TABLE_B ON TABLE_A.KEY = TABLE_B.KEY
--> 예제
SELECT *
FROM A
LEFT JOIN B ON A.ID = B.ID
위 예제는 어떤 결과가 나올까요? 설명을 다시 한번 보면
A , B 테이블 중에서 A값의 전체와 A의 KEY와 B의 KEY 가 같은 결과를 리턴
A의 결과가 다 출력이 되고 이중 ID값이 B의 ID값과 같다면 연결되어 출력된다
ID값이 같은 게 없다면 연결되는 값이 없을 것이다
ID | NAME | AGE | POINT | ID | SCHOOL | GRADE |
1 | 철수 | 15 | 500 | 1 | 고구려중학교 | 1 |
3 | 훈이 | 14 | 200 | 3 | 백제중학교 | 3 |
3 | 훈이 | 14 | 200 | 3 | 신라중학교 | 2 |
4 | 정우 | 14 | 4 | 발해중학교 | 1 | |
2 | 영희 | 13 |
A의 ID 값은 1, 2, 3, 4
B의 ID 값은 1, 3, 4 ID가 같은 1, 3, 4 ROW에 연결되어 출력되었다
또 B의 ID에 3의 값이 2개여서 2개가 연결되어 출력되었다
B테이블에 고려중학교는 ID값이 5로 연결되는 5의 값이 A테이블에 없어 출력되지 않았다
영희는 ID값 2로써 B에는 2의 해당하는 값이 없지만 LEFT JOIN으로 A의 값은 다 출력되었다
설명을 차분히 읽어본다면 충분히 이해가 되었으리라 생각이 된다
LEFT / RIGHT JOIN (IS NULL)
JOIN 하는 두 테이블 중 한 테이블에만 있는 값을 출력하는 내용입니다.
사용법은 아래와 같습니다.
--> 사용법
SELECT ~~~~
FROM TABLE_A
LEFT JOIN TABLE_B ON TABLE_A.KEY = TABLE_B.KEY
WHERE B.KEY IS NULL --> 기본 LEFT JOIN에서 WHERE절이 추가되었다
--> 예제
SELECT *
FROM A
LEFT JOIN B ON A.ID = B.ID
WHERE B.ID IS NULL
결과:
ID | NAME | AGE | POINT | ID | SCHOOL | GRADE |
2 | 영희 | 13 |
A의 값들 중에서 B와 연결되지 않는 ROW인 ID가 2인 ROW만 출력이 되었다
LEFT JOIN이 아니라 RIGHT JOIN / WHERE A.ID IS NULL이라고 했다면
A와 연결되지 않는 B값인 ID가 5인 ROW만 출력이 될 것이다
INNER JOIN
INNER JOIN은 테이블 간에 서로 연결되는 값만 출력하는 내용이다 사용법을 보자
--> 사용법
SELECT ~~~~
FROM TABLE_A
INNER JOIN TABLE_B ON TABLE_A.KEY = TABLE_B.KEY
--> 예제
SELECT *
FROM A
INNER JOIN B ON A.ID = B.ID
ID | NAME | AGE | POINT | ID | SCHOOL | GRADE |
1 | 철수 | 15 | 500 | 1 | 고구려중학교 | 1 |
3 | 훈이 | 14 | 200 | 3 | 백제중학교 | 3 |
3 | 훈이 | 14 | 200 | 3 | 신라중학교 | 2 |
4 | 정우 | 14 | 4 | 발해중학교 | 1 |
A와 B테이블 중 두 테이블 모두에 있는 ID값 1, 3, 4를 ID의 값으로 가진 ROW들만 출력이 된다
FULL OUTER JOIN
FULL OUTER JOIN 은 두 테이블 모두의 값을 출력하는 내용이다
--> 사용법
SELECT ~~~
FROM TABLE_A
FULL OUTER JOIN TABLE_B ON TABLE_A.KEY = TABLE_B.KEY
--> 예제
SELECT *
FROM A
FULL OUTER JOIN B ON A.ID = B.ID
KEY같이 같은 애들은 연결되어 출력되고 연결 안 되는 다른 모든 값들도 출력된다
ID | NAME | AGE | POINT | ID | SCHOOL | GRADE |
1 | 철수 | 15 | 500 | 1 | 고구려중학교 | 1 |
3 | 훈이 | 14 | 200 | 3 | 백제중학교 | 3 |
3 | 훈이 | 14 | 200 | 3 | 신라중학교 | 2 |
4 | 정우 | 14 | 4 | 발해중학교 | 1 | |
2 | 영희 | 13 | ||||
5 | 고려중학교 | 2 |
같은 ID 값이 있는 경우 연결되어 출력되고
연결되는 ID값이 없는 ROW들도 두 테이블 모두 다 출력이 된다
++참고로 MYSQL에서는 FULL OUTER JOIN이 없다
++다만 LEFT JOIN과 RIGHT조인을 UNION으로 묶어 사용할 수 있다
SELECT * FROM A LEFT JOIN B UNION SELECT * FROM A RIGHT JOIN B
SELF JOIN
SELF JOIN은 원하는 데이터들이 하나의 테이블에 있을 때 사용한다
ID | NAME | MANAGER_ID |
13 | 철수 | 15 |
14 | 영희 | 15 |
15 | 정우 | |
16 | 훈이 | 15 |
위의 테이블에서 친구들의 매니저의 이름을 출력하고 싶은데 그 이름은 같은 테이블에 있는 이런 경우다
해당 경우는 아래처럼 쿼리를 작성한다
SELECT A.ID AS 'ID'
, A.NAME AS 'NAME'
, B.NAME AS 'MANAGER_NAME'
FROM A AS A
JOIN A AS B ON A.MANAGER_ID = B.ID
아래의 결과가 출력된다
ID | NAME | MANAGER_NAME |
13 | 철수 | 정우 |
14 | 영희 | 정우 |
16 | 훈이 | 정우 |
이상으로 포스팅을 마치겠습니다
도움이 되었다면 공감 버튼 한번 눌러주세요~