[필기정리]Day57 - order by, limit, offset 등

DB/MySQL

2020. 9. 11. 11:16

# ORDER BY

SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명;


-  FROM 구 뒤에 ORDER BY 구를 지정하는 경우

SELECT 열명 FROM 테이블명 ORDER BY 열명;


ex)

CREATE TABLE sample31( 
name varchar(10), 
age int, 
address varchar(20) 
); 
INSERT INTO sample31 VALUES('A씨', 36, '대구광역시 중구'); 
INSERT INTO sample31 VALUES('B씨', 18, '부산광역시 연제구'); 
INSERT INTO sample31 VALUES('C씨', 25, '서울특별시 중구'); 
SELECT * FROM sample31; 
SELECT * FROM sample31 ORDER BY age;
SELECT * FROM sample31 ORDER BY address;


- 내림차순으로 정렬 : desc

SELECT 열명 FROM 테이블명 ORDER BY 열명 DESC;

ex) age열의 값을 DESC로 내림차순 정렬하기 

SELECT * FROM sample31 ORDER BY age DESC;

 

- 오름차순으로 정렬 : asc (기본값으로 생략가능)

SELECT 열명 FROM 테이블명 ORDER BY 열명 ASC;

ex) age열의 값을 ASC로 오름차순 정렬하기

SELECT * FROM sample31 ORDER BY age asc;


// 수치형 데이터의 대소관계

1 < 2 < 10 < 100 


// 날짜형 데이터의 대소관계

1999년 < ... < 2013년 < 2014년


// 문자열형 데이터의 대소관계는 사전식 순서에 의해 결정된다!

// ORDER BY를 이용해 행 순서를 바꿀 수 있다.  == 출력할 때만 변경
하지만 이는 어디까지나 서버에서 클라이언트로 행 순서를 바꾸어 결과를 반환하는 것뿐, 

저장장치에 저장된 데이터의 행 순서를 변경하는 것은 아니다.
SELECT 명령은 데이터를 검색하는 명령이다. 

이는 테이블의 데이터를 참조만 할 뿐이며 변경은 하지 않는다.

ex)

CREATE TABLE sample32(a int, b int); 
insert into sample32 values(1, 1); 
insert into sample32 values(2, 1); 
insert into sample32 values(2, 2); 
insert into sample32 values(1, 3); 
insert into sample32 values(1, 2); 
SELECT * FROM sample32; 


ex) sample32를 a열만으로 정렬하기

SELECT * FROM sample32 ORDER BY a; 


- 복수의 열을 지정해 정렬하기
ex) sample32를 a열과 b열로 정렬하기

SELECT * FROM sample32 ORDER BY a, b; 


ex) sample32를 b열과 a열로 정렬하기

SELECT * FROM sample32 ORDER BY b, a; 


# 정렬방법 지정하기
- 복수 열 정렬

SELECT 열명 FROM 테이블명 ORDER BY 열명1 [ASC|DESC], 열명2 [ASC|DESC]; 

ex) 

SELECT * FROM sample32 ORDER BY a ASC, b DESC; 

 

// 복수 열을 지정하는 경우에도 정렬방법을 생략하면 기본값은 ASC가 된다.

- NULL 값의 정렬순서
  간단히 말하자면 ORDER BY로 지정한 열에서 NULL 값을 가지는 행은

  가장 먼저 표시되거나 가장 나중에 표시된다. 
  NULL에 대한 대소비교 방법은 표준 SQL에도 규정되어 있지 않아 데이터베이스 제품에 따라 기준이 다르다.
  MySQL의 경우는 NULL 값을 가장 작은 값으로 취급

  ASC(오름차순)에서는 가장 먼저, DESC(내림차순)에서는 가장 나중에 표시한다.

# 결과 행 제한하기 - LIMIT = 출력값을 제한함. (MySQL에서만 사용가능)

CREATE TABLE sample33(no int); 
INSERT INTO sample33 VALUES(1); 
INSERT INTO sample33 VALUES(2); 
INSERT INTO sample33 VALUES(3); 
INSERT INTO sample33 VALUES(4); 
INSERT INTO sample33 VALUES(5); 
INSERT INTO sample33 VALUES(6); 
INSERT INTO sample33 VALUES(7); 
SELECT * FROM sample33;

 

// SELECT 명령에서는 결과값으로 반환되는 행을 제한할 수 있다.
- LIMIT 구

SELECT 명령 FROM 테이블명 LIMIT 행수 [OFFSET 시작행];

 

// 행수 제한 
    LIMIT 구는 표준 SQL은 아니다.

    MySQL과 PostgreSQL에서 사용할 수 있는 문법이라는 점에 주의하자.

    LIMIT 구는 SELECT 명령의 마지막에 지정하는 것으로 WHERE구나 ORDER BY구의 뒤에 지정한다.

- LIMIT 구

SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수;


ex) sample33에 LIMIT 3 으로 상위 3건만 취득하기

SELECT * FROM sample33 LIMIT 3; 


ex) sample33을 정렬 후 LIMIT 3 으로 상위 3건만 취득하기

SELECT * FROM sample33 ORDER BY no DESC LIMIT 3; 


- LIMIT를 사용할 수 없는 데이터베이스에서의 행 제한
  LIMIT는 표준 SQL이 아니기 때문에 MySQL과 PostgreSQL 이외의 데이터베이스에서는 사용할 수 없다.

  SQL SERVER에서는 LIMIT와 비슷한 기능을 하는 'TOP'을 사용할 수 있다.

  다음과 같이 TOP 뒤에 최대 행수를 지정하면 된다.

SELECT TOP 3 * FROM sample33;


Oracle에는 LIMIT도 TOP도 없다. 

대신 ROWNUM이라는 열을 사용해 WHERE구로 조건을 지정하여 행을 제한할 수 있다.

SELECT * FROM sample33 WHERE ROWNUM <= 3; 


ROWNUM은 클라이언트에게 결과가 반환될 때 각 행에 할당되는 행 번호이다. 

단, ROWNUM으로 행을 제한할 때는 WHERE 구로 지정하므로 정렬하기 전에 처리되어 

LIMIT로 행을 제한한 경우와 결과값이 다르다. 

- OFFSET 지정 => offset = X  == X번째 뒤부터 나옴.  

SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치;

 

ex) sample33에서 LIMIT 3 OFFSET 0 으로 첫 번째 페이지 표시

SELECT * FROM sample33 LIMIT 3 OFFSET 0;

 

ex) sample33에서 LIMIT 3 OFFSET 3으로 두 번째 페이지 표시

SELECT * FROM sample33 LIMIT 3 OFFSET 3; 


ex) sample33에서 LIMIT 3 OFFSET 6으로 세 번째 페이지 표시

SELECT * FROM sample33 LIMIT 3 OFFSET 6;

   

 

728x90