본문 바로가기

CS ﹒ Algorithm/Database

데이터베이스 (3) JOIN문 입문하기 (Feat. MySQL)

MySQL에서 FULL OUTER JOIN은 직접 구현해야 한다. 내장 기능으로 제공되지 않음.

 

 

 

 

 

SQL의 꽃이자 1차 진입장벽인 JOIN문이다.

그런데 그건 복잡한 쿼리문에서 그런 거고 간단한 JOIN문은 귀엽고 깜찍하고 자주 쓰고 싶어지는 그런 아이들이다.

어려운 건 인프X이나 패X에서 돈 주고 강의 들으면서 배우고 여기서는 JOIN문의 기본 사용 방법과 형태를 알아보자.

다루는 내용 = Cross join, inner join, outer join(LEFT JOIN) , join+update,  join+delete

 

 

 

 

 

 

 

 

Cross Join

첫 번째로 Cross Join이다.

정말 쌩뚱맞은 형태의 조인이라고 볼 수 있는데, 자주 쓰이는 것도 아니고 아마 JOIN문을 사용하려는 대부분의 사람들이 원하는 형태는 아닐 것이다.

CROSS JOIN은 말 그대로 A테이블과 B테이블을 각 레코드마다 다 붙여서 테이블을 생성해준다.

만약 3개의 컬럼을 가진 A의 테이블과 3개의 컬럼을 가진 B 테이블이 있다면 총 3 * 3 = 9개의 테이블이 생성된다.

사용법도 단순하다.

 

SELECT * FROM Customer a
    CROSS JOIN `Order` O;

 

크로스 조인하고 싶은 각 테이블 명 사이에 CROSS JOIN만 적어주면 된다.

 

 

 

 

 

SELECT b.OrderDate date, a.CustomerName name, a.CustomerAddress address, CustomerSex sex, CustomerAge age, b.OrderPrice price, c.CarName carName, c.Maker brand
FROM Customer a, `Order` b, Car c Where (a.CustomerId = b.CustomerId) AND (b.CarId = c.CarId)
ORDER BY b.OrderDate;

Inner Join

위는 JOIN을 사용하지 않고 원시적인 형태로 구현한 Inner Join이다.

조건에서 Customer 테이블의 CustomerId와 OrderTable의 CustomerId가 같고, 해당 Order 테이블의 CarId와 Car 테이블의 CarId가 같은 것을 찾아 교집합을 찾은 것이다.

 

해당 쿼리문을 JOIN을 사용하여 작성할 경우 아래와 같다.

 

SELECT b.OrderDate date, a.CustomerName name, a.CustomerAddress address, CustomerSex sex, CustomerAge age, b.OrderPrice price, c.CarName carName, c.Maker brand
FROM Customer a
    JOIN `Order` b
        ON a.CustomerId=b.CustomerId
    JOIN Car c
        ON b.CarId=c.CarId
ORDER BY b.OrderDate;

 

둘은 완벽하게 같은 기능을 수행하지만 JOIN을 사용한 쪽이 훨씬 가독성이 좋은 것을 확인할 수 있다.

당장은 약간의 차이지만 쿼리문이 복잡해질 수록 이 차이는 엄청나게 벌어질 것이다.

 

 

 

 

 

 

 

LEFT OUTER JOIN

 

일단 LEFT JOIN이라고 작성하든 LEFT OUTER JOIN이라고 작성하든 결과물은 같다.

다만 SQL 표준에서는 OUTER를 작성하는 것을 권장하고 있다.

LEFT JOIN문을 사용 시 SELECT 바로 뒤에 오는 LEFT에 해당하는 컬럼은 무조건 모두 표시하고 우측에는 ON절에 작성한 조건에 맞는 데이타를 가져오되, 없으면 NULL로 처리한다.

 

" 일단 있든 없든 해당 테이블 컬럼까지 다 보여줘 빼애애액~~~ " 이게 LEFT OUTER JOIN이라고 생각하면 편하다.

그리고 "LEFT"면 LEFT에 해당하는 데이터를 반드시 다 보여주는 것이고 RIGHT는 그 반대다. 이게 끝이다.

 

 

실무에서 INNER JOIN은 주로 특정 데이터를 출력하기 위해서 사용되고, OUTER JOIN은 누락된 데이터를 찾는 것에 주로 사용된다고 한다.

위와 같이 WHERE문을 붙여서 우측 테이블이 NULL인 것만 보여달라고 하면 누락된 값만 꺼내서 볼 수 있을 것이다.

 

 

 

 

 

 

 

 

 

 

JOIN + UPDATE , JOIN + DELETE

 

 

UPDATE문은 크게 어려운 점이 없다.

Customer c를 기준으로 Order o와 c.CustomerId = o.CustomerId의 조건을 충족하는 경우

해당 조인으로 만들어진 테이블에서 o.CustomerId가 1인 레코드의 OrderPrice 컬럼 값을 100000으로 만드는 것이다.

 

하지만 DELETE문의 경우 별명(AS)를 사용하기 위해서 저렇게 작성하게 되는데.. 처음 배우는 입장에서는 상당히 당황스럽게 느껴질 수 있다.

만약 헷갈리면 그냥 테이블 이름 전체를 다 적는 방식으로 작성해도 된다.

 

아래의 DELETE + JOIN문은 위와 동일하게 작동한다.

 

DELETE `Order` FROM `Order`
    INNER JOIN Customer c
        On c.CustomerId = `Order`.CustomerId
WHERE `Order`.CustomerId=1;