어떤 유저가 언제 어떤 물건을 샀는지 기록해 놓은 자료다. user_data.xlsx
짐작하다시피, product는 이전에 등장했던 product_data 테이블의 product_id 열과 대응된다.
저 유저가 산 품목의 이름이 무엇인지 궁금하다면 product_data 테이블을 참조하여 이름을 가져와야 할 것이다.
말하자면 엑셀의 vlookup(), R의 merge() 에 해당하는 기능이 필요하다.
SQL에서는 이 역할을 JOIN이 담당한다.
일단 다음 쿼리를 보자.
SELECT
user_data.*
,
product_data.name
FROM
user_data
LEFT JOIN
product_data
ON
user_data.product = product_data.product_id
ORDER BY user_data.log_num
결과는 다음과 같다.
쿼리를 분석해 보자.
SELECT
user_data.*
,
product_data.name
FROM
user_data
LEFT JOIN
product_data
ON
user_data.product = product_data.product_id
ORDER BY user_data.log_num
먼저 눈에 뜨이는 것은 name이나 log_num 같은 열이름을 이야기할 때 그냥 이야기하지 않고
product_data.name 이나 user_data.log_num 처럼 점(.)으로 구분하여 해당 열이 속한 테이블을 적어 준다는 점이다.
두 개 이상의 테이블을 사용할 때는 열 이름이 중복될 수 있으므로 이와 같이 명시해 주는 것이 좋다.
SELECT 에서는 user_data 테이블의 모든 열(*)과 product_data 테이블의 name 열을 보겠다고 이야기한다.
두 항목은 콤마(,)로 구분되어 있다.
해당 열들을 가져올 곳은(FROM) 말하자면 현재는 존재하지 않는 테이블인데, user_data와 product_data가 서로 연결된(LEFT JOIN) 가상의 테이블이다.
해당 테이블은 user_data 의 product 열과 product_data 의 product_id 열의 자료가 서로 일치하는 행들을 연결해 만들었다. (ON)
연결하는 방식에는 LEFT JOIN, RIGHT JOIN, INNER JOIN 세 가지가 있는데 (앞의 두 가지를 OUTER JOIN 이라고도 한다)
LEFT JOIN은 LEFT JOIN이 쓰인 곳 왼쪽의 테이블을 기준으로, 오른쪽 테이블을 참조하여 항목을 채워 넣는다.
만일 왼쪽 테이블에 있는 항목이 오른쪽 테이블에는 없다면, 해당 항목은 NULL로 표기된다. (왼쪽 테이블의 항목은 모두 출력)
RIGHT JOIN은 LEFT JOIN과 반대로 오른쪽 테이블을 기준으로 한다.
INNER JOIN은 왼쪽 테이블과 오른쪽 테이블 모두에 있는 항목만 표시한다.
R로 보자면 기본 merge()가 INNER JOIN에 해당하고, LEFT JOIN 은 [all.x=T] 옵션이 되겠다.
마지막으로 쿼리에 매 열마다 테이블 이름을 기재해 주는 것이 번거롭다면 AS 명령을 사용하자.
AS는 as soon as possible... 할때 그 as는 아니고 Aliases 의 약자라고 하지만, 개인적으로는 앞의 as로 생각해도 무방할 듯싶다.
SELECT
user_data.*
,
product_data.name
FROM
user_data AS u
LEFT JOIN
product_data AS p
ON
user_data.product = product_data.product_id
ORDER BY user_data.log_num
FROM 부분에 AS 명령만 두 개 추가하였다.
이제 이 쿼리 내에서 user_data 테이블은 u로, product_data 테이블은 p로 부르겠다는 이야기다.
그러므로 아래와 같이 쿼리를 간단하게 줄일 수 있다.
SELECT
u.*
,
p.name
FROM
user_data AS u
LEFT JOIN
product_data AS p
ON
u.product = p.product_id
ORDER BY u.log_num
'MySQL' 카테고리의 다른 글
[MySQL] 테이블에 데이터 입력하기 INSERT INTO (0) | 2017.12.10 |
---|---|
[MySQL] 테이블 이름 확인하기 SHOW TABLES (0) | 2017.12.08 |
[MySQL] DB에서 특정 행들만 가져오기(1) - WHERE 절의 "or"를 이용 (0) | 2017.09.08 |
[MySQL] 결과 테이블의 일부 조건만 출력하기 HAVING (0) | 2017.08.04 |
[MySQL] 일부 값만 음수로 계산하기 (조건문 CASE) (0) | 2017.07.28 |
[MySQL] apmsetup으로 연습환경 구축하기, 데이터 넣기 Import (0) | 2017.07.25 |
[MySQL] 합 구하기 sum / 그룹별로 집계하기 group by / 정렬 order by (1) | 2017.05.05 |
[MySQL] 조건절 WHERE 사용하기(and, or, not, like) (0) | 2017.05.04 |
[MySQL] 개수 세기 count / 이름 지정하기 as (0) | 2017.05.03 |
[MySQL] MS Access 에서 연습 환경 구축하기 (0) | 2017.05.02 |
댓글