20210217_SQL 기초 7 (JOIN 구문)

2022. 2. 17.공부/SQL, R

728x90

고정 불변하는 주민 번호처럼, 컴퓨터 상에서도 변하지 말아야할 값들이 있다. SQL에서 테이블을 만들 때는 이런 변화하지 않아야 하는 값에 PRIMARY KEY를 걸어준다. PRIMARY KEY는 테이블을 새로 만들 때마다 변화하는 값이 아니므로 테이블과 테이블 사이에서 공유되며, 이때 테이블 간 연결되는 PRIMARY KEY(기본키)는 FOREIGN KEY(외래키)라고 부른다. 아래의 코드 블럭에서는 userTbl과 buyTbl이 기본키로 user_id를 공유하며, buyTbl를 만드는 코드에서 먼저 선언된 userTbl의 기본키를 외래키로 선언하여 연결시켜주었다.

 

CREATE TABLE userTbl (
user_id varchar(8) primary key,
user_name varchar(10) not null,
birth_year int(4) not null,
addr varchar(4) not null,
phone_number varchar(11),
height int(3),
reg_date date
);

CREATE TABLE buyTbl (
order_number INT AUTO_INCREMENT PRIMARY KEY,
user_id VARCHAR(8) NOT NULL,
prod_name VARCHAR(6) NOT NULL,
group_name VARCHAR(4),
price INT(7) NOT NULL,
amount INT(3) NOT NULL
FOREIGN KEY(user_id) REFERENCES userTbl(user_id)
);

 

하나의 스키마에서 데이터를 만드는 사람의 목적과 용도에 따라 여러개의 테이블이 생성되고, 이 테이블들은 생성 후에 JOIN이라는 명령어로 묶어줄 수도 있다. JOIN의 종류에는 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN이 있는데, 마지막인 FULL OUTER JOIN의 경우, MySQL에서는 UNION 키워드로 이중 쿼리문을 작성하여 구현한다. (오라클에서 FULL OUTER JOIN 명령어 사용)

 

1. INNER JOIN 

PRIMARY KEY(이 케이스에서는 user_id)로 연결된

두 테이블에서 공유되는 user_id 가진 row를 모두 조회한다.

SELECT b.order_number, b.user_id, b.prod_name, b.group_name, b.price, b.amount, u.user_name, u.addr, u.phone_number FROM buyTbl b INNER JOIN userTbl u ON b.user_id = u.user_id;

INNER JOIN을 벤다이어그림으로 표현하면 다음과 같다.

 

2. LEFT JOIN

PRIMARY KEY로 연결된 두 테이블에서 연결된 두 테이블에서 공유되는 user_id 가진 row를 모두 조회 + LEFT JOIN 명령어를 기준으로 왼쪽에 있는 테이블(이 케이스에서는 userTbl)이 가진 자료값은 모두 조회한다. 

SELECT * FROM userTbl u LEFT JOIN buyTbl b ON b.user_id = u.user_id;

LEFT JOIN을 벤다이어그림으로 표현하면 다음과 같다.

 

3. RIGHT JOIN

PRIMARY KEY로 연결된 두 테이블에서 연결된 두 테이블에서 공유되는 user_id 가진 row를 모두 조회 + RIGHT JOIN 명령어를 기준으로 오른쪽에 있는 테이블(이 케이스에서는 buyTbl)이 가진 자료값은 모두 조회한다.

SELECT * FROM userTbl u RIGHT JOIN buyTbl b On b.user_id = u.user_id;

RIGHT JOIN을 벤다이어그림으로 표현하면 다음과 같다.

 

 

 

4. MySQL에서 UNION 키워드로 구현한 FULL OUTER JOIN

FULL OUTER JOIN의 개념은 두 테이블이 가진 자료를 모두 불러오는 것인데, MySQL에서는 해당 명령어를 사용하여 구현할 수 없으므로 코드 상으로 UNION이라는 키워드를 통해 LEFT JOIN한 결과물과 RIGHT JOIN한 결과물을 조회하여 전체 자료값을 조회한다.

SELECT * FROM student s LEFT JOIN membership m 
    ON s.user_name = m.user_name 
    UNION 
    (SELECT * FROM student s RIGHT JOIN membership m 
    ON s.user_name = m.user_name);

 

 

FULL OUTER JOIN을 벤다이어그림으로 표현하면 왼쪽과 같다. 이걸 UNION으로 연결해서 구현하면 교집합 부분이 중복되어 출력되지 않을까? 싶었는데 MySQL에서 LEFT JOIN과 RIGHT JOIN에서 겹치는 부분은 눈치있게 한번씩만 조회해주는 걸 확인할 수 있었다.