https://school.programmers.co.kr/learn/courses/30/lessons/298518

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

JOIN + IN 을 활용합니다.

 

여러가지 방법으로 풀 수 있습니다.

단순히 JOIN을 활용하거나, 네스티드 서브 쿼리를 활용할 수 있습니다.

 

COUNT 함수는 구하려는 행의 값이 1개인경우를 이용해 INNER JOIN을 한 데이터에 WHERE로 필터링시켜 COUNTING했습니다.

 

 

만약 각 물고기별 개수를 세고싶다면 아래와 같이 작성합니다.

처음에 INNER JOIN 한뒤 'BASS'와 'SNAPPER' 물고기의 개수를 가져왔습니다.

SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO AS FI1
INNER JOIN FISH_NAME_INFO AS FNI1
ON FI1.FISH_TYPE = FNI1.FISH_TYPE
GROUP BY FNI1.FISH_TYPE
HAVING FNI1.FISH_TYPE IN ('0', '1');

이때 유의해야할점은, GROUP BY에 사용된 데이터와 HAVING 에 사용된 컬럼데이터가 일치해야 사용할 수 있다는 점입니다.

 

아래의 경우 HAVING절에 사용한 FNI1.FISH_NAME은 GROUP BY에 사용되지않았기에 작동하지 않습니다.

SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO AS FI1
INNER JOIN FISH_NAME_INFO AS FNI1
ON FI1.FISH_TYPE = FNI1.FISH_TYPE
GROUP BY FNI1.FISH_TYPE
HAVING FNI1.FISH_NAME IN ('BASS', 'SNAPPER');

 

서브쿼리로도 풀 수 있습니다. 

'BASS', 'SNAPPER'의 FISH_TYPE을 복수개의 데이터가 반환되고,  IN 을 활용해서 그에 맞는 FISH_TYPE이 포함된 걸 찾은뒤 COUNT하면 됩니다.

하지만 일반적으로 INNER JOIN이 더 적합합니다.

코드

SELECT COUNT(*) AS FISH_COUNT FROM FISH_INFO
INNER JOIN FISH_NAME_INFO 
ON FISH_NAME_INFO.FISH_TYPE = FISH_INFO.FISH_TYPE
WHERE FISH_NAME_INFO.FISH_NAME = 'BASS' OR FISH_NAME_INFO.FISH_NAME = 'SNAPPER';

 

SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO AS FI1
INNER JOIN FISH_NAME_INFO AS FNI1
ON FI1.FISH_TYPE = FNI1.FISH_TYPE
WHERE FNI1.FISH_NAME IN ('BASS', 'SNAPPER')
SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO AS FI
INNER JOIN FISH_NAME_INFO AS FNI
ON FI.FISH_TYPE = FNI.FISH_TYPE
WHERE FNI.FISH_NAME IN ('BASS', 'SNAPPER')
SELECT COUNT(*) AS FISH_COUNT FROM FISH_INFO
WHERE FISH_INFO.FISH_TYPE IN ( SELECT FISH_TYPE FROM FISH_NAME_INFO WHERE FISH_NAME_INFO.FISH_NAME IN ('BASS', 'SNAPPER'));

 

 

 

+ Recent posts