# 11강. 결과 행 제한하기 - LIMIT
**`LIMIT 구`**
```
SELECT 열명 FROM 테이블명 LIMIT 행수 [OFFSET 시작행]
```

---

## 1. 행수 제한
- `LIMIT` 구는 표준 SQL은 아니다.
- `MySQL`과 `PostgreSQL`에서 사용할 수 있는 문법이라는 것에 주의하자.
- `LIMIT` 구는 `SELECT` 명령의 마지막에 지정하는 것으로 `WHERE` 구나 `ORDER BY` 구의 뒤에 지정한다.

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

- `LIMIT` 다음에는 최대 행수를 수치로 지정한다.
- 지정된 수치만큼 행이 반환된다.

##### LIMIT 구로 반환될 행수를 제한할 수 있다!

### 정렬한 후 제한하기
- `LIMIT`와 `WHERE`은 기능과 내부처리 순서가 전혀 다르다.
- `LIMIT`는 반환할 행수를 제한하는 기능으로, `WHERE` 구로 검색한 후 `ORDER BY`로 정렬된 뒤 최종적으로 처리된다.

### 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`로 행을 제한한 경우와 결괏값이 다르다.

---

## 2. 오프셋 지정
- 웹 시스템에서는 클라이언트의 브라우저를 통해 페이지 단위로 화면에 표시할 내용을 처리한다.
- 이때 일반적으로 페이지 나누기 기능을 사용한다.
- 페이지 나누기 기능은 `LIMIT`를 사용해 간단히 구현할 수 있다.
- 한 페이지당 5건의 데이터를 표시하도록 한다면 첫 번째 페이지의 경우 `LIMIT 5`로 결괏값을 표시하면 된다.
- 그 다음 페이지에서는 6번째 행부터 5건의 데이터를 표시하도록 한다.
- 이때 '6번째 행부터'라는 표현은 결괏값으로부터 데이터를 취득할 위치를 가리키는 것으로, `LIMIT` 구에 `OFFSET`으로 지정할 수 있다.
- `LIMIT 5 OFFSET 5`로 6번째 행부터 5건을 표시할 수 있다.
- `LIMIT` 구의 `OFFSET`은 생략 가능하며 기본값은 0이다.
- `OFFSET`에 의한 시작 위치 지정은 `LIMIT` 뒤에 기술한다.
- 위치 지정은 컴퓨터 자료구조의 배열 인덱스와 비슷하여, `시작할 행 - 1`로 기억해 두면 편리하다.
- 예를 들어 첫 번째 행부터 5건을 취득한다면, `1 - 1`로 위치는 0이 되어 `OFFSET 0`으로 지정하면 된다.

**`OFFSET 지정`**
```
SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 위치
```

```
첫 번째 페이지 -> SELECT * FROM sample33 LIMIT 3 OFFSET 0;
두 번째 페이지 -> SELECT * FROM sample33 LIMIT 3 OFFSET 3;
위와 같이 사용한다.

---

