위클리 페이퍼는 현재 훈련받고 있는 코드잇 스프린트 데이터 애널리스트 트랙에서 매주마다 훈련생 스스로 프로그래밍 언어, 데이터분석, 통계, 머신러닝 등 특정 주제에 대하여 심화 학습을 할 수 있도록 제출하는 과제입니다.
(매주 2~3가지 주제를 스스로 알아보고 학습하여 관련된 내용을 정리하여 후에 취업 활동 간에 경험할 수 있는 기술 면접을 대비함.)
20~21주차는 중급 프로젝트로 인해 위클리페이퍼를 작성하지 않았으며, 이번 22주차부터 다시 13번째 위클리페이퍼를 이어서 작성하게 되었습니다.
이번 13번째 위클리 페이퍼 주제는
1. GROUP BY 절과 HAVING 절의 차이점은 무엇인가요?
2. 데이터베이스에서 NULL 값이란 무엇인가요? NULL 값을 처리하는 함수는 무엇이 있나요?
1. GROUP BY 절과 HAVING 절의 차이점은 무엇인가요?
질문에 대한 설명을 본격적으로 하기전에 SQL을 배우기 시작하면서 가장 많이 사용하는 구문 중 하나가 SELECT문부터 설명이 필요해보입니다.
SELECT문은 데이터베이스에서 원하는 데이터를 조회하는 첫 걸음이라 할 수 있는데, SELECT문을 설명하고나서 GROUP BY와 HAVING 절까지 차근차근 알아보겠습니다.
SELECT 문
SELECT문은 SQL에서 데이터 조회의 핵심입니다. 데이터베이스에서 원하는 데이터를 선택해 보여주는 역할을 하는데, 기본적으로는 조회할 열(column)을 명시해 줍니다.
SELECT 열1, 열2 FROM 테이블명;
여기서 열1, 열2는 보고 싶은 데이터가 있는 열의 이름입니다.
만약 모든 열을 다 보고 싶다면, *을 사용하여 SELECT * FROM 테이블명; 처럼 쓸 수 있습니다.
추가로, SELECT문에서는 열 간에 계산도 가능합니다.
예를 들어, 상품의 가격과 수량이 있는 테이블에서 총 금액을 보고 싶다면 이렇게 할 수 있습니다:
SELECT 상품명, 가격 * 수량 AS 총금액
FROM 판매내역;
이렇게 AS 키워드를 사용해 계산된 열에 별칭을 줄 수도 있습니다.
WHERE 절
WHERE 절은 특정 조건에 맞는 데이터만 가져오고 싶을 때 사용됩니다.
이 절은 개별 행을 평가하여, 조건에 부합하는 행만 SELECT 결과에 포함되도록 합니다.
WHERE은 주로 =(같음), >(초과), <(미만), LIKE(부분 일치) 등 다양한 조건 연산자와 함께 사용됩니다.
예를 들어, 나이가 30세 이상인 사람만 조회하고 싶다면,
SELECT 이름, 나이
FROM 회원
WHERE 나이 >= 30;
또한 WHERE 절은 논리 연산자 AND, OR 등을 사용하여 여러 조건을 조합할 수도 있습니다.
SELECT 이름, 나이
FROM 회원
WHERE 나이 >= 30 AND 지역 = '서울';
이 쿼리는 나이가 30세 이상이고, 지역이 서울인 회원만 조회합니다.
GROUP BY 절
GROUP BY 절은 데이터를 특정 열의 값에 따라 그룹으로 묶는 역할을 합니다.
예를 들어, 각 도시에 거주하는 사람 수를 알고 싶을 때 사용될 수 있습니다.
그룹화 후에는 집계 함수(COUNT, SUM, AVG, MAX, MIN 등)를 사용하여 그룹별 통계를 낼 수 있습니다.
SELECT 도시, COUNT(*) AS 인구수
FROM 회원
GROUP BY 도시;
이 쿼리는 회원 테이블을 도시 값에 따라 그룹화하고, 각 도시의 인구수를 계산합니다.
COUNT(*)는 그룹별로 행의 개수를 세는 집계 함수입니다.
GROUP BY와 함께 자주 쓰이는 집계 함수
- COUNT(*): 그룹의 행 개수를 셉니다.
- SUM(열): 그룹 내 특정 열 값의 합계를 구합니다.
- AVG(열): 그룹 내 특정 열 값의 평균을 계산합니다.
- MAX(열), MIN(열): 그룹 내 특정 열 값 중 최댓값과 최솟값을 찾습니다.
HAVING 절
HAVING 절은 GROUP BY로 그룹화된 결과에 대해 추가 조건을 거는 데 사용됩니다.
WHERE 절이 개별 행에 대한 조건을 거는 반면, HAVING 절은 그룹화된 결과에 대한 조건을 거는 데 차이가 있습니다.
다시 말해, GROUP BY로 그룹화된 후에 나오는 집계 결과에 대해 조건을 걸고 싶을 때 쓰입니다.
예를 들어, 각 도시별로 인구를 세고, 인구가 100명 이상인 도시만 보고 싶다면 이렇게 할 수 있습니다.
SELECT 도시, COUNT(*) AS 인구수
FROM 회원
GROUP BY 도시
HAVING COUNT(*) >= 100;
여기서 HAVING COUNT(*) >= 100 조건은 각 도시의 인구가 100명 이상인 경우에만 결과에 포함시키는 역할을 합니다.
GROUP BY와 HAVING의 차이점
GROUP BY 절과 HAVING 절은 함께 자주 사용되지만, 각각의 역할과 목적이 다릅니다. 데이터를 그룹화하고 그룹화된 결과에 조건을 적용할 때 두 절이 어떻게 다른지 살펴보겠습니다.
1. GROUP BY 절의 역할
- GROUP BY 절은 데이터를 특정 열을 기준으로 그룹화하는 역할을 합니다. 이를 통해 각 그룹에 대해 집계 함수(SUM, COUNT, AVG 등)를 적용할 수 있으며, 같은 값을 가진 데이터를 묶어 하나의 그룹으로 처리할 수 있습니다.
- 예를 들어, 회원 테이블에서 각 도시별로 몇 명의 회원이 있는지 알고 싶다면, GROUP BY 절을 사용해 도시 열을 기준으로 데이터를 그룹화할 수 있습니다.
2. HAVING 절의 역할
- HAVING 절은 그룹화된 데이터의 집계 결과에 조건을 적용하는 데 사용됩니다. GROUP BY와 함께 사용하며, WHERE 절처럼 조건을 적용하는 것 같지만, HAVING은 그룹화된 결과에 대해 필터링한다는 점에서 차이가 있습니다.
- 예를 들어, 각 도시별 인구수를 계산한 후 인구가 100명 이상인 도시만 보고 싶다면 HAVING 절을 사용합니다.
정리하면,
- GROUP BY: 데이터를 특정 열을 기준으로 그룹화하여, 각 그룹에 대해 집계 함수를 적용할 수 있도록 합니다.
- HAVING: 그룹화된 데이터의 집계 결과를 기준으로 조건을 걸어, 원하는 그룹만 결과에 포함시킬 수 있습니다.
구분 | GROUP BY 절 | HAVING 절 |
기능 | 데이터를 특정 열을 기준으로 그룹화 | 그룹화된 데이터의 집계 결과에 조건을 적용 |
적용 시점 | 그룹화를 수행할 때 사용 | 그룹화된 결과에 조건을 적용할 때 사용 |
사용 위치 | SELECT 뒤에서 그룹화하려는 열을 지정할 때 사용 | GROUP BY 뒤에서 집계 결과에 조건을 걸 때 사용 |
조건 사용 | 집계 함수 없이 열 자체를 기준으로 그룹화 | 집계 함수 결과를 기준으로 조건을 걸 수 있음 |
2. 데이터베이스에서 NULL 값이란 무엇인가요? NULL 값을 처리하는 함수는 무엇이 있나요?
데이터베이스를 다루는 경우에 NULL 값을 자주 마주하게 됩니다. NULL 값은 데이터베이스에서 중요한 개념으로 단순히 숫자 0이나 빈 문자열처럼 보이지만, ‘아무 값도 없는 상태’라는 의미를 담고 있습니다.
따라서 NULL 값이 있는 경우와 없는 경우를 구분하는 게 데이터를 정확하게 이해하고 처리하는 데 큰 도움이 되며, 중요한 역할을 가집니다.
NULL 값이란?
NULL 값은 아무 값도 없는 상태를 의미합니다.
예를 들어, 특정 사용자가 이메일을 제공하지 않았을 때, 그 사용자의 이메일 필드에는 값이 없으므로 NULL이 들어가게 됩니다.
이 NULL은 빈 문자열('')이나 숫자 0과는 다릅니다. 0이나 빈 문자열은 값이 있지만, NULL은 아예 값 자체가 존재하지 않는 상태로 이해하는 것이 중요합니다.
NULL 값이 중요한 이유
NULL 값이 있으면 데이터 계산이나 조건 비교에서 예상치 못한 결과를 초래할 수 있습니다. 예를 들어, 평균을 계산할 때 NULL 값을 포함한 데이터는 자동으로 계산에서 제외되며, 조건문에서도 NULL 값이 포함되면 특정 조건이 참/거짓으로 판단되지 않을 수 있습니다. 이 때문에 NULL 값 처리는 데이터 분석이나 비즈니스 로직에서 주의 깊게 다루어야 하는 부분입니다.
NULL 값을 처리하는 기능을 가진 함수
NULL 값을 처리하기 위해 SQL에서는 다양한 함수를 제공하고 있습니다. 이 함수들을 사용하면 NULL 값을 적절히 대체하거나, NULL 여부를 확인할 수 있습니다.
1. IS NULL과 IS NOT NULL
NULL 값을 확인할 때는 = 연산자를 사용할 수 없습니다. NULL은 비교할 수 있는 값이 아니기 때문에 IS NULL이나 IS NOT NULL을 사용해 존재 여부를 확인해야 합니다. 예를 들어, 어떤 열에 NULL 값이 있는지 확인하고 싶다면 다음과 같이 쓸 수 있습니다.
SELECT 이름 FROM 회원
WHERE 이메일 IS NULL;
이 쿼리는 이메일이 없는 회원들의 이름만 조회하게 됩니다.
반대로, 이메일이 있는 회원만 조회하고 싶다면 IS NOT NULL을 사용할 수 있습니다.
2. IFNULL (또는 COALESCE)
NULL 값을 다른 값으로 대체하고 싶을 때는 IFNULL 또는 COALESCE 함수를 사용할 수 있습니다. 예를 들어, 특정 열에 NULL 값이 있을 때 기본값을 넣어주고 싶다면 다음과 같이 할 수 있습니다.
SELECT 이름, IFNULL(이메일, '이메일 없음') AS 이메일_주소
FROM 회원;
여기서 IFNULL 함수는 이메일이 NULL이면 '이메일 없음'이라는 값으로 대체합니다. 비슷하게 COALESCE 함수는 여러 열을 인수로 받아 첫 번째 NULL이 아닌 값을 반환합니다.
SELECT 이름, COALESCE(이메일, 전화번호, '연락처 없음') AS 연락처
FROM 회원;
이 쿼리는 이메일이 NULL이면 전화번호를, 전화번호도 NULL이면 '연락처 없음'을 반환합니다.
3. 집계 함수에서의 NULL 처리
SUM, AVG, COUNT 같은 집계 함수는 NULL 값을 기본적으로 제외하고 계산합니다. 예를 들어, 평균을 구할 때 NULL이 있으면 NULL을 무시하고 계산하죠. 하지만, NULL을 포함하거나 별도로 다루어야 한다면 IFNULL이나 COALESCE와 결합해 처리할 수 있습니다.
'스프린트 > 위클리페이퍼' 카테고리의 다른 글
[#15] 스프린트 DA 트랙 24주차 위클리 페이퍼(DAG와 Task의 관계, Operator의 종류와 활용 사례) (0) | 2024.11.27 |
---|---|
[#14] 스프린트 DA 트랙 23주차 위클리 페이퍼(데이터 조회 및 필터링 쿼리, NULL) (0) | 2024.11.20 |
[#12] 스프린트 DA 트랙 19주차 위클리 페이퍼(모델의 편향과 분산, K-폴드 교차 검증) (0) | 2024.10.23 |
[#11] 스프린트 DA 트랙 18주차 위클리 페이퍼(지도 학습과 비지도 학습, 손실 함수) (0) | 2024.10.16 |
[#10] 스프린트 DA 트랙 17주차 위클리 페이퍼(A/B 테스트, 이벤트 데이터 로그 설계) (2) | 2024.10.09 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!