http://www.tcpschool.com/mysql/mysql_multipleTable_join
다중 테이블 연산
다중 테이블 연산이란 말그대로 여러 개의 테이블을 연산하는 것이다.
두 개의 테이블에 연산을 하려면 테이블1 -> 연산, 테이블2 -> 연산 총 두번의 과정을 거쳐야하지만 다중 테이블 연산을 통해 한번에 여러개의 테이블을 가져올 수 있다.
MySQL에서 제공하는 다중 테이블 연산문은 다음과 같다.
- JOIN
- UNION
- 서브쿼리
JOIN
JOIN은 여러 개의 테이블에서 가져온 데이터들을 하나의 테이블이나 결과의 집합으로 표현해준다.
보통 SELECT문과 많이 쓰인다.
JOIN은 2가지 방식으로 나뉘는데 다음과 같다.
- INNER JOIN
- OUTER JOIN
INNER JOIN
INNER JOIN은 JOIN문을 실행했을 때 기본으로 실행되는 JOIN문으로 INNER JOIN대신 JOIN으로 사용할 수도 있다.
또, SELECT문에서 WHERE절을 사용한 것과 달리 ON절에 조건을 넣어 사용한다.
첫번째테이블명
INNER JOIN 두번째테이블명
ON 조건
or
첫번째테이블명
JOIN 두번째테이블명
ON 조건
첫번째 테이블과 두번째 테이블을 조건에 맞는 값끼리 합친다 (교집합) 라고 생각하면 이해하기 쉬울거같은데, INNER JOIN문의 결과를 벤다이어그램으로 나타내면 이러하다.
아래 두 테이블로 연습해보자!
두 테이블은 각각 다른 예제와 함께 만든 테이블이라 형식이나 기타 등등이 맞지 않을 수 있다... 감안하고 보자
SELECT * FROM Reservation INNER JOIN user ON Reservation.Name = user.name;
Reservation 테이블과 user테이블의 Name(name) 컬럼이 같은 경우 INNER JOIN문을 실행하였다.
아주 길지만 제대로 합쳐진걸 확인할 수 있다.
OUTER JOIN
OUTER JOIN은 LEFT JOIN과 RGIHT JOIN으로 나뉘며,
LEFT JOIN은 이름에서 알 수 있다시피 왼쪽 테이블을 기준으로 오른쪽 테이블을 JOIN한다.
RIGHT JOIN은 오른쪽 테이블을 기준으로 왼쪽 테이블을 JOIN한다.
왼쪽 오른쪽이라고 했지만 첫번째, 두번째라고 표현하는 편이 더 옳을 것 같다.
사용법은 INNER JOIN문과 크게 다르지 않다
첫번째테이블명
LEFT JOIN 두번째테이블명
ON 조건
첫번째테이블명
RIGHT JOIN 두번째테이블명
ON 조건
LEFT와 RIGHT JOIN은 기준이 되는 테이블 + 기준테이블 ∩(교집합) 다른테이블의 값을 보여주는데 글씨로 보면 이해가 잘 안되니 이번에도 벤다이어그램으로 보자
각 JOIN문의 결과는 크게 다르지 않으니 LEFT JOIN의 예시만 들어보겠다.
SELECT user.id, user.name, Reservation.id, Reservation.Name, Reservation.ReserveDate, Reservation.RoomNum
FROM user
LEFT JOIN Reservation
ON user.name = Reservation.Name;
각 테이블의 name(Name) 값이 같은 경우 LEFT JOIN을 해주었다.
조건에 일치하는 교집합들 외의 데이터는 NULL로 표현되는 것을 알 수 있다.
UNION
UNION은 여러 개의 SELECT문의 결과를 하나의 테이블이나 결과의 집합으로 표현해준다.
이때 각각의 SELECT 문으로 선택된 컬럼의 개수와 타입은 모두 같아야 하며, 그 순서도 같아야한다.
SELECT 컬럼명
FROM 테이블명
UNION
SELECT 컬럼명
FROM 테이블명
UNION은 표준 SQL 문법의 FULL OUTER JOIN의 역할을 대신해주는데, 각 테이블의 합집합을 나타내준다고 생각하면 이해가 편하다.
벤다이어그램으로 표현하면 다음과 같다.
위에서 사용하던 예제와 같은 테이블로 UNION을 수행하면
SELECT name FROM user UNION SELECT Name FROM Reservation;
이러한 결과가 나온다.
결과에서 보면 알 수 있듯이 UNION은 기본적으로 중복을 제거해주기 때문에 중복되는 데이터도 함께 출력하고 싶다면 ALL 키워드를 사용해야한다.
SELECT name FROM user UNION ALL SELECT Name FROM Reservation;
중복되는 name 컬럼도 함께 출력되는 것을 확인할 수 있다.
서브쿼리(subquery)
서브쿼리의 기본 정의를 보면
서브쿼리는 다른 쿼리 내부에 포함되어있는 SELECT문을 의미한다.
서브쿼리를 포함하고 있는 쿼리를 외부쿼리(outer query)라고 부르며, 서브쿼리는 내부쿼리(inner query)라고도 부른다.
서브쿼리는 반드시 괄호(())로 감싸져 있어야만 한다.
MySQL에서 서브쿼리를 포함할 수 있는 외부쿼리는 SELECT, INSERT, UPDATE, DELETE, SET, DO 문이 있으며,
이러한 서브쿼리는 또 다시 다른 서브쿼리 안에 포함될 수 있다.
라고 하는데 사실 이렇게 봐서는 잘 모르겠다.
쉽게 설명하자면 한 쿼리(절)안에 다른 테이블의 SELECT문을 집어넣는 문법이고, JOIN이나 UNION과 같은 동작을 수행하지만 사용법만 다르다로 이해할 수 있을 것 같다.
TCH School에서 기술한 서브쿼리의 특징은 다음과 같다.
- 서브쿼리는 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있게 해준다.
- 서브쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공한다.
- 서브쿼리는 복잡한 JOIN이나 UNION 보다 좀 더 읽기 편하다.
흠.
예제로 살펴보자
SELECT id, name, birth_day FROM user
WHERE name IN (SELECT Name FROM Reservation WHERE RoomNum = 409);
위 쿼리는 RoomNum이 409인 유저의 이름을 가져오는 예제이다.
RoomNum이 409인 유저는 븨나네이다.
이런식으로 서브쿼리는 쿼리를 조금 더 직관적으로 볼 수 있게 해준다. 따라서 복잡한 쿼리를 사용할 때에는 JOIN이나 UNION보다 서브쿼리를 사용하는 편이 좋다고 한다!
그럼 위의 쿼리를 JOIN이나 UNION으로 바꿔보자
SELECT u.id, u.name, u.birth_day
FROM user AS u, Reservation AS r
WHERE r.RoomNum = 409 AND u.name = r.Name;
바로 어떻게 가독성을 높여주는지 이해가 된다. 지금은 간단한 쿼리지만 테이블명이 더 길어지거나 더 복잡한 연산을 해야할 때에는 서브쿼리의 장점이 크게 두드러질 것 같다.
'Study > Database' 카테고리의 다른 글
[MySQL] 데이터 베이스 명명 규칙 (0) | 2022.03.12 |
---|---|
[MySQL] INDEX (0) | 2022.03.07 |
[MySQL] 제약 조건 (0) | 2022.03.02 |
[MySQL] 연산자와 함수 (0) | 2022.03.01 |
[MySQL] 타입: 숫자, 문자열, 날짜와 시간 (0) | 2022.03.01 |