ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 정렬
    Database 2021. 2. 22. 18:16
    728x90

    SQL 정렬 ORDER BY

    SELECT 명령과 ORBER BY 구를 사용하여 검색결과의 행 순서를 바꿀수 있다 (sort)

     

    SELECT + WHERE + ORDER BY

    기본적으로 order by 는 오름차순 정렬이다.

    select * from products where price<10000 order by price;


    SELECT + ORDER BY

    조건식 없는 정렬

    select * from products order by price;
    


    오름차순 정렬

    앞에서 언급했듯이 Default 값은 오름차순 정렬이며 생략이 가능하다.

    select * from products order by price asc; #오름차순 정렬
    #asc가 생략되어있다고 생각하면 된다. 

    내림차순 정렬

    select * from products order by price desc; #내림차순 정렬


    ORDER BY 대소 관계!

    정렬할때는 대소관계가 중요하다.

    기본적으로 수치형 데이터(1, 2, 3,) 과 날짜시간형 데이터(1992년..) 대소관계는 문제가 되지 않지만

    문제는 문자열형 데이터이다.

    문자열형 데이터는 사전식 순서에따라 결정된다.(ㄱ ㄴ ㄷ , ㅏ ㅑ ㅓ ㅕ..)

    이 중에서도 크게 신경써야하는 부분이 나오는데

    문자열형 데이터에도 숫자 데이터를 넣을 수 가 있다. 따라서 문자열형 데이터로 정의되어있는 컬럼에서의 대소관계를 보이는것이 숫자라고 해서 수치형 데이터와 같은 방식으로 정렬을하는 실수를 범하지 말자.

     

    기본적으로 ORBER BY는 테이블에 영향을 주지 않는다.

    SELECT 명령은 데이터를 검색하는 명령어로 참조만 할뿐 테이블을 변경시키지는 않는다.


    ORDER BY를 이용한 복수의 열 정렬하기

    order by를 이용해 복수의 열을 정렬할 수 있다. 가령 상품코드와 해당 상품의 하위번호까지 얻고 싶은 경우 복수의 열을 지정하고 정렬한 결과를 보고 싶을때가 있다고 가정하자. (1-1, 1-2, 1-3, 2-1, 2-2, 2-3....)

    SELECT * FROM 테이블명 WHERE 조건식 ORDER BY 열명1 [ASC|DESC], 열명2[ASC|DESC]

    order by 뒤에 열명은 콤마(,)로 구분하여 복수의 열을 지정하여 정렬 할 수 있으며 이때 정렬의 순서는 입력한 열명의 순서와 같다.

    만약 2를 먼저 지정하고 싶다면 열명2을 앞으로 위치시키면 된다. 

    이때 []는 생략할 수 있으나 데이터베이스를 어떤 것을 사용하느냐에 따라 차이가 있기에 가능한 정렬방법을 생략하지 말고 지정하도록 하자.


    NULL 정렬

    먼저 아래 예시를 보자.

    select * from products order by category_id asc, discount_id asc;
    
    # 이처럼 둘다 asc 오름차순 일경우 모두 생략 또는 모두 기입하도록 하자.

    category_id 그리고 discount_id 2개의 열을 정렬한 결과이다.

    이때 NULL의 위치에 주목하자.

    NULL은 특성상 대소비교를 할 수 없다. 따라서 NULL은 가장 큰 값을 가지거나 가장 작은 값을 갖는것으로 표시한다.

    이때 큰/작은 값은 데이터베이스를 어느것을 사용하느냐에 따라 다르다고 한다.

    MySQL의 경우 NULL을 가장 작은 값으로 취급하여 오름차순시 가장 먼저 표시되는 것이다.


    결과 (행) 제한하기

    SELECT + WHERE + ORDER BY + LIMIT [+ OFFSET]

    결과의 행을 제한하는 방법으로 LIMIT 구를 사용할 수 있다.

    사실 LIMIT 구는 MySQL, PostgreSQL에서 사용할 수 있다.

    Oracle에는 ROWNUM

    SQL server에서는 TOP을 사용해 행을 제한 할 수 있다고 한다.

    # 오라클 DB
    SELECT * FROM 테이블명 WHERER ROWNUM <=3;
    
    # SQL server DB
    SELECT TOP 3 * FROM 테이블명;

    그럼 행을 4줄로 제한한 출력결과를 확인해보자.

    select * from products where price<10000 order by price limit 4;


    사실 LIMIT 4 는 WHERE 구로도 표현 할 수 있다!

    하지만 LIMIT 와 WHERE은 기능과 내부처리순서가 다르다. 따라서 행을 제한할 목적으로만 사용한다면 LIMIT을 사용하자.

    select * from products limit 4;
    
    select * from products where id<=4;


    OFFSET 지정

    흔히 pagination 기능과 같은 역할을 하게 도와준다.

    LIMIT와 OFFSET을 이용해 위와 같은 페이지네이션 기능을 할 수 있다.

    여기서 offset은 n번째 행부터라는 표현으로 흔히 idex를 생각하면 이해가 빠를 것이다.

    1, 2, 3, 4, 5, 6, 7, 8 ,9 10 총 10개의 정보를 5개씩 표현한다 가정하면

    1, 2, 3, 4, 5 출력 후 6부터 시작을 해야하며 이때 offset은 시작할행 -1 로 이해하면 편하다. offset = 5

    select * from products limit 5 offset 0;
    
    
    select * from products limit 5 offset 5;
    

     

    출처 : SQL 첫걸음/ 아사이 아츠시 지음/ 한빛미디어

    728x90

    'Database' 카테고리의 다른 글

    SQL 날짜연산  (0) 2021.03.17
    SQL 문자열 연산  (0) 2021.03.08
    SQL 연산  (0) 2021.03.02
    데이터베이스와 SQL 기초  (0) 2021.02.18
    데이터 테이블 작성 Tip  (0) 2020.11.24
Designed by Tistory.