반응형

📝조인

2개 이상의 테이블을 묶어서 하나의 결과 테이블을 만든 것을 의미합니다.

 

📝일대다 관계

한쪽 테이블에는 하나의 값만 존재하고 그 값과 대응되는 다른쪽 테이블의 값은 여러개인 관계를 말합니다.지역정보가 담긴 테이블의 이름은 기본키(PK) 한 개이고 동아리명이 담긴 테이블에는 이름(FK)가 다수이기 때문에 일대 다의 관계라고 이야기합니다.

    

 

 

 

 

대충 조인은 이런 교집합 합집합 차집합등의 관계를 생각하면 이해하기 쉽습니다.

파란색 영역의 부분만 데이터를 추출한다고 생각하시면 이해하기 쉬울 것입니다.

 

📝INNER JOIN (교집합)

DROP TABLE IF EXISTS REGION;

CREATE TABLE REGION(
	nm	varchar(20) PRIMARY KEY,
	region	varchar(20) NOT NULL
);

INSERT INTO REGION VALUES ('강호동', '경북');
INSERT INTO REGION VALUES ('김제동', '경남');
INSERT INTO REGION VALUES ('김용만', '서울');
INSERT INTO REGION VALUES ('이휘재', '경기');
INSERT INTO REGION VALUES ('박수홍', '경남');

DROP TABLE IF EXISTS USER;

CREATE TABLE USER(
	no			INT(20)		NOT NULL AUTO_INCREMENT	PRIMARY KEY,
   nm			varchar(20)	NOT NULL,
   club		varchar(20)	NOT NULL
);

INSERT INTO USER(nm, club) VALUES ('강호동', '바둑');
INSERT INTO USER(nm, club) VALUES ('강호동', '축구');
INSERT INTO USER(nm, club) VALUES ('김용만', '축구');
INSERT INTO USER(nm, club) VALUES ('이휘재', '축구');
INSERT INTO USER(nm, club) VALUES ('이휘재', '봉사');
INSERT INTO USER(nm, club) VALUES ('박수홍', '봉사');

 

위에 테이블을 쿼리문으로 구현했습니다.

 

SELECT A.no,
       A.nm,
       A.club,
       B.region
  FROM USER A
 INNER JOIN REGION B
    ON A.nm = B.nm;

INNER JOIN은 SELECT와 같이 쓰입니다.

 

  • SELECT 필드
  •     FROM 테이블(벤다이어그램의 왼쪽 서클)
  •    INNER JOIN 테이블(벤다이어그램의 오른쪽 서클)
  •         ON FK키 = PK키 (일대다의 관계는 PK키와 FK키로 연결)

 

이렇게되면 테이블A에 있는 필드와 테이블B에 있는 필드를 같이 볼 수 있게 해줍니다.

 

Alias를 필드에 안 주면 nm의 경우 USER 또는 REGION 테이블에 둘다 존재하기 때문에 어디를 봐야할지 SQL문 해석기가 이해를 못 해서 걸어줘합니다.

 

Document
no nm club region
1 강호동 바둑 경북
2 강호동 축구 경북
3 김용만 축구 서울
4 이휘재 축구 경기
5 이휘재 봉사 경기
6 박수홍 봉사 경남

 

DROP TABLE IF EXISTS REGION;

CREATE TABLE REGION(
	nm	varchar(20) PRIMARY KEY,
	region	varchar(20) NOT NULL
);

INSERT INTO REGION VALUES ('강호동', '경북');
INSERT INTO REGION VALUES ('김제동', '경남');
INSERT INTO REGION VALUES ('김용만', '서울');
INSERT INTO REGION VALUES ('이휘재', '경기');
INSERT INTO REGION VALUES ('박수홍', '경남');

DROP TABLE IF EXISTS USER;

CREATE TABLE USER(
	no			INT(20)		NOT NULL AUTO_INCREMENT	PRIMARY KEY,
   nm			varchar(20)	NOT NULL,
   club		varchar(20)	NOT NULL
);

INSERT INTO USER(nm, club) VALUES ('강호동', '바둑');
INSERT INTO USER(nm, club) VALUES ('강호동', '축구');
INSERT INTO USER(nm, club) VALUES ('김용만', '축구');
INSERT INTO USER(nm, club) VALUES ('이휘재', '축구');
INSERT INTO USER(nm, club) VALUES ('이휘재', '봉사');
INSERT INTO USER(nm, club) VALUES ('박수홍', '봉사');

DROP TABLE IF EXISTS CLUB;


CREATE TABLE CLUB(
	nm	   varchar(20)	PRIMARY KEY,
   room	varchar(20)	
);

INSERT INTO CLUB VALUES ('수영', '101호');
INSERT INTO CLUB VALUES ('바둑', '102호');
INSERT INTO CLUB VALUES ('축구', '103호');
INSERT INTO CLUB VALUES ('봉사', '104호');

 

 

3개의 테이블을 INNERJOIN 해보겠습니다.

 

CLUB을 추가시켰습니다. 도식화해서 표현하면 위의 그림입니다.

SELECT  A.nm
      , A.region
      , B.club
      , C.room
  FROM REGION A
 INNER JOIN USER B
    ON A.nm = B.nm
 INNER JOIN CLUB C
  	ON B.club = C.nm;

2개할 때랑 큰 차이는 없습니다. INNER JOIN후에 INNER JOIN절을 또 넣어주면 됩니다.

 

Document
nm region club room
강호동 경북 바둑 102호
강호동 경북 축구 103호
김용만 서울 축구 103호
이휘재 경기 축구 103호
이휘재 경기 봉사 104호
박수홍 경남 봉사 104호

 

📝LEFT JOIN

SELECT B.no,
       B.club,
       A.nm,
       A.region
  FROM REGION A
  LEFT JOIN USER B
    ON A.nm = B.nm;

 

조인 조건에 해당하지 않더라도 왼쪽 테이블의 모든 행을 출력합니다.

 

Document
no nm club region
1 강호동 바둑 경북
2 강호동 축구 경북
3 김용만 축구 서울
4 이휘재 축구 경기
5 이휘재 봉사 경기
6 박수홍 봉사 경남
NULL NULL 김제동 경남

 

📝RIGHT JOIN

SELECT A.no,
       A.nm,
       A.club,
       B.region
  FROM USER A
 RIGHT JOIN REGION B
    ON A.nm = B.nm;

조인 조건에 해당하지 않더라도 오른쪽 테이블의 모든 행을 출력합니다.

 

Document
no nm club region
1 강호동 바둑 경북
2 강호동 축구 경북
3 김용만 축구 서울
4 이휘재 축구 경기
5 이휘재 봉사 경기
6 박수홍 봉사 경남
NULL NULL NULL 경남

 

📝UNION (합집합)

SELECT A.nm FROM USER A
  UNION
SELECT B.nm FROM REGION B
  UNION
SELECT C.nm FROM CLUB C;

UNION의 경우 각 쿼리문의 결과를 합칩니다 (합칠 쿼리문의 출력 필드가 동일해야합니다)

 

Document
nm
강호동
김용만
이휘재
박수홍
김제동
바둑
봉사
수영
축구

 

반응형