DEVELOPE/MYSQL&MARIADB

SQL JOIN 조인 메뉴얼

소찾나 2017. 10. 18. 17:03

SQL JOIN 조인 메뉴얼

SQL JOIN 조인 메뉴얼




조인(JOIN)


SELECT 명령문의 FROM 절에 적어도 두 개의 테이블 명세가 있고, WHERE 절에는 서로 다른 테이블의 열을 비교하는 조건이 적어도 하나가 있다면 조인(JOIN)이라한다.


  1. INNER JOIN

  2. OUTER JOIN

  3. SELF JOIN









1 INNER JOIN


결합된 테이블에 조건의 내용이 공통으로 들어가 있는 값을 결과 집합으로 만들어준다. ON 다음에 들어가는 조건에 맞는 내용들만 보여주게 된다.


기본형식


SELECT 열 목록
   FROM 첫번째 테이블 [AS 별칭] INNER JOIN 두번째 테이블 [AS별칭]
       ON(join_condition)

  
mysql> SELECT DISTINCT m.sno, m.name FROM student AS m INNER JOIN circle AS b ON m.sno = b.sno ORDER BY m.sno;
+------+-----------+
| sno  | name      |
+------+-----------+
|  100 | 홍길동    |
|  101 | 김철수    |
|  102 | 김순이    |
|  103 | 김말동    |
|  104 | 정민철    |
|  105 | 이만수    |
|  106 | 안철수    |
|  107 | 김재동    |
|  108 | 이미자    |
|  109 | 김기철    |
|  110 | 이기동    |
+------+-----------+
11 rows in set (0.00 sec)



2 OUTER JOIN

2.2 OUTER JOIN

INNER JOIN 문을 포함하고 한쪽에만 내용이 있더라도 지정한 기준 테이블에 있는 모든 데이터를 가져오는 조인방식



기본형식


 

SELECT 열목록

   FROM 첫번째 테이블

   <LEFT | RIGHT | FULL> OUTER JOIN 두번째 테이블

       ON(join_condition)

   [WHERE 검색조건]


 


(1) LEFT OUTER JOIN

왼쪽 테이블이 기준이 되어서 그 테이블에 있는 데이터를 모두 가져온다. 기준으로 지정되지 않은 오른쪽 테이블에서 가져올 수 없는 열은 NULL로 표현된다.


 

mysql> SELECT m.sno, b.name, b.cname FROM student AS m LEFT OUTER JOIN circle AS b ON m.sno = b.sno ORDER BY m.sno;

+------+-----------+--------------+

| sno  | name      | cname        |

+------+-----------+--------------+

|  100 | 홍길동    | 사물놀이     |

|  101 | 김철수    | 사물놀이     |

|  102 | 김순이    | 방송         |

|  103 | 김말동    | 방송         |

|  104 | 정민철    | 연극         |

|  105 | 이만수    | 운동         |

|  106 | 안철수    | 운동         |

|  107 | 김재동    | 방송         |

|  108 | 이미자    | 방송         |

|  109 | 김기철    | 연극         |

|  110 | 이기동    | 운동         |

+------+-----------+--------------+

11 rows in set (0.00 sec)




(2) RIGHT OUTER JOIN

오른쪽 테이블이 기준이 되어서 그 테이블에 있는 데이터를 모두 가져온다. 기준으로 지정되지 않은 왼쪽 테이블에서 가져올 수 없는 열은 NULL로 표현된다.


mysql> SELECT b.sno, b.name, b.cname FROM student AS m RIGHT OUTER JOIN circle AS b ON m.sno = b.sno ORDER BY b.sno;

+------+-----------+--------------+

| sno  | name      | cname        |

+------+-----------+--------------+

|  100 | 홍길동    | 사물놀이     |

|  101 | 김철수    | 사물놀이     |

|  102 | 김순이    | 방송         |

|  103 | 김말동    | 방송         |

|  104 | 정민철    | 연극         |

|  105 | 이만수    | 운동         |

|  106 | 안철수    | 운동         |

|  107 | 김재동    | 방송         |

|  108 | 이미자    | 방송         |

|  109 | 김기철    | 연극         |

|  110 | 이기동    | 운동         |

|  200 | 김만수    | 운동         |

|  201 | 김옥경    | 방송         |

|  202 | 김수경    | 방송         |

|  203 | 김말동    | 운동         |

|  204 | 민영탁    | 운동         |

|  205 | 이경철    | 방송         |

|  206 | 김영진    | 방송         |

|  207 | 탁재훈    | 방송         |

|  208 | 안병훈    | 사물놀이     |

|  209 | 진우형    | 사물놀이     |

|  210 | 노민환    | 사물놀이     |

+------+-----------+--------------+

22 rows in set (0.00 sec)



 

2 CROSS JOIN


결과값이 한쪽 테이블의 모든행들과 다른쪽 테이블의 모든 행을 조인시킨다.

결과 집합은 두 테이블의 개수를 곱한 값만큼 생성되며, 조인되는 테이블에 공통되는 행이 없어도 되며 조건절인 ON 키워드가 사용되지 않는다.



SELECT m.sno, b.name, b.cname 

  FROM student AS m

 CROSS JOIN circle AS b

 ORDER BY m.sno


         결과값이 너무 길어 일부분만 출력해본다

SELECT m.sno, b.name, b.cname FROM student AS m CROSS JOIN circle AS bORDER BY m.sno;

|  109 | 노민환    | 사물놀이     |
|  109 | 홍길동    | 사물놀이     |
|  109 | 김순이    | 방송         |
|  109 | 정민철    | 연극         |
|  109 | 안철수    | 운동         |
|  109 | 이미자    | 방송         |
|  109 | 이기동    | 운동         |
|  109 | 김옥경    | 방송         |
|  109 | 김말동    | 운동         |
|  109 | 이경철    | 방송         |
|  109 | 탁재훈    | 방송         |
|  109 | 진우형    | 사물놀이     |
|  110 | 홍길동    | 사물놀이     |
|  110 | 김순이    | 방송         |
|  110 | 정민철    | 연극         |
|  110 | 안철수    | 운동         |
|  110 | 이미자    | 방송         |
|  110 | 이기동    | 운동         |
|  110 | 김옥경    | 방송         |
|  110 | 김말동    | 운동         |
|  110 | 이경철    | 방송         |
|  110 | 탁재훈    | 방송         |
|  110 | 진우형    | 사물놀이     |
|  110 | 김철수    | 사물놀이     |
|  110 | 김말동    | 방송         |
|  110 | 이만수    | 운동         |
|  110 | 김재동    | 방송         |
|  110 | 김기철    | 연극         |
|  110 | 김만수    | 운동         |
|  110 | 김수경    | 방송         |
|  110 | 민영탁    | 운동         |
|  110 | 김영진    | 방송         |
|  110 | 안병훈    | 사물놀이     |
|  110 | 노민환    | 사물놀이     |
+------+-----------+--------------+
242 rows in set (0.00 sec)



2 SELF JOIN

하나의 테이블에 같은 데이터가 존재하는데 그 의미가 다르게 존재하는 경우. 즉, 같은 데이터이지만 다른 열에 있는 경우에는 두 테이블을 서로 SELF JOIN 문으로 확인가능



SELECT a.sno, a.name, a.cname

  FROM circle AS a

  INNER JOIN circle AS b

      ON a.name = b.cname

WHERE a.name = '홍길동'


이글이 도움이 되셨다면 아래에 로그인이 필요없는 공감 버튼을 클릭해주세요 ^^