06. 테이블 결합하기(↔️) / JOIN, DATE_ADD

기초/SQL|2020. 12. 30. 20:37

관계형 데이터베이스(Relative DataBase)

>> 관련이 있는 테이블을 큰 하나의 테이블이 아니라 여러 개의 테이블로 나눠서 저장함.

그리고 그 테이블간의 관계성으로 데이터를 저장한다.

why??? 중복해서 저장할 필요가 없는 정보들을 효율적으로 저장하기 위해서임.

 

JOIN : 관련이 있는 두 개의 테이블을 결합해서 데이터를 한 번에 가져오게 하는 것 실습링크

✔️SELECT * FROM Users, Orders WHERE Users.ID = Orders.UserID

= SELECT * FROM Users INNER JOIN Orders ON Users.ID = Orders.userID

결과에서 왼쪽에 두고 싶은 테이블을 FROM 뒤에 써 준다.

>SELECT * FROM Orders ➡️ 이 테이블이 결과의 왼쪽에(먼저) 제시될 것임. 기준 테이블이 된다.

INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID

INNER JOIN Customer s ㄴJOIN이 되는 기준 제시.

>> Orders테이블의 CustomerID와 Customers테이블의 CustomerID가 같은 모든 데이터를 결합해서 보여준다.

 

INNER JOIN과 OUTER JOIN의 차이?

>> OUTER는 두 테이블이 JOIN되었을 때 그 기준에 부합하지 않는 NULL 데이터도 함께 표시해 준다.

ex. 고객 정보 테이블주문 정보 테이블을 결합하여 "고객주문 정보"를 보려고 할 때,

INNER는 주문 정보 테이블에 존재하지 않는(=가입은 되어 있으나 주문은 한 적이 없는) 고객의 데이터는 제외하지만

OUTER는 주문을 한 번도 한 적이 없는 고객의 데이터 NULL로 표시한다.

 

Left/Right Join 둘 다 Outer Join의 한 종류.

>> 어떤 테이블을 기준으로 테이블을 출력하느냐에  따라 분류된다.

LEFT JOIN의 경우 JOIN 조건에 부합하는 데이터가 오른쪽에 있으면 select하고, 없다면 null값을 채워넣는다.

LEFT JOIN : 왼쪽을 기준으로 왼쪽 테이블의 데이터는 모두 불러오되,

오른쪽 테이블의 데이터는 왼쪽에 대한 것만 불러오겠다.

RIGHT JOIN : 오른쪽을 기준으로... *거의 안씀.

 

***  inner join과 left/right join의 데이터 결과 값 차이가 NaN은 아니다 ***

inner join에서는 두 테이블 간의 공통된 값이 나오고, left join은 left 테이블을 기준으로 join하기 때문에,

right 테이블이 NaN값으로 나오게 된다. NaN값뿐만 아니라 left에 있는 값들도 출력되기 때문에 결과값은 달라진다.

 

연습문제 1 링크

우여곡절 끝에... 성공한 코드

연습문제 2 링크

 

내가 짠 코드. 선생님이 짠 코드는 group by가 없었다.

연습문제 3 링크

내가 짠 코드
선생님이 짠 코드

연습문제 4 링크

내가 짠 코드
선생님이 짠 코드

 

연습문제 5 링크

테이블은 자기 자신도  join 할 수 있다!!! (SELF JOIN)

self join은 하나의 테이블로 두 개의 테이블로 엮어 주기 때문에
alias(에일리아스/알리아스)로 꼭 이름을 지어 줘야 한다.
그래야 하나의 테이블을 두 개로 각각 구분해서 사용할 수 있게 된다.

해답

연습문제  6 링크

내가 (참고해서) 짠 코드
선생님이 예시로 짠 틀린  코드

* Date, Time Value는 +1, -1 같은 걸로 원하는 대로 연산이 안된다.

(+1 연산을 하기 위해서 date타입을 자동으로 int타입으로 변환해버림.)

 

연산을 위해서는 특별한 함수를 써 주어야 한다.

DATE_ADD(기준 날짜, INTERVAL) : 기준 날짜로부터 INTERVAL(SECOND/...YEAR)만큼 더해준다. (음수값 넣으면 빼기가 됨)

DATE_SUB(기준 날짜, INTERVAL) :  기준 날짜로부터 INTERVAL(SECOND/...YEAR)만큼 빼준다.

 

특별한 함수를 활용한 올바른 코드

 

 

참고 링크

blog.codinghorror.com/a-visual-explanation-of-sql-joins/

sql-joins.leopard.in.ua/

댓글()