새벽의 블로그
< Mysql > JOIN, 프로그래머스 성분으로 구분한 아이스크림 총 주문량 본문
1. INNER JOIN
- 설명: 두 테이블에서 공통으로 일치하는 행만을 반환합니다. 일치하지 않는 행은 결과에 포함되지 않습니다.
- 사용 예시:
- 결과: TableA와 TableB의 id 값이 일치하는 행만 반환합니다.
SELECT A.column1, B.column2
FROM TableA AS A
INNER JOIN TableB AS B ON A.id = B.id;
2. LEFT JOIN (LEFT OUTER JOIN)
- 설명: 왼쪽 테이블의 모든 행을 반환하며, 오른쪽 테이블에서 일치하는 행이 있으면 함께 반환하고, 없으면 NULL로 표시합니다.
- 사용 예시:
- 결과: TableA의 모든 행이 포함되며, TableB에 일치하는 값이 없으면 NULL로 채워집니다.
SELECT A.column1, B.column2
FROM TableA AS A
LEFT JOIN TableB AS B ON A.id = B.id;
3. RIGHT JOIN (RIGHT OUTER JOIN)
- 설명: 오른쪽 테이블의 모든 행을 반환하며, 왼쪽 테이블에서 일치하는 행이 있으면 함께 반환하고, 없으면 NULL로 표시합니다.
- 사용 예시:
- 결과: TableB의 모든 행이 포함되며, TableA에 일치하는 값이 없으면 NULL로 채워집니다.
SELECT A.column1, B.column2
FROM TableA AS A
RIGHT JOIN TableB AS B ON A.id = B.id;
4. FULL JOIN (FULL OUTER JOIN)
- 설명: 두 테이블의 모든 행을 반환하며, 어느 한쪽 테이블에만 있는 값은 NULL로 표시합니다. MySQL에서는 FULL OUTER JOIN을 직접 지원하지 않기 때문에 UNION을 사용하여 이를 구현합니다.
- 사용 예시:
- 결과: TableA와 TableB의 모든 행을 포함하며, 어느 한쪽에만 있는 값은 NULL로 표시됩니다.
SELECT A.column1, B.column2
FROM TableA AS A
LEFT JOIN TableB AS B ON A.id = B.id
UNION
SELECT A.column1, B.column2
FROM TableA AS A
RIGHT JOIN TableB AS B ON A.id = B.id;
5. CROSS JOIN
- 설명: 두 테이블 간의 카티션 곱(Cartesian Product)을 수행합니다. 모든 행이 서로 조합되어 가능한 모든 쌍이 반환됩니다. 특정 조인 조건이 없는 경우, 기본적으로 카티션 곱이 발생합니다.
- 사용 예시:
- 결과: TableA와 TableB의 가능한 모든 행 조합이 결과에 포함됩니다.
SELECT A.column1, B.column2
FROM TableA AS A
CROSS JOIN TableB AS B;
6. SELF JOIN
- 설명: 동일한 테이블을 자신과 조인하는 방식입니다. 테이블 내의 행을 서로 비교하거나 특정 연관 관계를 나타내는 데 사용합니다.
- 사용 예시:
- 결과: TableA의 id와 parent_id가 일치하는 행이 반환됩니다.
SELECT A.column1, B.column1
FROM TableA AS A
JOIN TableA AS B ON A.id = B.parent_id;
정리
- INNER JOIN: 공통된 데이터만
- LEFT JOIN: 왼쪽 테이블의 모든 데이터, 일치하지 않는 오른쪽 테이블 데이터는 NULL
- RIGHT JOIN: 오른쪽 테이블의 모든 데이터, 일치하지 않는 왼쪽 테이블 데이터는 NULL
- FULL JOIN: 두 테이블의 모든 데이터, 일치하지 않는 데이터는 NULL (MySQL에서는 UNION으로 구현)
- CROSS JOIN: 모든 행 조합 (카티션 곱)
- SELF JOIN: 동일한 테이블 간의 조인
프로그래머스 성분으로 구분한 아이스크림 총 주문량
https://school.programmers.co.kr/learn/courses/30/lessons/133026
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
정답코드
SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER) as TOTAL_ORDER
FROM FIRST_HALF AS F
JOIN ICECREAM_INFO AS I ON F.FLAVOR = I.FLAVOR
GROUP BY INGREDIENT_TYPE
해석
INGREDIENT_TYPE으로 그룹화 하여, INGREDIENT_TYPE과 그룹에서의 TOTAL_ORDER 총합을 TOTAL_ORDER라는 칼럼명으로 셀렉하여 보여준다. ICECREAM_INFO와 FIRST_HALF 테이블에 우리가 원하는 정보가 흩어져 있기 떄문에 JOIN을 행하는데, 이를 FLAVOR값이 같다는 기준으로 조인한다. ON 조건을 써주지 않으면 모든 경우의 수에 대하여 조인하기 때문에 상관관계가 없는 행도 조인되어서 오류이다.
(에시) ON 없이 FROM ICECREAM_INFO JOIN FIRST_HALF만 하면 이렇게 된다.
*join을 행할 때는 꼭 JOIN ON 조건을 써주는 것을.. 까먹지 않도록 한다.
*이 문제는 예시와 테스트 케이스가 같은 듯 비슷하지만 다른 케이스여서, 틀린 줄 알고 제출 안 하고 고민 중이었는데 그냥 제출해보니 맞는 코드여서 당황했다. 이런 경우도 있으니 로직이 맞는 것 같다면 일단 제출해보기 ..!!
'Dev tools > Database_MySQL' 카테고리의 다른 글
< MySQL > 터미널 기본 brew 명령어 (0) | 2024.11.21 |
---|---|
< MySQL > postinstall 에러 (0) | 2024.11.21 |
< MySQL > IFNULL 함수 (0) | 2024.10.17 |