Programming Language/SQL 문제풀이

[SQL 문제풀이] 3. JOIN으로 두 개의 테이블 데이터 사용하기

wakelight23 2024. 10. 16. 21:06

JOIN?

● 공통 칼럼을 기준으로 두 테이블을 합쳐서

   각각 테이블에서 필요한 데이터를 가져오는 것

 

● LEFT JOIN : 공통 칼럼(키값)을 기준으로,

                         하나의 테이블에 값이 없더라도 모두 조회

예시 TABEL 1 : 주문정보

        TABEL 2 : 고객정보

  음식점명(TABLE1) 고객코드(TABLE1, 2) 전화번호(TABLE2) 연령(TABLE2)
1 원투 1001 000-0000-0001 17
2 가나 1002 000-0000-0002 23
3 에이비 1003 000-0000-0003 34
4 시디 1004 000-0000-0004 43
5 쓰리투 1005 000-0000-0005 51
6 디디야 1006    

                                                      → 공통 칼럼(키값)                       ↓ ↓ ↓ ↓ ↓ ↓

                                                                     LEFT JOIN은 비어있는 곳도 같이 조회

- LEFT JOIN은 합집합

 

 

● INNER JOIN : 공통 칼럼(키값)을 기준으로,

                           두 테이블 모두에 있는 값만 조회

예시 TABEL 1 : 주문정보

        TABEL 2 : 고객정보

  음식점명(TABLE1) 고객코드(TABLE1, 2) 전화번호(TABLE2) 연령(TABLE2)
1 원투 1001 000-0000-0001 17
2 가나 1002 000-0000-0002 23
3 에이비 1003 000-0000-0003 34
4 시디 1004 000-0000-0004 43
5 쓰리투 1005 000-0000-0005 51

                                         → 공통 칼럼(키값) 

 

- INNER JOIN은 교집합

 

문제 : 음식점별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 세분화하기

( 평균 음식 주문 금액 기준 : 5천 미만 / 1만 미만 / 3만 미만 / 3만 초과

  평균 연령 : 20대 이하 / 30대 / 40대 / 50대 이상 )

 

예시 TABEL 1 : 주문정보

  고객코드 음식점명 가격 주문수량
1 1001 식스맨 18000 3
2 1002 피자리아 60000 2
3 1003 스케스시 42000 2
4 1004 셋찜닭 45000 9
5 1005 단리향 54000 6

 

예시 TABEL 2 : 고객정보

  고객코드 성함 연령
1 1001 홍길동 43
2 1002 장시동 25
3 1003 주다인 18
4 1004 한시한 34
5 1005 장춘동 54

 

- 구문 정리

 1. 어떤 테이블에서 데이터를 뽑을 것인가 - 주문정보, 고객정보

 2. 어떤 칼럼을 사용할 것인가 - 음식점명, 가격, 주문수량, 연령, 고객코드

 3. 어떤 조건을 지정해야 하는 것인가 - GROUP BY 1

 4. 어떤 함수를 이용해야 하는가

       - AVG(가격), AVG(연령), CASE WHEN THEN END

 

- 전체 구문

SELECT 음식점명,
             CASE WHEN 평균가격 < 5000 THEN '평균가격1'
             WHEN 평균가격  BETWEEN 5000 and 9999 THEN '평균가격2'
             WHEN 평균가격  BETWEEN 10000 and 30000 THEN '평균가격3'
             WHEN 평균가격  > 30000 THEN '평균가격4'
             ELSE 'Unknown'
            END 평균가격,
            CASE WHEN 평균연령 BETWEEN 0 and 29 THEN ' 평균연령1'
            WHEN 평균연령 BETWEEN 30 and 39 THEN ' 평균연령2'
            WHEN 평균연령 BETWEEN 40 and 49 THEN ' 평균연령3'
            WHEN 평균연령 >= 50 THEN ' 평균연령4'
            ELSE 'Unknown'
            END 평균연령
FROM
          (
            SELECT ab.음식점명,
            AVG(가격) 평균가격,
            AVG(연령) 평균연령
            FROM 주문정보 ab INNER JOIN 고객정보 cd ON ab.고객코드=cd.고객코드
            GROUP BY 1
           ) a

 

- 결과물

  음식점명 평균금액 평균연령
1 식스맨 평균금액1 평균연령3
2 피자리아 평균금액3 평균연령1
3 스케스시 평균금액3 평균연령1
4 셋찜닭 평균금액2 평균연령2
5 단리향 평균금액2 평균연령4