[MySQL] join
mysql join 문
SQL(Structured Query Language)의 가장 큰 특징 중의 하나는 여러개의 테이블을 연결시켜 데이터를 검색하거나 조작할 수 있는 기능이다.
이것은 데이터를 쉽고 빠르게 검색하고 불필요한 데이터를 줄여주는 장점이 있다.
다른 SQL 언어와 마찬 가지로 MySQL도 join명령어로 이 연산을 수행한다.
간단히 말하면 join은 두개 이상의 테이블로부터 필요한 데이터를 연결해 하나의 포괄적인 구조로 결합시키는 연산이다.
- users table
id | name | |
---|---|---|
1 | 폰돌 | [email protected] |
2 | 홍길동 | [email protected] |
3 | 김기린 | [email protected] |
4 | 호랑이 | [email protected] |
- lesson table
id | lesson |
---|---|
1 | 영어 |
2 | 수학 |
3 | 국어 |
- class table
id | user_id | class |
---|---|---|
1 | 1 | A |
2 | 2 | B |
3 | 3 | A |
4 | 4 | B |
Cross Join
Cross Join은 가장 기본적인 join의 타입으로 한 테이블에 있는 각각의 열이 다른 테이블의 모든 열에 간단하게 매치되어 출력된다. 능률적이지는 않지만, 모든 join 의 공통된 특징을 나타내준다.
SELECT * FROM users, lesson;
매우 많은 열들이 출력될 것이다. users(4) 와 lesson(3) 개가 모두 조인된 12개 열의 결과를 출력한다.
그럼 여기서 영어를 듣는 User를 출력해 보자
SELECT
u.name, l.lesson
FROM
users u, lesson l
WHERE
l.lesson = '영어';
- Aliases : Aliases(별명)은 질의를 입력할 때 반복적인 키의 입력을 줄여주는 방법으로 사용되어진다. 따라서 열을 지정해 줄 때 반복적으로 'users'를 한자 한자 입력하는 대신에, 질의내에 'from users u'를 지정해주고 'u'를 사용할 수 있다.
Cross Join이 테이블들을 연결해 주기는 하지만, 능률적이지는 못하다. 따라서 각각의 테이블들로 부터 우리가 원하는 데이타를 어떻게 하면 쉽게 선택할 수 있는지 계속 다음 장을 읽어보기 바란다.
Join (Inner Join)
일반적인 Join문믄 Inner Join 문이다.
Inner Join이라 함은 교집합을 의미한다.
ON 절이 없을 경우 Cross Join과 유사한 결과를 도출한다.
SELECT
u.name, c.class
FROM
query_users u
# INNER JOIN
JOIN
query_class c
ON
u.id = c.user_id;
Left | Right Join
Left Join은 사용자가 어떠한 제한을 기반으로 관심있는 모든 종류의 자료를 추출 하게한다. 테이블 join중 가장 막강한 옵션으로, 테이블을 매우 쉽게 조작할 수 있게 한다.
SELECT
u.name, c.class
FROM
users u
LEFT JOIN
class c
ON
u.id = c.user_id;
Left vs Right Join
Left나 Right나 똑 같은 기능을 담당한다. 단 기준이 되는 테이블이 좌측에 있나(users u) 우측에 있나(class c) 의 차이이다. 그 차이를 알아보기 위해 user 테이블에 아래와 같이 user를 추가하자.
- users table (반항아를 추가하자. 반항아는 어떤 class에도 속하지 않는다)
id | name | |
---|---|---|
5 | 반항아 | [email protected] |
- Left Join 결과
방금 추가한 반항아는 class 테이블에는 없으므로 null 값이 나온다.(모든 user가 나오고 맵핑되는 class가 출력)
- Right Join 결과
모든클라스를 출력하고 맵핑되는 user가 출력
고객이 주문한 모든 PC들의 목록을 추출해 낸다. 예를 들어, PHP3 또는 Perl 스크립트를 사용해 영수증을 출력하는데 사용할 수도 있다. 고객들에게 우리회 사로부터 구입한 모든 제품의 목록을 가끔씩 메일로 보내야 할 때에도 users 테이블과 연결해 사용할 수 있을 것이다.
- USING VS ON
users 와 class 를 조인(JOIN)하는데 user_id 키가 양쪽 테이블에 모두 있을 경우 USING 을 사용할 수 있다.
하지만 만일 조인시에 컬럼 이름이 다를 경우에는 ON 을 사용한다. 물론, 컬럼 이름이 같은 것을 기반을 조인을 할때도 ON 을 상용해도 된다.
SELECT
u.name, c.class
FROM
query_users u
JOIN
query_class c
USING(user_id) # 만약 users 테이블에 user_id라는 키값이 있을 경우 이렇게 사용해도 된다.
Self-joins
Self-join은 관리자가 하나의 테이블에 관련된 데이타를 집중시키는 막강한 방법을 제공해 준다.
SELF JOIN는 따로 구문이 있지는 않고 아래처럼 동일 두개의 테이블을 JOIN하는 기법을 일컫는다.
select t1.*, t2.* from ws as t1, ws as t2;