[SQL] 데이터 정렬하기

Joney의 SW 공부 블로그·2023년 1월 22일
0

SQL

목록 보기
6/14

레코드 정렬

레코드를 정렬

  • ORDER BY를 사용해서 데이터를 정렬
  • product 테이블에서 product_id를 정렬해서 가져옴
  • 구 중에서 가장 마지막에 기재
  • 기본값인 오름차순(작은 값에서 큰 값으로) ASC 와 내림차순(큰 값에서 작은 값으로) DESC 가 있음
SELECT
	*
FROM
	product
ORDER BY
	product_id, ASC;

같은 순위의 레코드

  • 정렬하는 기준이 되는 컬럼의 내용이 같은 경우 순서가 안 정해짐
  • 이러한 경우 정렬을 위해 정렬 컬럼을 여러개 기재
    • 적은 순서대로 정렬
ORDER BY
	column1 DESC, column2 ASC, column3 DESC

ORDER BY구에 지정 가능한 요소

  • SELECT구에서 지정하지 않는 컬럼을 정렬 키에 넣을 수 있음

  • SELECT구에서 지정한 컬럼의 정렬 순의 수치를 지정하는 것도 가능

SELECT
	product_name
FROM
	product
ORDER BY
	stock, ASC;
SELECT
	product_name, stock
FROM
	product
ORDER BY
	2 ASC;

WHERE 구나 GROUP BY 구와 함께 사용

  • WHERE 구나 GROUP BY 구와 함께 사용 가능하며, 가장 마지막에 기재
  • product 테이블의 stock이 20 이상인 레코드를 price의 오름차순으로 정렬해서 가져옴
SELECT
	*
FROM
	product
WHERE
	stock >= 20
ORDER BY
	price;
  • inquiry테이블을 pref로 그룹화하고, 그룹의 레코드 수로 정렬해서 가져옴
SELECT
	pref, COUNT(*)
FROM
	inquiry
GROUP BY
	pref
ORDER BY
	COUNT(*);

ORDER BY 구의 주의점

NULL은 어떻게 될까

  • 정렬 키의 컬럼 값에 NULL이 있는 경우, 정렬의 결과 NULL은 레코드의 가장 처음이 됨
    • 처리계에 따라서는 마지막에 오는 경우도 있음
  • 아래의 연산으로 NULL을 마지막으로 가져올 수 있음
    • IS NULL은 값이 NULL이면 1 아니면 0을 반환하는 연산
    • ORDER BY price IS NULL로 처음에 price 값이 NULL이 아닌 레코드가 정렬
    • 그 후에 price가 NULL인 컬럼은 마지막에 통합
SELECT
	*
FROM
	product
ORDER BY
	price IS NULL ASC, price ASC;

기타 정렬

  • ORDER BY구에 조건을 지정함으로써 특정 레코드를 처음이나 마지막에 가져올 수 있음
  • price 값이 정확히 150인 레코드를 처음에 정렬하고 싶은 경우
    • 값이 150인 레코드가 제일 위에 오고 나머지는 정렬되지 않음
SELECT
	*
FROM
	product
ORDER BY
	price = 150 DESC;
  • 범위로 주고 나머지도 거듭 정렬하는 경우
    • price >= 140의 판정 결과를 DESC로 내림차순으로 지정하고 있으므로 판정 결과가 1인 레코드가 처음에 표시
    • price >= 140의 판정 결과로 같은 순위의 레코드를 price의 오름차순으로 정렬한 것이 최종 결과
SELECT
	*
FROM
	product
ORDER BY
	price >= 140 DESC, price ASC;

ORDER BY 구의 실행 순서

  • 지금 까지 나온 구 중에서 가장 마지막에 적고 실행 순서도 가장 마지막
  • SELECT뒤에 실행되므로 AS구에서 쓰인 별명 쓸 수 있음

인덱스

  • ORDER BY구에 의한 정렬은 컴퓨터터에 부하가 걸리기 때문에 필요할 때만 사용
  • 인덱스를 사용함으로서 다소 빠른 정렬을 시행 가능
  • 데이터베이스의 인덱스는 각각의 컬럼에 대해 만듬

레코드를 N행 가져오기

특정 수의 레코드 가져오기

  • 가져온 레코드 중 첫 N행만 원하는 경우 LIMIT를 사용
  • product 테이블의 전체 컬럼을 price의 오름차순으로 정렬한 후, 첫 3행을 가져오기
SELECT
	*
FROM
	product
ORDER BY
	price
LIMIT
	3;

레코드를 i에서 N행 가져오기

  • 처음부터가 아닌 중간부터 N행 가져오기 위해서 OFFSET을 사용
  • LIMIT안에 시작위치, 행수 순으로 쓰는 방법도있음
SELECT
	*
FROM
	product
ORDER BY
	price
LIMIT
	3
OFFSET
	2;
SELECT
	*
FROM
	product
ORDER BY
	price
LIMIT
	2, 3;

LIMIT구와 OFFSET구의 실행 순서

  • LIMIT구와 OFFSET구는 SELECT문 중에서 가장 마지막에 기입
  • OFFSET보다 뒤에 적는 구는 없음
  • 실행순서는 가장 마지막에 OFFSET구, LIMIT
작성법 순서실행 순서
SELECTFROM
DISTINCTWHERE
FROMGROUP BY
WHEREHAVING
GROUP BYSELECT
HAVINGDISTINCT
ORDER BYORDER BY
LIMITOFFSET
OFFSETLIMIT




출처: 그림으로 배우는 SQL 입문

profile
SW 지식 노트 블로그

0개의 댓글