본문 바로가기

DB - MySQL

SELECT문 - 정렬

반응형

1. 데이터 정렬

데이터베이스에서 데이터를 검색할 때, 검색된 데이터를 특정한 순서로 나열하는 것을 의미한다. 이를 통해 데이터를 빠르게 찾을 수 있으며, 보기 쉬운 형태로 데이터를 표시할 수 있다.

SQL에서 SELECT문을 사용하여 데이터를 검색할 때, ORDER BY 절을 사용하여 정렬을 수행할 수 있다. ORDER BY절은 SELECT문 마지막 부분에 추가되며, 정렬할 열의 이름(컬럼명)을 지정하여 사용한다.

 

1) ORDER BY 사용법

select * from product order by product_id asc;
# 결과: product 테이블의 전체 컬럼을 id 오름차순으로 정렬하여 조회
# 해석: 오름차순 조회 = order by 컬럼명 asc;

select * from product order by product_id desc;
# 결과: product 테이블의 전체 컬럼을 id 내림차순으로 정렬하여 조회
# 해석: 내림차순 조회 = order by 컬럼명 desc;

select * from product order by price;
# 결과: product 테이블의 전체 컬럼을 price 오름차순으로 정렬하여 조회
# 해석: order by의 기본값 오름차순(asc)로 설정되어 있기 때문에, asc 생략 가능!

select * from product order by price asc, stock desc;
# 결과: product 테이블의 전체 컬럼을 price의 오름차순, sotck의 내림차순으로 정렬하여 조회
# 해석: 앞에서부터 적힌 순으로 정렬 실시!


2) ORDER BY 활용 - HAVING절 사용:
💡 HAVING절을 사용하여 그룹화 된 결과 집합에 대해 조건 지정!

[예제1]

SELECT manager_id, COUNT(*) as num_of_employees
FROM employees
GROUP BY manager_id
HAVING num_of_employees >= 3;

해석: GROUP BY 절을 사용하여 "employees" 테이블을 "manager_id"로 그룹화하고, HAVING 절을 사용하여 매니저가 관리하는 직원의 수가 3명 이상인 매니저의 데이터를 검색한다.

ORDER BY와 HAVING을 함께 사용하여, 특정 그룹화 된 결과 집합을 정렬 할 수도 있다. 예를 들어, 아래와 같은 구문을 사용하여 매니저가 관리하는 직원의 수가 3명 이상인 매니저의 데이터를 급여가 높은 순서로 정렬할 수 있다.


[예제2]

SELECT manager_id, COUNT(*) as num_of_employees
FROM employees
GROUP BY manager_id
HAVING num_of_employees >= 3
ORDER BY AVG(salary) DESC;

해석: 위의 예제와 동일한 결과값을 평균 급여가 높은 순서로 정렬한다.

 

3) ORDER BY 활용 - WHERE구, GROUP BY구와 함께 사용:
💡 WHERE구나 GROUP BY구가 있어도 정렬을 위한 ORDER BY 구는 가장 마지막에 작성!

select * from product where stock >= 20 order by price;
# 결과: product 테이블의 sotck이 20 이상인 레코드를 price 오름차순으로 정렬하여 조회
select stock, count(*) from product group by stock order by count(*);
# 결과: product 테이블을 stock으로 그룹화하고, 그룹의 레코드 수로 정렬하여 조회


4) ORDER BY 사용 시 주의사항

(1) NULL 처리

select * from product order by price is null asc, price asc;
# 결과: null인 경우 1로 반환하여 처음에 표기하고, price를 기준으로 오름차순 정렬

(2) ORDER BY 조건 부여

select * from product order by price = 70 desc, price asc;
# 결과: price 70인 것을 처음에 표기하고, price를 기준으로 오름차순 정렬

select * from product order by price >= 300 desc, price desc;
# 결과: price 300 이상인 것을 내림차순으로 1차 정렬하고, 이후 price를 기준으로 내림차순 2차 정렬

(3) ORDER BY 구: 별명 사용 가능 

select product_name, price as 가격 from product order by 가격 asc;
# 결과: 가격을 기준으로 오름차순 정렬 (price: 가격으로 표기)
# 해석: SELECT 구에서 설정한 별명, order by 구에서 별명 사용 가능


5) LIMIT 활용 예제

# limit 기본 활용
select * from product order by price limit 2;
# 결과: price 기준으로 오름차순 정렬하고, 첫 2행만 조회

# limit offset 활용
select * from product order by price limit 3 offset 2;
# 결과: price 기준으로 오름차순 정렬하고, 시작 위치 2에서부터 3행 조회
# 해석: offset을 이용하여 시작 위치 설정 가능

select * from product order by price limit 2, 3;
# 결과: price 기준으로 오름차순 정렬하고, 시작 위치 2에서부터 3행 조회
# 해석: offset과 동일하나 표기 방식이 다름

 

반응형