반응형
📝조인
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문 해석기가 이해를 못 해서 걸어줘야합니다.
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절을 또 넣어주면 됩니다.
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;
조인 조건에 해당하지 않더라도 왼쪽 테이블의 모든 행을 출력합니다.
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;
조인 조건에 해당하지 않더라도 오른쪽 테이블의 모든 행을 출력합니다.
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의 경우 각 쿼리문의 결과를 합칩니다 (합칠 쿼리문의 출력 필드가 동일해야합니다)
nm |
강호동 |
김용만 |
이휘재 |
박수홍 |
김제동 |
바둑 |
봉사 |
수영 |
축구 |
반응형