728x90
SQLite3를 설치한 후 vscode에서 실습을 하며 DDL을 이해하며 알아가보자.
목차
- 사전 준비
- CREATE TABLE
- SQLite Data Types
- Constraints
1. 사전 준비
- SQLite 설치 - https://www.sqlite.org/download.html 접속하여 C 드라이브 - sqlite 폴더 생성 후 위 사진에서의 파일 2개 압축 풀기
- 시스템 환경 변수 -> 시스템 변수의 PATH -> 1번에서 생성한 폴더 경로 작성
- winpty sqlite3를 통해 실행 가능
- Vscode SQLite 확장프로그램 설치 확인
- 이후 데이터베이스 mydb.squlite3 파일 생성
- DDL.sql 파일 생성
- vscode 실행 후 DDL.sql 화면에서 마우스 우측 버튼 클릭 -> Use Database 선택
- 데이터베이스 목록에서 mydb.sqlite3 선택
2. CREATE TABLE
CREATE TABLE statement
- "Create a new table in the database."
- 데이터베이스에 새 테이블을 만듦
- contacts 테이블 생성
- Query 실행하기
- 실행하고자 하는 명령문에 커서를 두고 마우스 우측 버튼
- 'Run Selected Query' 선택
- 명령문을 모두 선택 할 필요 없으며, 실행하고자 하는 명령문 안에 커서가 올라가 있으면 가능
- 쿼리 실행 후 테이블 및 스키마 확인
- id 컬럼은 우리가 직접 기본 키 역할의 컬럼을 정희하지 않으면 자동으로 rowid라는 컬럼으로 만들어짐
- rowid에 대한 자세한 사항은 이어지는 주제에서 자세히 다룸
- 먼저 테이블을 생성 하면서 작성한 "데이터 타입"과 "제약조건"을 알아본다.
3. SQLite Data Types
- NULL
- NULL value
- 정보가 없거나 알 수 없음을 의미 (missing information or unknown)
- INTEGER
- 정수
- 크기에 따라 0, 1, 2, 3, 4, 6 또는 8바이트와 같은 가변 크기를 가짐
- REAL
- 실수
- 8바이트 부동 소수점을 사용하는 10진수 값이 있는 실수
- Text
- 문제 데이터
- BLOB (Binary Large Object)
- 입력된 그대로 저장된 데이터 덩어리 (대용 타입 없음)
- 바이너리 등 멀티미디어 파일
- 예 - 이미지 데이터
- 참고 - Boolean type
- SQLite에는 별도의 Boolean 타입이 없음
- 대신 Boolean 값은 정수 0(false)과 1(true)로 저장됨
- 참고 - Date & Time Datatype
- SQLite에는 날짜 및 시간을 저장하기 위한 타입이 없음
- 대신 SQLite의 built-in "Date And Time Functions"으로 TEXT, REAL 또는 INTEGER 값으로 저장할 수 있음
- https://www.sqlite.org/lang_datefunc.html
- 참고 - Binary Data
- 데이터의 저장과 처리를 목적으로 0과 1의 이진 형식으로 인코딩 된 파일
- 기본적으로 컴퓨터의 모든 데이터는 binary data
- 다만, 이를 필요에 따라서 텍스트 타입으로 변형해서 사용하는 것
SQLite는 다음 규칙을 기반으로 데이터 타입을 결정
- 값에 둘러싸는 따옴표와 소수점 또는 지수가 없으면 - INTEGER
- 값이 작은 따옴표나 큰따옴표로 묶이면 - TEXT
- 값에 따옴표나 소수점, 지수가 없으면 - REAL
- 값이 따옴표 없이 NULL이면 - NULL
SQLite Datatypes 특징
- SQLite는 다른 모든 SQL 데이터베이스 엔진(MySQL, PostgreSQL 등)의 정적이고 엄격한 타입(static, rigid typing)이 아닌 "동적 타입 시스템(dynamic type system)"을 사용
- 컬럼에 선언된 데이터 타입에 의해서가 아니라 컬럼에 저장된 값에 따라 데이터 타입이 결정됨
- 또한 테이블을 생성할 때 컬럼에 대해 특정 데이터 타입을 선언하지 않아도 됨
- 예를 들어 동일한 컬럼에 정수 1을 넣을 경우 INTEGER로 타입이 지정되고, 문자 '1'을 넣을 경우는 TEXT 타입으로 지정됨
- 이러한 SQLite의 동적 타입 시스템을 사용하면 기존의 엄격하게 타입이 지정된 데이터베이스에서는 불가능한 작업을 유연하게 수행할 수 있음
- 게다가 정적 타입 시스템이 지정된 데이터베이스에서 작동하는 SQL 문이 SQLite에서 동일한 방식으로 작동한다는 점
- 다만 이는 다른 데이터베이스와의 호환성 문제가 있기 때문에 테이블 생성 시 데이터 타입을 지정하는 것을 권장
- 데이터 타입을 지정하게 되면 SQLite는 입력된 데이터의 타입을 지정된 데이터 타입으로 변환
- 예를 들어 TEXT 타입 컬럼에 정수 1을 저장할 경우 문자 타입의 '1'로 저장됨
- 허용 가능한 타입 변환은 다음과 같음
# 참고 - "static, rigid typing" 데이터베이스
- statically, rigidly typed databases 라고도 부름
- 저장되는 값의 데이터 타입은 컬럼에 선언된 데이터 타입에 의해 결정된다.
- 만약 a 컬럼에 '123', b 컬럼에 456 데이터를 삽입하려는 경우 삽입을 수행하기 전에 문자열 '123'을 정수 123으로 변환하고, 정수 456을 문자열 '456'으로 변환
Type Affinity
- "타입 선호도"
- 특정 컬럼에 저장된 데이터에 권장되는 타입
- 데이터 타입 작성 시 SQLite의 5가지 데이터 타입이 아닌 다른 데이터 타입을 선언한다면, 내부적으로 각 타입의 지정된 선호도에 따라 5가지 선호도로 인식됨
- INTEGER
- TEXT
- BLOB
- REAL
- NUMERIC
- 타입 선호도가 존재하는 이유
- 다른 데이터베이스 엔진 간의 호환성을 최대화
- 정적이고 엄격한 타입을 사용하는 데이터베이스의 SQL문을 SQLite에서도 작동하도록 하기 위함
4. Constraints
- "제약조건"
- 입력하는 자료에 대해 제약을 정하고 맞지 않다면 입력이 거부된다.
- 사용자가 원하는 조건의 데이터만 유지하기 위한 즉, 데이터의 무결성을 유지하기 위한 보편적인 방법으로 테이블의 특정 컬럼에 설정하는 제약
데이터 무결성
- 데이터 베이스 내의 데이터에 대한 정확성, 일관성을 보장하기 위해 데이터 변경 혹은 수정 시 여러 제한을 두어 데이터의 정확성을 보증하는 것
- 무결성이랑 데이터의 정확성, 일관성을 나타냄
- 데이터베이스에 저장된 데이터의 무결성을 보장하고 데이터베이스의 상태를 일관되게 유지하는 것이 목적
종류
- NOT NULL
- 컬럼이 NULL 값을 허용하지 않도록 지정
- 기본적으로 테이블의 모든 컬럼은 NOT NULL 제약 조건을 명시적으로 사용하는 경우를 제외하고는 NULL 값을 허용함
- UNIQUE
- 컬럼의 모든 값이 서로 구별되거나 고유한 값이 되도록 함
- PRIMARY KEY
- 테이블에서 행의 고유성을 식별하는 데 사용되는 컬럼
- 각 테이블에는 하나의 기본 키만 있음
- 암시적으로 NOT NULL 제약 조건이 포함되어 있음
- AUTOINCREMENT
- 사용되지 않은 값이나 이전에 삭제된 행의 값을 재사용하는 것을 방지
- INTEGET PRIMARY KEY 다음에 작성하면 해당 rowid를 다시 재사용하지 못하도록 함
- Django에서 테이블 생성 시 id 컬럼에 기본적으로 사용하는 제약조건
- sql에서는 기본적으로 재사용한다.
- 그외 기타 Constraints
rowid의 특징
- 테이블을 생성할 때마다 rowid라는 암시적 자동 증가 컬럼이 자동으로 생성됨
- 테이블의 행을 고유하게 식별하는 64비트 부호 있는 정수 값
- 테이블에 새 행을 삽입할 때마다 정수 값을 자동으로 할당
- 값은 1에서 시작
- 데이터 삽입 시에 rowid 또는 INTEGER PRIMARY KEY 컬럼에 명시적으로 값이 지정되지 않은 경우, SQLite는 테이블에서 가장 큰 rowid보다 하나 큰 다음 순차 정수를 자동으로 할당 (AUTOINCREMENT와 관계없이)
- 만약 INTEGER PRIMARY KEY 키워드를 가진 컬럼을 직접 만들면 이 컬럼은 rowid 컬럼의 별칭(alias)이 됨
- 즉, 새 컬럼 이름으로 rowid에 액세스 할 수 있으며 rowid 이름으로도 여전히 액세스 가능
- 데이터가 최대 값에 도달하고 새 행을 삽입하려고 하면 SQLite는 사용되지 않는 정수를 찾아 사용
- (Limits in SQLite - https://www.sqlite.org/limits.html)
- 한 테이블의 행의 최대 개수 = 2^64
- 만약 SQLite가 사용되지 않은 정수를 찾을 수 없으면 SQLITE_FULL 에러가 발생
- 또한 일부 행을 삭제하고 새 행을 삽입하면 SQLite는 삭제된 행에서 rowid 값을 재사용하려고 시도
728x90
'CS > Database with SQLite' 카테고리의 다른 글
[DB] DML2 - Filtering data (1) | 2022.10.05 |
---|---|
[DB] DML1 - simple query, Sorting rows (0) | 2022.10.05 |
[DB] DDL2 - ALTER, DROP TABLE (0) | 2022.10.05 |
[DB] SQL (1) | 2022.10.04 |
[DB] 데이터 베이스? (0) | 2022.10.04 |