여름의 서재

[DB] 데이터 베이스 기초 본문

CS/DB

[DB] 데이터 베이스 기초

엉아_ 2021. 10. 2. 18:16
728x90

💡 데이터베이스란?

: 여러 사람이 공유하고 사용할 목적으로 통합 관리되는 정보의 집합.

즉, 몇 개의 자료 파일을 조직적으로 통합하여 자료 항목의 중복을 없애고 자료를 구조화하여

기억시켜 놓은 자료의 집합체.

 

- 데이터베이스의 장점

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
Comments