MySQL - 4.2 SQL 고급 문법 - 두 테이블을 묶는 조인

govlKH·2023년 6월 23일
0

SQL

목록 보기
6/17

4.2 두 테이블을 묶는 조인

'회원 테이블'과 '구매 테이블'이 존재할 때 두 테이블을 통해 '배송 정보'를 만들어야 한다.
이러한 상황에서 JOIN을 이용하여 정보를 도출한다.

1. 내부 조인

  • 일대다 관계의 이해
    현실에서 가장 많이 존재하는 관계로
    두 테이블의 조인을 위해서는 테이블이 일대다(one to many) 관계로 연결되어야 한다.
    : 즉, 한 쪽 테이블에는 하나의 값만 존재해야 하지만, 연결된 다른 테이블에는 여러개의 값이 존재할 수 있는 관계를 말한다.
    ex) 회원 테이블에는 아이디가 중복없이 1개씩 존재하지만(기본 키), 구매 테이블에는 다양한 물품을 구매했을 경우 아이디가 중복되어 다수가 존재할 수 있다.(외래 키)
    (일대다 관계의 이해 : 혼공SQL 교재)
  • 내부 조인의 문법
SELECT < 목록>
FROM < 번째 테이블>
	INNER JOIN < 번째 테이블>
    ON <조인될 조건>
[WHERE 검색 조건] ;

ex1)
SELECT * 
   FROM buy
     INNER JOIN member
     ON buy.mem_id = member.mem_id
   	WHERE buy.mem_id = 'GRL';
ex2)
SELECT buy.mem_id, member.mem_name, buy.prod_name, addr, CONCAT(phone1, phone2) AS '연락처' 
   FROM buy
     INNER JOIN member
     ON buy.mem_id = member.mem_id;
     
이렇게 buy. member. 으로 표시해주는 것이 좋다. but 코드가 길어짐
=> 각 별칭을 부여해서 편하게 사용

SELECT B.mem_id, M.mem_name, B.prod_name, M.addr, CONCAT(M.phone1, M.phone2) AS '연락처' 
   FROM buy AS B
     INNER JOIN member AS M
     ON B.mem_id = M.mem_id;

내부 조인의 한계점은 구매한 사람들만 나옴, 구매를 안 했으면 구매하지 않음으로 나타나는 것도 바람직하지 않을까?
=> 따라서 나온 것이 외부 조인

2. 외부 조인

  • 외부 조인의 문법
SELECT < 목록>
FROM < 번째 테이블(LEFT 테이블)>
	<LEFT | RIGHT | FULL> OUTER JOIN < 번째 테이블(RIGHT 테이블)>
    ON <조인될 조건>
[WHERE 검색 조건] ;

ex1)
SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
   FROM member M
     LEFT OUTER JOIN buy B
     ON M.mem_id = B.mem_id
   ORDER BY M.mem_id;
   
* RIGHT나 LEFT나 같다. 테이블 위치만 바꾸면 됨

SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
   FROM buy B
     RIGHT OUTER JOIN member M
     ON M.mem_id = B.mem_id
   ORDER BY M.mem_id;

3. 상호 조인(CROSS JOIN)

한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능
내용적인 의미는 없지만, 테스트 대용량 데이터를 만들 때 사용된다.
총 만들어지는 행의 개수 = A테이블 행의 개수 X B테이블 행의 개수

  • 상호 조인의 문법
* sakila데이터베이스의 inventory와 world데이터베이스의 city테이블 크로스 조인

SELECT COUNT(*) "데이터 개수"
   FROM sakila.inventory   # 4,581건
      CROSS JOIN world.city;   # 4,079건 => 총 18,685,899건 데이터 생성

4. 자체 조인(SELF JOIN)

자기 자신과의 조인
즉, 하나의 테이블을 사용하여 조인 ex) 회사의 조직 관계
(자체 조인 : 혼공SQL 교재)

  • 자체 조인의 문법
* 경리부장의 직속상관의 전화번호를 알고 싶을 때?

SELECT A.emp "직원" , B.emp "직속상관", B.phone "직속상관연락처"
   FROM emp_table A   # emp_table를 A
      INNER JOIN emp_table B   # emp_table를 B
         ON A.manager = B.emp   # 직속상관(MANAGER)과 직원(EMP) 연결
   WHERE A.emp = '경리부장';
profile
수학과 대학원생. 한 걸음씩 꾸준히

0개의 댓글