본문 바로가기
Database/MySQL

[Mysql] 테이블 3개 join , order by, group by, sum null값 지우기, case when

by java나유 2022. 7. 9.

테이블 3개 조인하기

left join  /  join

 

SELECT * FROM 테이블1 LEFT JOIN 테이블2 ON 테이블1.필드명 = 테이블2.필드명 JOIN 테이블3 ON 테이블1.필드명 = 테이블3.필드명;

 

으로 테이블3개를 join할 수 있습니다. 물론 동일한 값 설정은 해줘야하고요.

 

테이블 info, item, paly를 합쳐보겠습니다.

 

table info

table item

table play

 

table확인해보니까 info.name 과 play.name 과 같고 item.item하고  play item이 같네요. 

 

SELECT * FROM 테이블1 LEFT JOIN 테이블2 ON 테이블1.필드명 = 테이블2.필드명 JOIN 테이블3 ON 테이블1.필드명 = 테이블3.필드명;

그렇다면..! 합쳐보겠습니다.

select * from info left join play on info.name=play.name join item on item.item=play.item;

오타! 주의! 하고 천천히 3table을 합쳐보았습니다.

여기서 끝나면 좋겠지만.. 응용문제를 가볼게요.

 

각 테이블의 요소를 하나씩 뽑아 조건을 걸어 출력할거예요.

조건은 챔피언명, 챔피언이 구매한 아이템의 개수(count) 총구매가격(sum) 입니다. 

총 구매가격은 sell과 buy라는 함정이 있기떄문에 buy값만 출력해야해요. 조건+조건인거죠.

+총 구매가격을 내림차순으로 order by해줘야하겠지요. 그리고 챔피언 이름도 group by..!

 

아까 3개의 테이블을 합친 코드를 그대로 가져와 수정해서 출력해야합니다.

select * from info left join play on info.name=play.name join item on item.item=play.item;

바로 이 코드였는데요. 바로 그럼 수정을 해볼게요.ㅎㅎ..^^^^^

3개의 테이블을 합치는거 성공한다면 조금만 고민하면됩니다. 물론 처음에는 막막할 수 있어요.`(*>﹏<*)′

 


select info.name as 챔피언명, count(*) as 개수,sum(item.price) as 총구매가격 from info left join play on info.name=play.name join item on item.item=play.item where play.shop='buy' group by info.name order by 총구매가격 asc;

select info.name as 챔피언명, count(*) as 개수,sum(item.price) as 총구매가격 from info left join play on info.name=play.name join item on item.item=play.item where play.shop='buy' group by info.name order by 총구매가격 asc;

 

상기코드로 출력했어요. 코드 분석을 해야해요


select info.name as 챔피언명, count(*) as 개수,sum(item.price) as 총구매가격 from info left join play on info.name=play.name join item on item.item=play.item where play.shop='buy' group by info.name order by 총구매가격 asc;

 

챔피언 이름을 먼저 부르겠죠? 그리고 챔피언들이 구매한 횟수(아이템 구매)에 챔피언들 이름이 있기때문에.. 

불러준다음 그대로 count를 해주는거예요. 뒤에 where조건에 buy(구매)한 애들만 카운트해주는거죠.

그 다음 아이템 가격은 sum해줍니다. 여기서 as총구매가격 이라는 가상이름을 붙혀주었기 떄문에

뒤에 order by acs;(정렬) 할 때 가상이름으로 넣어주어야 제대로 정렬됩니다.

만약 챔피언 별 아이템산 개수 산 금액 , 판 개수 , 판금액별로 뽑고싶다면..

먼저 테이블2개를 조인해야하고..

 

case when then 1 end 문법

select play.name,count(case when play.shop='buy' then 1 end) as 산개수,sum(case when play.shop ='buy' then item.price end) as 산금액,count(case when play.shop='sell'then 1 end)as 판개수,sum(case when play.shop='sell'then item.price end) as 판금액 from play join item on play.item=item.item  group by play.name;

 

sum에 NULL을 지우고 싶다면? IFNULL함수 써주기

ifnull(sum(필드),0)

 

select play.name,count(case when play.shop='buy' then 1 end) as 산개수,ifnull(sum(case when play.shop ='buy' then item.price end),0) as 산금액,count(case when play.shop='sell'then 1 end)as 판개수,Ifnull(sum(case when play.shop='sell'then item.price end),0)as 판금액 from play join item on play.item=item.item  group by play.name;

 

name에서 '가렌','나르','녹턴','니코'의 아이템 구매/판매 내역 및 이름 뽑기

select name,item from play where name in ('가렌','나르','녹턴','니코');

 

아이템제일 많이 언급된 거 뽑기

select item from play group by item order by count(item) desc limit 1;

728x90

댓글