SQLite | 데이터 조회 | 조회할 데이터의 수와 시작 위치를 지정 (LIMIT, OFFSET)


테이블에서 데이터를 조회할 때 LIMIT 절을 사용하여 죄회할 데이터의 수를 지정할 수 있다. 또한 함께 OFFSET 절을 사용하면 어느 위치에서 데이터를 조회할지 여부를 지정할 수 있다. 여기에서는 LIMIT 절 및 OFFSET 절을 사용하여 조회할 데이터의 수와 위치를 지정하는 방법에 대해 설명한다.  

LIMIT 절을 사용하여 조회할 데이터 수를 지정

LIMIT 절을 사용하여 조회할 데이터의 수를 지정할 수 있다. 형식은 다음과 같다.

SELECT 컬럼명, ... FROM 테이블명 LIMIT 행수;

LIMIT 절 후에 조회할 행수를 지정한다. 행수가 지정된 경우에는 첫 번째 데이터에서 지정한 행수의 데이터만 가져온다.

또한 저장되는 데이터의 수보다 많은 행을 지정해도 에러는 없다. 이 경우 모든 데이터를 가져온다. 따라서 예를 들어 행수으로 100을 지정하면 저장되어 있는 데이터가 100 미만인 경우는 모든 데이터 100 이상 저장된 경우는 100 개의 데이터를 가져온다.

그럼 실제로 해보도록 한다. 다음과 같이 테이블을 만든다.

create table user (id integer, name text, address text);
sqlite> create table user (id integer, name text, address text);
sqlite> 

INSERT 문을 사용하여 테이블에 데이터를 추가한다.

insert into user values (1, 'devkuma', 'Seoul');
insert into user values (2, 'kimkc', 'Busan');
insert into user values (3, 'araikuma', 'Paju');
insert into user values (4, 'happykuma', 'Paju');
insert into user values (5, 'mykuma', 'Daejeon');
insert into user values (6, 'yourkuma', 'Seongnam');
insert into user values (7, 'raccoon', 'Suwon');
insert into user values (8, 'noguri', 'Suwon');
sqlite> insert into user values (1, 'devkuma', 'Seoul');
sqlite> insert into user values (2, 'kimkc', 'Busan');
sqlite> insert into user values (3, 'araikuma', 'Paju');
sqlite> insert into user values (4, 'happykuma', 'Paju');
sqlite> insert into user values (5, 'mykuma', 'Daejeon');
sqlite> insert into user values (6, 'yourkuma', 'Seongnam');
sqlite> insert into user values (7, 'raccoon', 'Suwon');
sqlite> insert into user values (8, 'noguri', 'Suwon');
sqlite> 

행수를 지정하지 않고 데이터를 조회한 경우에는 테이블에 저장되어 있는 모든 데이터를 가져온다.

select * from user;
sqlite> select * from user;
id          name        address   
----------  ----------  ----------
1           devkuma     Seoul     
2           kimkc       Busan     
3           araikuma    Paju      
4           happykuma   Paju      
5           mykuma      Daejeon   
6           yourkuma    Seongnam  
7           raccoon     Suwon     
8           noguri      Suwon     
sqlite> 

그러면 LIMIT 절을 사용하여 조회할 데이터 행수를 지정해 본다. 예를 들어 4개의 데이터를 가져온다.

select * from user limit 4;
sqlite> select * from user limit 4;
id          name        address   
----------  ----------  ----------
1           devkuma     Seoul     
2           kimkc       Busan     
3           araikuma    Paju      
4           happykuma   Paju      
sqlite> 

첫 번째 데이터에서 4개의 데이터를 받아올 수 있었다.

OFFSET 절을 사용하여 검색을 시작하는 위치의 지정

LIMIT 절을 지정한 경우에 첫 번째 데이터부터 지정한 수의 데이터를 받아올 수 있지만, 처음부터가 아니라 지정된 위치에서부터 데이터를 조회할 수 있다. 데이터를 조회할 첫 번째 위치를 지정하려면 OFFSET 절을 사용한다.

OFFSET 절을 사용하는 경우 형식은 다음 중 하나의 형식을 사용한다.

SELECT 컬럼명, ... FROM 테이블명 LIMIT 행수 OFFSET 시작위치;
SELECT 컬럼명, ... FROM 테이블명 LIMIT 시작위치, 행수;

LIMIT 절 이후에 가져오는 데이터의 행수, 그리고 OFFSET 절 후에 데이터를 조회할 시작 위치를 지정한다. OFFSET 절을 사용하지 않으려면 우선 시작 위치를 지정 후에 조회할 행수를 지정한다.

주의할 점은 예를 들어 OFFSET에 4를 지정한 경우 처음부터 4번째까지의 데이터를 제외하고 5번째 데이터에서부터 조회한다. 4번째 데이터에서부터 조회을 시작하는 것은 아니라는 점에 주의하자. 또한 LIMIT 절을 생략하고 OFFSET 절만 작성할 수는 없다.

그럼 실제로 해보도록 하자. 앞에서 사용한 테이블을 다시 사용한다. 특별히 지정하는 것 없이 데이터를 조회하면 다음과 같다.

select * from user;
sqlite> select * from user;
id          name        address   
----------  ----------  ----------
1           devkuma     Seoul     
2           kimkc       Busan     
3           araikuma    Paju      
4           happykuma   Paju      
5           mykuma      Daejeon   
6           yourkuma    Seongnam  
7           raccoon     Suwon     
8           noguri      Suwon     
sqlite> 

OFFSET 절을 사용한 형식으로 5번째 데이터(인자로 4를 지정)에서부터 3개의 데이터를 가져온다.

select * from user limit 3 offset 4;
sqlite> select * from user limit 3 offset 4;
id          name        address   
----------  ----------  ----------
5           mykuma      Daejeon   
6           yourkuma    Seongnam  
7           raccoon     Suwon     
sqlite> 

동일하게 5번째에서 3개의 데이터를 조회할 때 OFFSET 절을 사용하지 않는 다른 형식을 사용하는 경우에는 다음과 같이 실행한다.

select * from user limit 4, 3;
sqlite> select * from user limit 4, 3;
id          name        address   
----------  ----------  ----------
5           mykuma      Daejeon   
6           yourkuma    Seongnam  
7           raccoon     Suwon     
sqlite> 

두 경우 모두 지정된 위치에서 지정된 수의 데이터를 얻을 수 있었다.

ORDER BY 절을 사용하여 정렬한 후에 조회할 행수를 지정

SQLite에서 데이터를 조회할 때 ORDER BY 절을 사용하여 지정된 컬럼의 값을 기준으로 정렬할 수 있다. (자세한 내용은 조회한 데이터를 컬럼의 값으로 정렬 (ORDER BY 절)를 참조한다.)

ORDER BY 절과 LIMIT 절 동시에 작성되는 경우에는 먼저 ORDER BY 절로 정렬을 하고나서 LIMIT 절에 지정된 숫자의 데이터를 가져온다.

그럼 실제로 해보도록 한다. 앞에서 사용한 테이블을 다시 사용한다. 이 테이블에서 address 컬럼의 값으로 정렬한 후에 데이터를 가져온다.

select * from user order by address;
sqlite> select * from user order by address;
id          name        address   
----------  ----------  ----------
2           kimkc       Busan     
5           mykuma      Daejeon   
3           araikuma    Paju      
4           happykuma   Paju      
6           yourkuma    Seongnam  
1           devkuma     Seoul     
7           raccoon     Suwon     
8           noguri      Suwon     
sqlite> 

다음은 정렬을 하고나서 LIMIT 절을 사용하여 5개의 데이터를 가져온다.

select * from user order by address limit 5;
sqlite> select * from user order by address limit 5;
id          name        address   
----------  ----------  ----------
2           kimkc       Busan     
5           mykuma      Daejeon   
3           araikuma    Paju      
4           happykuma   Paju      
6           yourkuma    Seongnam  
sqlite> 

정렬된 데이터 중에서 5개의 데이터를 얻을 수 있었다. 이렇게 ORDER BY 절과 LIMIT 절을 결합하여 먼저 정렬을 하고나서 임의의 수의 데이터를 조회할 수 있다.