@@ -72,6 +72,8 @@ SELECT COUNT(ANIMAL_ID) count
7272FROM ANIMAL_INS
7373```
7474
75+ * 풀이: ` COUNT(컬럼명) ` 은 특정 컬럼에 있는 데이터(행)의 개수를 세는 함수이다.
76+ * 여기서 뒤에 나오는 ` count ` 는 ` COUNT(ANIMAL_ID) ` 로 계산된 결과가 나오는 컬럼의 이름을 지정하는 것이다.
7577
7678## 중복 제거하기
7779
@@ -87,11 +89,130 @@ WHERE NAME IS NOT NULL
8789* 풀이 : 중복되는 이름은 하나로 치는 경우 ** DISTINCT** 을 사용하고, 이름이 NULL인 경우를 제외하는 조건에는 ` WHERE NAME IS NOT NULL ` 을 사용한다.
8890
8991
92+ ## 조건에 맞는 아이템들의 가격의 총합 구하기
93+
94+ [ 조건에 맞는 아이템들의 가격의 총합 구하기: 문제 링크] ( https://school.programmers.co.kr/learn/courses/30/lessons/273709 )
95+
96+ * 문제: ITEM_INFO 테이블에서 희귀도가 'LEGEND'인 아이템들의 가격의 총합을 구하는 SQL문을 작성해 주세요.
97+
98+ ``` sql
99+ SELECT SUM (PRICE) AS TOTAL_PRICE
100+ FROM ITEM_INFO
101+ WHERE RARITY = ' LEGEND'
102+ ```
103+
104+ * 풀이: AS 는 별칭의 의미로, TOTAL_PRICE로 컬럼명을 수정할 때 사용한다.
105+
106+ ## 물고기 종류 별 대어 찾기
107+
108+ [ 물고기 종류 별 대어 찾기: 문제 링크] ( https://school.programmers.co.kr/learn/courses/30/lessons/293261 )
109+
110+ * 문제: 물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.
111+ 물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
112+ 결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
113+
114+ > 정답
115+
116+ ``` sql
117+ -- 종류별로 가장 큰 물고기의 ID, 물고기이름, 길이
118+ -- 결과는 물고기의 ID 기준으로 오름차순 정렬
119+ SELECT F .ID , FN .FISH_NAME , F .LENGTH
120+ FROM FISH_INFO F
121+ INNER JOIN FISH_NAME_INFO FN
122+ ON F .FISH_TYPE = FN .FISH_TYPE
123+ WHERE (F .FISH_TYPE , F .LENGTH ) IN
124+ (
125+ SELECT FISH_TYPE, MAX (LENGTH) AS LENGTH_MAX
126+ FROM FISH_INFO
127+ GROUP BY FISH_TYPE
128+ )
129+ ORDER BY F .ID
130+ ```
131+
132+ > 풀이:
133+
134+ 핵심은 "먼저, 종류별로 가장 큰 길이가 몇 cm인지 알아낸 뒤, 그 길이와 종류에 해당하는 물고기를 찾는다." 이다.
135+
136+
137+ ### 1. 종류별 최대 길이 찾기 (서브 쿼리)
138+
139+ ``` sql
140+ SELECT FISH_TYPE, MAX (LENGTH)
141+ FROM FISH_INFO
142+ GROUP BY FISH_TYPE
143+ ```
144+
145+ * ` GROUP BY FISH_TYPE ` : FISH_INFO 테이블에 있는 물고기들을 종류(FISH_TYPE)별로 그룹으로 묶는다.
146+
147+ * ` SELECT FISH_TYPE, MAX(LENGTH) ` : 각 그룹 내에서 가장 큰 LENGTH 값을 MAX() 함수로 찾아낸다.
148+
149+ ### 2. 조건에 맞는 물고기 정보 결합 및 필터링
150+
151+ ``` sql
152+ -- 3. 최종적으로 원하는 컬럼들을 선택
153+ SELECT F .ID , FN .FISH_NAME , F .LENGTH
154+
155+ -- 1. 두 테이블을 연결해 물고기 이름 가져올 준비
156+ FROM FISH_INFO F
157+ INNER JOIN FISH_NAME_INFO FN
158+ ON F .FISH_TYPE = FN .FISH_TYPE
159+
160+ -- 2. 1단계에서 만든 '정답 목록'과 일치하는 물고기만 필터링
161+ WHERE (F .FISH_TYPE , F .LENGTH ) IN ( [1 단계 서브쿼리 결과] )
162+ ORDER BY F .ID
163+ ```
164+
165+ * ` FROM ... INNER JOIN ... ON ... ` :
166+
167+ * FISH_INFO와 FISH_NAME_INFO 테이블을 ` INNER JOIN ` 한다.
168+
169+ * ` ON F.FISH_TYPE = FN.FISH_TYPE ` 은 두 테이블을 ** 연결하는 '조건'** 이다. 즉, "두 테이블의 ` FISH_TYPE ` 이 같을 때 하나의 행으로 합쳐라" 라는 의미이다.
170+
171+ * 즉, ` INNER JOIN ` 은 교집합에 해당하는 데이터만 남긴다.
172+
173+ * ` WHERE (F.FISH_TYPE, F.LENGTH) IN ... ` :
174+
175+ * 이 부분은 ** 필터링** 단계이다.
176+
177+ * JOIN으로 합쳐진 모든 물고기 데이터를 한 줄씩 확인하면서,
178+
179+ * 물고기의 종류, 물고기의 길이) 쌍이 1단계에서 만든 '정답 목록' 안에 IN 하는지 검사 한다.
180+
181+ * 예를 들어, ` (FISH_TYPE: 0, LENGTH: 30) ` 인 물고기는 '정답 목록'에 없으므로 탈락하고, ` (FISH_TYPE: 0, LENGTH: 60) ` 인 물고기는 목록에 있으므로 통과한다.
182+
183+ > ` ON ` vs ` WHERE IN ` 차이
184+
185+ * ON 절: ** 테이블을 연결(JOIN)할 때 사용** 하는 '연결고리'의 규칙을 정의한다. 어떤 기준으로 두 테이블을 합칠지를 결정한다.
186+
187+ * WHERE ... IN 절: 연결된 결과 중에서 ** 어떤 행을 남길지를 결정하는 '필터' 역할** 을 합니다.
188+
189+ 정리하면, ON은 테이블을 ** 합치는 기준** 을 정하고, WHERE는 합쳐진 결과에서 ** 데이터를 걸러내는 조건** 을 정한다.
190+
191+ ## 잡은 물고기 중 가장 큰 물고기의 길이 구하기
192+
193+ [ 잡은 물고기 중 가장 큰 물고기의 길이 구하기: 문제 링크] ( https://school.programmers.co.kr/learn/courses/30/lessons/298515 )
194+
195+ * 문제: ` FISH_INFO ` 테이블에서 잡은 물고기 중 가장 큰 물고기의 길이를 'cm' 를 붙여 출력하는 SQL 문을 작성해주세요. 이 때 컬럼명은 'MAX_LENGTH' 로 지정해주세요.
196+
197+ ``` sql
198+ SELECT CONCAT(MAX (LENGTH), ' cm' ) AS MAX_LENGTH
199+ FROM FISH_INFO
200+ ```
201+
202+ * 풀이:
203+
204+ * ** ` CONCAT(A, B) ` ** : CONCAT 함수는 A와 B를 순서대로 합쳐서 하나의 문자열로 만들어준다.
205+
206+ * 이 코드에서는 MAX(LENGTH)를 통해 얻은 숫자(예: 50)와 문자열 'cm'를 합쳐 50cm 를 만들어준다.
207+
90208## Review
91209
92210* 프로그래머스에서 ` SUM, MAX, MIN ` 유형에 대한 문제들을 풀어봤다.
93211
94212* 각 문제에 대한 중요 문법들을 기억하자.
95213
214+ > 2025.09.03
96215
216+ * SQL 문법에 대해 까먹은 부분이 많아서 초심으로 돌아가 프로그래머스에 있는 SUM, MAX, MIN 유형의 모든 문제를 다시한번 복습했다.
97217
218+ * 까먹으면 다시 풀고, 모르는 부분이 있으면 다시 배우면 된다. 고민할 시간에 하나라도 더 익히자!
0 commit comments