여름의 서재
[DB] 데이터 베이스 기초 본문
💡 데이터베이스란?
: 여러 사람이 공유하고 사용할 목적으로 통합 관리되는 정보의 집합.
즉, 몇 개의 자료 파일을 조직적으로 통합하여 자료 항목의 중복을 없애고 자료를 구조화하여
기억시켜 놓은 자료의 집합체.
- 데이터베이스의 장점
1. 데이터 중복 최소화
2. 데이터 무결성 (정확학 정보를 보장)
3. 데이터 일관성
4. 데이터 독립성 (물리적 / 논리적)
5. 데이터 표준화
6. 데이터 보안 유지
- 관계형 데이터베이스 (RDB)
: 키와 값들의 간단한 관계를 표 형태로 정리한 데이터베이스
* 용어 : 스키마 (데이터베이스의 명세를 기술한 것), 테이블, 열, 행, 기본키 (각 행의 고유값)
- SQL
: RDBMS의 데이터 관리를 위해 설계된 특수 목적의 프로그래밍 언어
- SQL 분류
- DML (데이터 조작 언어) : SELECT, INSERT, DELETE, UPDATE, READ
- DDL (데이터 정의 언어): CREATE, ALTER, RENAME, DROP
- DCL (데이터 제어 언어): GRANT, REVOKE, COMMIT, ROLLBACK -> TCL
💻 실습하기
# git-bash 터미널
- 테이블 생성 및 삭제
1) 데이터 베이스 생성하기
$ sqlite3 tutorial.sqlite3
sqlite> .database
2) CSV 파일을 table로 만들기
sqlite> .mode csv
sqlite> .import hellodb.csv examples
sqlite> .tables
examples
3) SELECT
sqlite> SELECT * FROM examples;
1,"길동","홍",600,"충청도",010-2424-1232
* 터미널 view 변경하기 (컬럼명 추가, table처럼 보이게 만들기)
sqlite> .headers on
sqlite> SELECT * FROM examples;
id,first_name,last_name,age,country,phone
1,"길동","홍",600,"충청도",010-2424-1232
sqlite> .mode column
sqlite> SELECT * FROM examples;
id first_name last_name age country phone
-- ---------- --------- --- ------- -------------
1 길동 홍 600 충청도 010-2424-1232
4) CREATE - 테이블 생성 및 확인하기
sqlite> CREATE TABLE classmate(
...> id INTEGER PRIMARY KEY,
...> name TEXT
...> );
sqlite> .tables
classmate examples
sqlite> .schema classmate
CREATE TABLE classmate(
id INTEGER PRIMARY KEY,
name TEXT
);
5) DROP
sqlite> DROP TABLE classmate;
sqlite> .tables
examples
- CRUD
1) INSERT
: INSERT INTO 테이블이름 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);
sqlite> CREATE TABLE classmates(
...> name TEXT NOT NULL,
...> age INT NOT NULL,
...> address TEXT NOT NULL
...> );
sqlite> INSERT INTO classmates (name, age) VALUES ('홍길동', 23);
Error: NOT NULL constraint failed: classmates.address
sqlite> INSERT INTO classmates VALUES ('홍길동', 30,'서울');
sqlite> SELECT * FROM classmates;
name age address
---- --- -------
홍길동 30 서울
sqlite>
* SQLite는 따로 PRIMARY KEY 속성의 컬럼을 작성하지 않으면,
값이 자동으로 증가하는 PK옵션을 가진 rowid 컬럼을 정의
sqlite> SELECT rowid, * FROM classmates;
rowid name age address
----- ---- --- -------
1 홍길동 30 서울
-> 하지만 스키마에 id를 직접 작성하게 되면 새로운 데이터를 입력할때 id도 명시해줘야 함.
2) READ
1. LIMIT
: 쿼리에서 반환되는 행 수를 제한
: 특정 행부터 시작해서 조회하기 위해 OFFSET 키워드와 함께 사용하기도 함
Q. classmates 테이블에서 id, name 컬럼 값을 하나만 조회하세요.
sqlite> SELECT rowid, name FROM classmates LIMIT 1;
rowid name
----- ----
1 홍길동
Q. classmates 테이블에서 id, name 컬럼 값을 세번째에 있는 하나만 조회하세요.
sqlite> SELECT rowid, name FROM classmates LIMIT 1 OFFSET 2;
rowid name
----- ----
3 이싸피
* offset은 row를 0부터 시작!
2. WHERE
: 쿼리에서 반환된 행에 대한 특정 검색 조건을 지정
Q. classmates 테이블에서 id, name 컬럼 값 중에 주소가 서울인 경우의 데이터를 조회하세요.
sqlite> SELECT rowid, name FROM classmates WHERE address='서울';
rowid name
----- ----
1 홍길동
3. DISTINCT
: 조회 결과에서 중복행을 제거
: SELECT 키워드 바로 뒤에 작성해야 함
Q. classmates 테이블에서 age값 전체를 중복없이 조회하세요.
sqlite> SELECT DISTINCT age FROM classmates;
age
---
30
26
29
28
3) DELETE
: DELTE FROM 테이블이름 WHERE 조건;
Q. classmates 테이블에 id가 5인 레코드를 삭제하세요.
sqlite> DELETE FROM classmates WHERE rowid=5;
sqlite> SELECT rowid, * FROM classmates;
rowid name age address
----- ---- --- -------
1 홍길동 30 서울
2 김철수 30 대전
3 이싸피 26 광주
4 박삼성 29 구미
* SQLite는 삭제된 rowid를 재사용함
sqlite> INSERT INTO classmates VALUES ('최전자', 28, '부산');
sqlite> SELECT rowid, * FROM classmates;
rowid name age address
----- ---- --- -------
1 홍길동 30 서울
2 김철수 30 대전
3 이싸피 26 광주
4 박삼성 29 구미
5 최전자 28 부산
-> 재사용하게 하지 않으려면?
: 테이블을 생성하는 단계에서 id컬럼에 AUTOINCREMENT를 설정
4) UPDATE
: UPDATE 테이블이름 SET 컬럼1=값1, 컬럼2=값2, ... WHERE 조건;
Q. classmates 테이블에 id가 5인 레코드를 이름은 홍길동으로, 주소는 제주도로 바꿔주세요!
sqlite> UPDATE classmates SET name='홍길동', address='제주도' WHERE rowid=5;
sqlite> SELECT * FROM classmates;
name age address
---- --- -------
홍길동 30 서울
김철수 30 대전
이싸피 26 광주
박삼성 29 구미
홍길동 28 제주도
- ALTER TABLE
1. table 이름 변경
: ALTER TABLE 기존테이블이름 RENAME TO 새로운테이블이름
2. 테이블에 새로운 column 추가
: ALTER TABLE 테이블이름 ADD COLUMN 컬럼이름 데이터 타입
Q. 새로운 컬럼 이름은 created_at 이며, TEXT 타입에 NULL 설정!
sqlite> ALTER TABLE classmates ADD COLUMN created_at TEXT NOT NULL;
Error: Cannot add a NOT NULL column with default value NULL
* 에러 발생!!
: 테이블에 있던 기존 레코드들에는 새로 추가할 필드에 대한 정보가 없다.
그렇기 때문에 NOT NULL 형태의 컬럼은 추가가 불가능!!
-> 해결방법 2가지
: NOT NULL 설정없이 추가
: 기본값(DEFAULT) 설정
sqlite> ALTER TABLE classmates ADD COLUMN score INT NOT NULL DEFAULT 50;
sqlite> SELECT * FROM classmates;
name age address score
---- --- ------- -----
홍길동 30 서울 50
김철수 30 대전 50
이싸피 26 광주 50
박삼성 29 구미 50
홍길동 28 제주도 50
3. column 이름 수정
: ALTER TABLE 테이블이름 RENAME COLUMN 기존컬럼이름 TO 새로운컬럼이름
'CS > DB' 카테고리의 다른 글
[DB] RDBMS & NoSQL & CAP 이론 (0) | 2022.01.21 |
---|---|
[DB] Redis (REmote DIctionary Server) (0) | 2022.01.19 |
[DB] SQL with django ORM (0) | 2021.10.01 |