SQL 공부하면서 은근은근 많이 사용한 ORDER BY와 GROUP BY,
그리고 GROUP BY의 조건을 추가하는 HAVING 절에 대해 포스팅하려 한다.
최근 사이드 프로젝트를 하면서 정의된 테이블에서 user 테이블을 예시로, 쿼리문도 돌리고 어떻게 동작하는지 정의할 것이다.
status는 user의 상태값을 내기 위해 TINYINT로 타입을 줘서 큰 숫자는 못주고 일단 임의로 숫자를 바꿔놨다.
아직 설계 단계라 password도 hash가 적용 안됐다.
암튼 설계 단계의 테이블을 이렇게 정의하였고 직접 쿼리문을 짜 보고 실행해볼 것이다.
ORDER BY
order by는 데이터베이스에서 데이터를 조회하는데 어떠한 데이터를 기준으로 정렬하고자 사용하는 SQL 절이다.
ASC, DESC
위와 같이 status를 오름차순으로 정렬한 것이다.
asc는 오름차순이고 desc는 내림차순으로 정렬한 것으로 asc나 desc를 작성 안 하면 기본적으로 asc, 오름차순으로 정렬한다.
그런데 만약, status를 내림차순으로 정렬하고, 다음으로 마지막 수정 일자인 profileImage를 오름차순으로 정렬하고 싶다?
즉, 다중 정렬을 사용하고 싶으면
먼저 해당 status를 내림차순 정렬을 하고 정렬된 내림차순 기준에서 status가 같은 것 중에
profileImage 데이터를 보면 2,6,7 이렇게 오름차순으로 정렬된 것을 확인할 수 있다.
LIMIT, OFFSET
limit는 정렬된 결과 행에서 제한된 수만큼 가져오는 것이다.
만약 user 테이블에서 status의 랭킹 3등인 것을 가져오고 싶다?
그러면 order by status desc limit 3 이런 식으로 쓰면
status가 내림차순 정렬된 행에서 3개의 행만 가져오도록 한다.
이번엔 offset이다.
offset은 order by로 정렬된 데이터 행들에서 값을 정해주면 위에서 값만큼 점프하여 출력된다. 대신 limit를 걸어야 한다.
Mysql의 행들도 결국 배열이다. 0부터 시작되어서 0,1,2,3...으로 된 배열이므로
offset 3을 주면 랭킹 4등에서부터 6등까지의 데이터 행들이 추출된 것을 확인할 수 있다.
GROUP BY
특정 컬럼을 기준으로 그룹핑하여 검색할 때 그룹화할 속성을 지정한다.
이번엔 user 테이블에서 주소를 조금 임의로 바꿔서 진행을 해보려 한다.
group by는 이렇게 select를 하면 안된다. 그룹핑할 데이터를 전부 다 긁어오면 모순적이다.
이렇게 사용해야 한다. group by로 그룹핑 하였고 기준이 된 그룹들의 status값을 합산한 것이다.
수정된 테이블에서 주소가 서울인 유저의 status값이 3,7,2 이렇게 있는 것을 확인할 수 있다.
거기서 sum함수를 사용하여 합산된 status, 즉 12를 출력한 것이다.
추가로 select절에 select address as addr로 하면 group by addr로 바꿔도 된다.
aliasing 된 컬럼을 읽어오기 때문이다.
몇몇 쿼리를 보다가 group by할 컬럼을 select 절에 작성안한 경우도 있는데
웬만하면 group by한 컬럼도 select 절에 작성하는 걸 권장한다.
이번엔 다중 group by이다.
다중 group by는 말그대로 컬럼 2개를 그룹핑하는 것이다.
userIp는 정작 192.168.1.1과 192.168.1.2 두 개만 있지만 192.168.1.2를 가진 행이 두 개 있을텐데 그 userIp를 가진 status 값을 sum 한 것이다.
결국 address 별로 그룹핑 했지만 userIp 그룹별로 또 그룹핑한 것이다.
HAVING
having은 위에서 설명한 group by, 즉 그룹 함수의 조건을 기술한다.
이와 같이 쿼리문을 작성하면 기존 group by addr로 했을 때 5개의 행이 나온걸로 아는데
having으로 sum(status)가 10보다 큰 경우만 결과를 추출할 수 있다.
내가 아는 having은 이게 끝이다. So simple
추후에는 아마 인덱스에 대해 포스팅하지 않을까싶다.
초큼 어려움.. 포스팅에 공도 많이 들여야 하고, 공부해야 할 내용도 많다.
'데이터베이스 > SQL' 카테고리의 다른 글
[데이터베이스] SQL 문 (INSERT, SELETE) (0) | 2022.02.04 |
---|