본문 바로가기

개발/Back-end

SQL을 어려운 이유 1 - GROUP BY

반응형

 

SQL을 깊게 공부해 본 적은 없지만 SQL을 공부하다 처음으로 어려워 지는 부분은 내 개인적으로 group by 였다.

SQL은 Structed Query Language로 한국말로 풀이하면 구조화 질의어? 정도로 풀이할 수 있다. 관계형 데이터 베이스에서 사용을 하며 컴퓨터 공학과에서 가장 기초적이고 교육을 할때 가장 많이 쓰인다.

그리고 sql은 3가지로 분류되는데

  1. DDL(Data Define Language) : 테이블 등을 정의하거나 변경 또는 삭제할 때 사용하는 언어이다.
  2. DML (Data Manipulation Language) : 데이터 베이스에 저장된 데이터에 쿼리문을 날려 실질적으로 처리하는데 사용한다.
  3. DCL (Data Control Language) : 데이터 관리를 목적으로 사용한다.

이 세가지로 분류된다. 조금 더 간단히 말하면 테이블, 스키마 등을 생성, 삭제할 때는 DDL, 그 안에 있는 튜플을 직접 추가, 삭제, 수정 을 통해 데이터를 변경하는 DCL 그리고 직접적인 변경은 없지만 내가 원하는 데이터를 가져와 튜닝하기 위해 사용하는 DML로 구분하면 좀 더 이해가 쉬울 것이다.

그 중 DML에 나오는 group by를 볼텐데 사실 이 부분은 그리 어렵지 않다. 하지만 개인적으로 어려워지는 포인트가 2가지라고 생각하는데 그중 하나가 group by이다(나머지는 join).

일단 group by에 대한 정의를 적어보면

특정 속성을 기준으로 그룹화 하여 검색할 때 그룹화 할 속성을 지정한다.

개인적으로 사전적 의미는 간결하고 바로 이해가 되야 하는데 보다시피 이해가 안된다(나만 그럴 수도...)

이해가 안된다면 바로 문제에 적용하여 살펴보자.

1. 사원 테이블에서 부서별 기본급의 평균을 구하시오
SELECT 부서, Avg(기본급) as 평균
FROM 사원
GROUP BY 부서;

2. 사원 테이블에서 부서별 튜플 수를 검색하시오
SELECT 부서, Count(*) as 사원수
FROM 사원
GROUP BY 부서;

3. 사원 테이블에서 기본급이 100 이상인 사원이 2명 이상인 부서의 튜플 수를 구하시오

SELECT 부서, Count(*) as 사원수
FROM 사원
GROUP BY 부서
HAVING Count(*) >=2;

1,2를 통해 Avg, Count가 들어가면 Group by를 사용해야 한다는 것을 파악할 수 있고 그것들에 대한 조건을 주려면 Having을 사용해야 된다는 것을 파악할 수 있다.

요즘 프로그래머스 sql kit을 푸는데 여기서 group by 문을 참고하면

Q: 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 
09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
 이때 결과는 시간대 순으로 정렬해야 합니다.

A : 
SELECT distinct hour(datetime) as HOUR, COUNT(hour(datetime)) as COUNT
FROM ANIMAL_OUTS 
GROUP BY hour
HAVING hour between 9 and 19
ORDER BY hour;

having을 사용함에 있어서도 문법이 존재한다. 역시나 생각 보다 쉽지가 않다. 복잡하진 않지만 다양한 활용이 나온다면 어려울 것 같다.

having은 where과 동일하지만 일반 조건은 where문에, 그룹 함수 조건은 having에 넣어주면 된다.

그래도 조금은 쉬워진 느낌이다. 다음 주에는 JOIN을 끝장내보자!

반응형

'개발 > Back-end' 카테고리의 다른 글

MongoDB vs MySQL  (0) 2021.07.17
데이터 베이스 스키마 (Database schema)  (2) 2021.07.11
Sequelize 간단히 알아보기  (0) 2021.07.08
SQL이 어려운 이유 2- JOIN  (0) 2021.06.27
Node js 자주 사용하는 미들웨어  (0) 2021.06.22