DB
Database
데이터
기존의 데이터 저장 방식
- 파일 이용
- 어디에서나 쉽게 사용 가능
- 데이터를 구조적으로 관리하기 어려움
- 스프레드 시트 이용
- 테이블의 열과 행을 사용해 데이터를 구조적으로 관리 가능
- 일반적으로 약 100만 행까지만 저장가능
- 단순한 파일이나 링크 소유 여부에 따른 단순한 접근 권한 기능 제공
데이터 베이스 역할
Realtional Database
- 데이터 간에 관계가 있는 데이터 항목들의 모음
- 테이블, 행, 열의 정보를 구조화하는 방식
- 서로 관련된 데이터 포인터를 저장하고 이에 대한 액세스를 제공
관계
- 여러 테이블 간의 논리적 연결
- 관계를 함으로써 다양한 형식으로 조회 가능
- Table : 데이터를 기록하는 것
- Field : 각 필드에는 고유한 데이터 형식이 지정됨
- Record : 각 레코드에는 구체적인 데이터 값이 저장됨
- Database : 테이블의 집합
- Primary Key : 각 레코드의 고유한 값, 관계형 데이터베이스에서 레코드의 식별자로 활용
- Foreign Key : 테이블의 필드 중 다른 테이블의 레코드를 식별할 수 있는 키, 다른 테이블의 기본키를 참조
RDBMS
DBMS
- 데이터베이스를 관리하는 소프트웨어 프로그램
- 데이터 저장 및 관리를 용이하게 하는 시스템
- 데이터베이스와 사용자 간의 인터페이스 역할
- 사용자가 데이터 구성, 업데이트, 모니터링, 백업, 복구 등을 할 수 있도록 도움
RDBMS
- 관계형 데이터베이스를 관리하는 소프트웨어 프로그램
- SQLite, MySQL, Oracle 등
데이터 베이스 정리
- Table은 데이터가 기록되는 곳
- Table에는 행에서 고유하게 식별 가능한 기본 키라는 속성이 있으며, 외래 키를 사용하여 각 행에서 서로 다른 테이블 간의 관계를 만들 수 있음
- 데이터는 기본 키 또는 외래 키를 통해 결합될 수 있는 여러 테이블에 걸쳐 구조화 됨
SQL
- 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어
- 대소문자를 구분하지 않음
- SQL Statements의 끝에는 세미콜론이 필요
SQL Statements
- SQL을 구성하는 가장 기본적인 코드 블록
- DDL : 데이터 정의
- DQL : 데이터 검색
- DML : 데이터 조작
- DCL : 데이터 제어
- COMMIT
- ROLLBACK
- GRANT
- REVOKE
SELECT
- 테이블에서 데이터를 조회
- 테이블의 데이터를 조회 및 반환
- '*'를 사용하여 모든 필드 선택
- SELECT FIRSTNAME AS '이름' FROM employees;
- SELECT NAME, Milliseconds / 60000 AS '재생시간(분)' FROM tracks;
ORDER BY
- 조회 결과의 레코드를 정렬
- 기본 값은 ASC
- SELECT FIRSTNAME FROM employees ORDER BY FirstName;
- SELECT FIRSTNAME FROM employees ORDER BY FirstName DESC;
- SELECT Country, City FROM customers ORDER BY Country DESC, City;
Filtering data 관련 keywords
| Clause | Operator |
|---|
| DISTINCT | BETWEEN |
| WHERE | IN |
| LIMIT | LIKE, Comparison, Logical |
Distinct
- 조회결과에서 중복된 레코드를 제거
- Select 키워드 바로 뒤에서 작성해야 함
- SELECT DISTINCT 키워드 다음에 고유한 값을 선택하려는 하나 이상의 필드를 지정
- SELECT DISTINCT select_list FROM table_name;
- SELECT DISTINCT FIRSTNAME FROM employees ORDER BY FirstName;
WHERE
- 조회 시 특정 검색 조건을 지정
- FROM caluse 뒤에 위치
- 비교연산자 및 논리연사를 사용하는 구문이 사용됨
- SELECT LastName, FirstName, City FROM customers WHERE CITY = 'Prague';
- SELECT LastName, FirstName, City FROM customers WHERE CITY != 'Prague';
- SELECT LastName, FirstName, City FROM customers WHERE Company IS NULL AND CITY = 'USA';
- SELECT LastName, FirstName FROM customers WHERE FirstName LIKE '__a';
Comparison Operators
- 비교연산자
- =, >=, <=, !=, IS,Like, IN, BETWEEN,... , AND
Logical Operators
- 논리연산자
- AND(&&), OR(||), NOT(!)
- '%' : 0개 이상의 문자열과 일치하는 확인
- '_ ' 단일 문자와 일치하는지 확인
LIMIT clause
- 조회하는 레코드 수를 제한
- 하나 또는 두 개의 인자를 사용
- SELECT TrackId, Name, Bytes FROM tracks ORDER BY Bytes DESC LIMIT 7;
- 테이블 tracks에서 TrackId, Name, Bytes 필드 데이터를 Bytes 기준 내림 차순으로 4번째부터 7번째 데이터만 조회
- SELECT TrackId, Name, Bytes FROM tracks ORDER BY Bytes DESC LIMIT 3, 4;
Grouping data
GROUP BY clause
- 레코드를 그룹화하여 요약본 생성
- Aggregation Functions : 값에 대한 계산을 수행하고, 단일한 값을 반환하는 함수 -> SUM, AVG, MAX, MIN, COUNT
- 테이블 tracks에서 Composer 필드를 그룹화하여 각 그룹에 대한 Bytes의 평균 값을 내림차순 조회
- SELECT Composer, AVG(Bytes) FROM tracks GROUP BY Composer ORDER BY AVG(Bytes) DESC;
- SELECT Composer, AVG(Bytes) as bt FROM tracks GROUP BY Composer HAVING bt < 10 ;
실행 순서
- FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
Managing Tables
Create
- 각 필드에 적용할 데이터 타입 작성
- 테이블 및 필드에 대한 제약 조건 작성
CREATE TABLE examples(
ExamID INTEGER PRIMARY KEY AUTOINCREMENT,
LastName VARCHAR(50) NOT NULL,
FirstName VARCHAR(50) NOT NULL
)
데이터 타입
- NULL : 아무런 값도 포함하지 않음을 나타냄
- INTEGER : 정수
- REAL : 부동 소수점
- TEXT : 문자열
- BLOB : 이미지, 동영상, 문서 등의 바이너리 데이터
Constraints
- 테이블의 필드에 적용되는 규칙 또는 제한 사항
- 데이터의 무결성을 유지하고 데이터베이스의 일관성을 보장
- PRIMARY KEY
- 해당 필드를 기본 키로 지정
- INTERGER 타입에만 적용되며 INT, BIGINT 등과 같은 다른 정수 유형은 적용되지 않는다
- NOT NULL
- 해당 필드에 NULL 값을 허용하지 않도록 지정
- FOREIGN KEY
AUTOINCREMENT keyword
- 자동으로 고유한 정수 값을 생성하고 할당하는 필드 속성
- 필드의 자동 증가를 나타내는 특수한 키워드
- 주로 PRIMARY KEY 필드에 적용
- INTEGER PRIMARY KEY AUTOINCREMENT가 작성된 필드는 항상 새로운 레코드에 대해 이전 최대 값보다 큰 값을 할당
- 삭제된 값은 무시되며 재사용할 수 없게 됨
Modifiying table fields
ALTER TABLE
- 테이블 및 필드 조작
|명령어 | 역할|
|------|-----|
ALTER TABLE ADD COLUMN | 필드 추가|
ALTER TABLE RENAME COLUMN | 필드 이름 변경|
ALTER TABLE RENAME TO | 테이블 이름 변경|
- ALTER TABLE examples ADD COLUMN Age INTEGER NOT NULL DEFAULT 0;
- ADD COLUMN 키워드 이후 추가하고자 하는 새 필드 이름과 데이터 타입 및 제약 조건 작성
- 추가하고자 하는 필드에 NOT NULL 제약조건이 있을 경우 NULL이 아닌 기본 값 설정 필요
- ALTER TABLE table_name RENAME COLUMN current_name TO new_name
- RENAME COLUMN 키워드 뒤에 이름을 바꾸려는 필드의 이름을 지정하고 TO 키워드 뒤에 새 이름을 지정
- ALTER TABLE table_name RENAME TO new_table_name
- RENAME TO 키워드 뒤에 새로운 테이블 이름 지정
DROP TABLE
- DROP TABLE statment 이후 삭제할 테이블 이름 작성
- new_examples 테이블 삭제
참고
SQLite 타입 선호도의 목적
- 유연한 데이터 타입 지원
- 데이터 타입을 명시적으로 지정하지 않고도 데이터를 저장하고 조회할 수 있음
- 컬럼에 저장되는 값의 특성을 기반으로 데이터 타입을 유추
- 간편한 데이터 처리
- INTEGER Type Affinity를 가진 열에 문자열 데이터를 저장해도 SQLite는 자동으로 숫자로 변환하여 처리
- SQL 호환성
반스시 NOT NULL 제약을 사용?
- NO
- 하지만 데이터베이스를 사용하는 프로그램에 따라 NULL을 저장할 필요가 없는 경우가 많으므로 NOT NULL을 정의
- 값이 없다 라는 표현을 테이블에 기록하는 것은 0이나 빈 문자열 등을 사용하는 것으로 권장
Modifiying DATA
INSERT
- 테이블에 레코드 삽입
- INSERT INTO table_name(C1, C2, ..) VALUES (v1, v2, ...);
- INSERT INTO 절 다음에 테이블 이름과 괄호 안에 필드 목록 작성
- VALUES 키워드 다음 괄호 안에 해당 필드에 삽입할 값 목록 작성
- INSERT INTO articles( title, content, createdAT) VALUES('title1', 'content1', '1900-01-01'),('title2', 'content2', '1800-01-01'),('title3', 'content3', '1700-01-01');
UPDATE
- 테이블 레코드 수정
- UPDATE table_name SET column_name = expression, [WHERE condition];
- SET 절 다음에 수정 할 필드와 새 값을 지정
- WHERE 절에서 수정 할 레코드를 지정한느 조건 작성
- WHERE 절을 작성하지 않으면 모든 레코드를 수정
- UPDATE articles SET title = 'udpate Title' WHERE id = 1;
DELETE
- 테이블 레코드 삭제
- DELTE FROM table_name [WHERE condition];
- DELTE FROM 절 다음에 테이블 이름 작성
- WHERE 절에서 삭제할 레코드를 지정하는 조건 작성
- WHERE 절을 작성하지 않으면 모든 레코드를 삭제
- 작성일이 오래된 레코드 2개 삭제
- DELETE FROM articles WHERE id IN(
SELECT id FROM articles ORDER BY createdAT LIMIT 2
);
Join
관계
- 여러 테이블 간의 논리적 연결
- 테이블 분리 시 데이터 관리는 용이하나 출력 시에 문제 발생
- 테이블 한 개만을 출력할 수 밖에 없어 다른 테이블과 결합하여 출력하는 것이 필요해진 상황
JOIN
- 둘 이상의 테이블에서 데이터를 검색하는 방법
- INNER JOIN
- LEFT JOIN
INNER JOIN
- 두 테이블 값이 일치하는 레코드에 대해서만 결고 반환
- SELECT select_list FROM table_a INNER JOIN table_b ON table_b.fk = table_a.pk;
- FROM 절 이후 메인 테이블 지정
- INNER JOIN 절 이후 메인 테이블과 조인할 테이블을 지정
- ON 키워드 이후 조인 조건을 작성
- 조인 조건은 table_a 와 table_b간의 레코드를 일치시키는 규칙을 지정
LEFT JOIN
- 오른쪽 테이블의 일치하는 레코드와 함께 왼쪽 테이블의 모든 레코드 반환
- SELECT select_list FROM table_a LEFT JOIN table_b ON table_b.fk = table_a.pk;
- FROM 절 이후 왼쪽 테이블 지정
- LEFT JOIN 절 이후 오른쪽 테이블 지정
- ON 키워드 이후 조인 조건을 작성
- 왼쪽 테이블의 각 레코드를 오른쪽 테이블의 모든 레코드와 일치시킴
- 왼쪽 테이블의 모든 레코드를 표기
- 오른쪽 테이블과 매칭되는 레코드가 없으면 NULL을 표시