[SQL 문제풀이] 3. JOIN으로 두 개의 테이블 데이터 사용하기
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 |