[MySQL] alias/ join/ Using

이영주·2021년 3월 31일
2

MySQL

목록 보기
10/11

컬럼 이름과 테이블 이용에 사용되는 alias 차이가 무엇일까?

(1) 컬럼의 alias
실제로 우리에게 그 alias로 변환되어서 보여지게 하기 위한 용도로 쓰인다.

(2) 테이블의 alias
테이블의 alias는 조회 결과에서 보기 위한 게 아니라 SQL 문의 전체 길이를 줄여서 가독성을 높이기 위해 사용된다. 특히 조인(join)을 할 때, 만약 서로 다른 테이블에 같은 이름의 컬럼이 존재한다면, SQL 문 안에서 그 컬럼을 가리킬 때 무슨 테이블의 컬럼인지를 더 짧게 표현해주기 위해서도 사용된다.

주의할 점

FROM 절에서 테이블에 alias를 한번 붙였으면, 다른 모든 절에서 그 테이블은 그 alias로만 나타내야 한다. 만약 다른 절에서 alias가 아닌 원래의 테이블 이름을 사용하면 오히려 에러가 난다.


결합 연산

(1) LEFT OUTER JOIN / RIHGT OUTER JOIN

(2) INNER JOIN

3개의 테이블 join 하기

SELECT *
FROM review INNER JOIN item
        ON review.item_id = item.id
    INNER JOIN member
        ON review.mem_id = member.id;
        

집합 연산

(1) 교집합 합집합 차집합과 같은 느낌

(2) 테이블을 세로 방향으로 합치는 것에 관한 연산

(3) 두 테이블은 컬럼 구조가 같을때. 그러니까 두 테이블은 같은 종류의 테이블일 때 사용한다.

ex) 같은 종류의 테이블을 합치는 작업, 언제 이런 작업을 할까....?
사이트를 새 단장하려고 했던 개발팀은 기존의 member_A 테이블 말고 더 최근에 만들어진 member_B 테이블을 사용하려고 할 때?

member_A 테이블을 A 집합, member_B 테이블을 B 집합이라고 생각했을 때, 집합 관점에서 생각하면 다음과 같다.

(1) A ∩ B

(2) A - B

(3) B - A

(4) A U B

SQL에서 사용방법

(1) A ∩ B (INTERSECT 연산자 사용)

SELECT * FROM member_A 

INTERSECT 

SELECT * FROM member_B

(2) A - B (MINUS 연산자 또는 EXCEPT 연산자 사용)

SELECT * FROM member_A 

MINUS

SELECT * FROM member_B

(3) B - A (MINUS 연산자 또는 EXCEPT 연산자 사용)

SELECT * FROM member_B

MINUS

SELECT * FROM member_A

(4) A U B (UNION 연산자 사용)

SELECT * FROM member_A

UNION

SELECT * FROM member_B

(*합집합을 나타낼 때, 두 집합이 공통적으로 갖고 있는 원소(교집합에 속하는 원소들)는 중복을 제거하고 하나만 표시된다 ! 같은 원리로 UNION 연산자도 두 테이블에 공통적으로 존재하는 row는 하나만 결과에 표시한다!)

BUT!!!
3가지 집합 연산자들(INTERSECT, MINUS, UNION) 중에서 MySQL에서는 버전 8.0 기준으로 UNION 연산자만 지원한다...(다른 DBMS인 오라클에서는 3가지 연산자 모두를 지원.)

그래서 MySQL에서는 INTERSECT, MINUS 연산은 포기해야하는 걸까요? 비록 이런 집합 연산자를 바로 사용할 수는 없지만 결합 연산에 해당하는 조인을 사용해서 간접적으로 원하는 결과를 얻을 수 있다...(하지만 좀 귀찮다)

right outer join을 사용하면 member_B 테이블에는 있지만 member_A 에는 없는 로우들을 찾을 수 있다.
그다음 where 절에 old.id IS NULL 이런거 쓰면 된다


조인 - on 대신에 using 쓰는 경우도 있다!

기존 코드

ON old.id = new.id

using 사용한 코드

USING(id)

다른 종류의 조인들 (NATURAL JOIN , CROSS JOIN

▶ NATURAL JOIN

NATURAL JOIN은 두 테이블에서 같은 이름의 컬럼을 찾아서 자동으로 그것들을 조인 조건을 설정하고, INNER JOIN을 해준다.

이때까지 조인을 할 때마다 조인 조건을 설정했던 것과는 달리 NATURAL JOIN은 조인 조건을 자동으로 설정해주기 때문에 ON 절을 쓸 필요가 없다.

현업에서 잘 쓰지 않는 이유 -> 사실 두 테이블에 같은 이름의 컬럼이 있더라도 NATURAL JOIN을 쓰기보다는 ON 절에 조인 조건을 명시해주는 것이 좋다. NATURAL JOIN을 해버리면 SQL 문을 보더라도, 테이블 구조를 모르는 사람이라면 어떤 컬럼들을 기준으로 조인이 될지 알 수 없다.

▶ CROSS JOIN

CROSS JOIN은 한 테이블의 하나의 row에 다른 테이블의 모든 row들을 매칭하고, 그 다음 row에서도 또, 다른 테이블의 모든 row들을 매칭하는 것을 반복함으로써 두 테이블의 row들의 모든 조합을 보여주는 조인이다.
예를 들어, 여러 종류의 의류들 중에서도 상의들의 정보가 담긴 테이블, 하의들의 정보가 담긴 테이블이 있을 때 옷을 입을 때의 상-하의 조합들을 한눈에 보고싶은 경우에 CROSS JOIN을 사용하면 된다.

▶ SELF JOIN

SELF JOIN은 셀프라는 단어의 뜻 그대로 테이블이 자기 자신과 조인을 하는 경우를 말한다. 같은 테이블에 담긴 정보들을 마치 다른 별도의 테이블인 것처럼 간주하고 진행이 되서 다양한 관점에서 바라볼 수 있게 해준다.

▶ FULL OUTER JOIN = UNION 연산자

FULL OUTER JOIN은 두 테이블의 LEFT OUTER JOIN 결과와 RIGHT OUTER JOIN 결과를 합치는 조인. 대신, 이때 두 결과에 모두 존재하는 row들(두 테이블에 공통으로 존재하던 row들)은 한번만 표현된다.

▶ Non-Equi 조인

Equi 조인은 앞서 봤던대로 조인 조건에 (=) 등호를 사용했는데 동등 조건이 아닌 다른 종류의 조건을 사용해서 조인하는 것을 Non-Equi 조인이라고 한다.
특정 회원이 가입한 이후에 사이트에 올라온 상품들이 무엇인지 확인할 수 있다.

2개의 댓글

comment-user-thumbnail
2021년 7월 13일

잘봤어요 영주님 ^^

1개의 답글