SQLite – 테이블을 다른 데이터베이스로 이관하기

테이블을 다른 데이터베이스 파일로 이관하는 방법은 단순하다. 새로운 DB 파일을 새 데이터베이스로 연결해서, CREATE TABLE .. AS SELECT .. 구문을 사용해서 복사한다. 다음 예제는 외부 DB 파일을 반입한 다음, 특정 테이블 하나의 내용으로 새로운 테이블을 채우는 과정을 보여준다.

ATTACH 'file-archives.db' AS other;
CREATE TABLE other.images AS SELECT * FROM main.images;
DETACH others;

CREATE TABLE ... AS ... 를 사용하는 이 방법은 사실 한가지 함정을 가지고 있다. 이 쿼리는 테이블을 복제한다기보다는 한쪽의 데이터를 다른 테이블을 만들어서 밀어넣는 역할을 수행한다. 따라서 기존 테이블의 스키마 구조를 온전하게 유지하지 못한다. 단지 SELECT 쿼리의 결과 그리드를 테이블로 단순 변환하는 것에 지나지 않는다.

만약 전체 테이블을 통째로 복제하고 싶다면? 다음의 내용을 dump-command.sql 로 저장하자.

.output some_table_backup.sql
.dump some_table
.output

이 명령은 해당 테이블을 완전히 재구성할 수 있는 sql 문을 파일로 만들어낸다.  예를 들어 원래의 DB 파일 이름이 oldies.db 라고 한다면

sqlite3 --init dump-command.sql oldies.db

를 실행하면 dump-command.sql 파일이 생성된다. 이 파일은 덤프한 시점의 테이블을 그대로 복원할 수 있는 쿼리문이 모두 저장된다. 당연히 새로운 DB 파일에서 이를 실행하면 다른 DB로 해당 데이터를 복제하게 되는 셈이다.  다음 명령을 실행하면 new.db 데이터 베이스가 생성되면서 (혹은 기존에 있던 거라면 열리면서) some_table이 생성되고 그 내용이 완전히 복원되어 있는 것을 확인할 수 있다.

sqlite3 --init some_table_backup.sql new.db

 

(SQLite3) JOIN을 통한 테이블 연결

지난 글에서 SQLite3에서 SELECT 명령의 사용방법에 대해서 살펴보았는데, FROM을 통해서 단일 테이블 혹은 단일 테이블 내의 범위를 부분적으로 얻어내는 서브 쿼리를 통해서 보다 정교한 범위의 데이터를 얻고, 또 WHERE절을 사용해서 결과를 필터링 하는 방법에 대해서도 살펴보았다. 그외에 GROUP BY나 그외 aggregation 연산을 통한 쿼리 방법에 대해서는 자세하게 다루지 않았는데, 그 전에 JOIN에 대해서 간단하게 짚고 넘어가고자 한다.

(SQLite3) JOIN을 통한 테이블 연결 더보기

(SQLite3) SELECT 문을 알아보자

테이블에 저장된 데이터를 조회하기 위해서는 SELECT문을 사용한다. SELECT 구문운 SQL에서 가장 흔히 쓰이는 쿼리문인 동시에 가장 복잡한 구문이기도 하다. 테이블 조회와 관련하여 SQLite3는 표준 SQL에 정의된 거의 모든 기능을 제공한다. SQLite3의 SELECT 구문의 사용법에 대해서 살펴보자.

기본 컨셉

기본적으로 SELECT 는 DB 엔진으로부터 질의에 대한 답을 요청하는 명령이다. 일반적으로 테이블 내의 레코드들을 조회하는 용도로 사용되지만, SELECT 명령의 본질은 DB가 수행할 수 있는 연산의 결과를 얻는 명령이다. 따라서 테이블 조회뿐만 아니라 다음과 같이 계산 결과를 얻도록 호출할 수도 있다.

SELECT 1 + 1;

위 쿼리는 단순히 2라는 결과를 얻게 된다. 테이블을 지정해서 데이터를 조회하지는 않지만 하나의 온전한 SELECT 구문이기도 하다.  물론 이것은 SELECT라는 명령이 DB엔진으로부터 어떠한 값을 요청한다는 개념을 보여주는 예이지, 실제로 이런 간단한 계산 때문에 데이터베이스를 사용하는 일은 드물다.

따라서 실제로는 다음의 개념으로 SELECT 명령을 이해해야 한다.

  1. SELECT 명령은 어떤 “결과”를 요구하는 명령이다.
  2. SELECT 명령은 폭과 높이가 각각 0 이상인 2차원 그리드로 구성된 데이터에 대해서 수행된다.
  3. SELECT 명령의 결과 역시 폭과 높이가 각각 0 이상인 2차원 그리드로 구성될 수 있다.

이 관점에 따르면 SELECT 1 + 1; 은 첫째로 연산의 결과를 요구하고 있으며, 가로가 0, 세로가 0인 (비어있는) 그리드를 대상으로 ‘조회’한다고 볼 수 있다. 그리고 그 결과는 1X1 그리드, 즉 단일값이 된다.  실제로 통상의 SELECT문이 대상으로 하는 테이블 역시 2차원 그리드이며, SELECT 문의 조회 결과 여러 열과 행으로 구성된 2차원 그리드가 된다.

(SQLite3) SELECT 문을 알아보자 더보기