[Database] Database 기초
안드로이드에서 Room을 이용하면 내부 DB를 사용할 수 있고, 간단한 쿼리문도 사용할 수 있다. 여기까지는 문제가 없는데, 내가 서버, DB 용어와 개념을 몰라서 이해가 잘 안간다. 그래서 간단하게 찾아서 공부하기 위해 작성된 글이다.
데이터베이스란??
- 여러 사람에 의해 공유되어 사용될 목적으로 통합하여 관리되는 데이터의 집합을 말한다. 자료 항목의 중복을 없애고 자료를 구조화하여 저장함으로써 자료 검색과 갱신의 효율을 높인다.
- 논리적으로 연관된 하나 이상의 자료의 모음으로 그 내용을 고도로 구조화함으로써 검색과 갱신의 효율화를 꾀한 것이다.
- 몇 개의 자료 파일을 조직적으로 통합하여 자료 항목의 중복을 없애고 자료를 구조화하여 기억시켜 놓은 자료의 집합체라고 할 수 있다.
왜 사용하는가?
데이터베이스란 다수의 사용자가 사용하는 데이터들의 공유와 운영을 위해 저장해 놓는 공간을 말한다. 프로그램을 만들다 보면 프로그램 사용자들에 의해 생성된 데이터, 프로그래머가 필요에 의해 프로그램에 넣어 놓은 데이터 등 필연적으로 많은 데이터들이 생성되어지게 된다. 여기서 데이터베이스를 사용하지 않으면 이 데이터들은 프로그램을 종료하는 순간 전부 날아가게 되는 불행한 상황을 맞이하게 된다.
따라서, 이런 현상을 방지하기 위해 데이터들을 데이터베이스에 넣고 보관하는 방법을 사용하는 것이다.
기초 용어
- 엔티티(Entity) : 사람, 장소, 사물, 사건 등과 같이 독립적으로 존재하면서 고유하게 식별이 가능한 실세계의 객체이다. 예를 들어, 사원 번호가 1206이고 김창섭인 사원, 과목 코드가 CS372인 운영체제 등이 있다. 이렇게 실체가 있는 것 뿐만 아니라 추상적인 것도 있다. 프로젝트 번호가 P101인 프로젝트, 학과 번호가 D316인 학과는 추상적인 개념의 엔티티가 될 수 있다.
- 스키마(Schema) : 데이터를 설명하는 데이터. 메타데이터(Metadata)라고도 한다. 예를 들어
홍길동, 1994-06-27
이라는 데이터가 있을 경우에는 이를이름, 생년원일
이라는 스키마로 설명할 수 있다.
Database 용어
- Table(Relation) : 관계형 데이터베이스에서 정보를 구분하여 저장하는 기본 단위를 말한다. 예로 부서에 관한 정보를 저장하는 부서 Relation(혹은 부서 Table)이 있다. 한 릴레이션은 데이터베이스에 표현되는 한 엔티티에 관한 정보를 저장하는 데 사용된다.
- 식별자(identifier) : 여러 개의 집합체를 담고 있는 관계형 데이터베이스에서 각각을 구분할 수 있는 논리적인 개념이다.
- 식별자의 특징
- 유일성 : 하나의 릴레이션에서 모든 행은 서로 다른 키 값을 가져야 한다.
- 최소성 : 꼭 필요한 최소한의 속성들로만 키를 구성해야 한다.
- 튜블(Tuple) : 테이블에서 행을 의미한다. 같은 말로 레코드(Record) 혹은 로우(Row)라고 하기도 한다. 튜플은 릴레이션에서 같은 값을 가질 수 없다.
- 카디날리티(Cardinality) : 튜플의 수
- 어트리뷰트(Attribute) : 테이블에서 열을 의미한다. 같은 말로 칼럼(Column)이라고도 한다.
- 디그리(Degree) : 어트리뷰트의 수를 의미한다.
- 도메인(Domain) : Relation에서 각각의 속성(Attribute)들이 취할 수 있는 같은 타입의 원자 값들의 집합이다.
Key
- 키(Key) : 한 Relation에서 각각의 Tuple(행)을 유일하게 식별하기 위해 사용하는 하나 혹은 그 이상의 속성들(Attribute)의 집합이다.
유일성과 최소성
- 유일성 : 하나의 키로 어떠한 행을 바로 찾아낼 수 있는 성질. ex) 주민등록번호
- 최소성 : 레코드(튜플)을 식별하는데 꼭 필요한 속성들로만 구성되어 있는 성질. ex) {주민등록번호+학번}은 최소성을 만족시키지 않는다. 주민등록번호로만 tuple(행)을 구분할 수 있기 때문이다.
- 후보키(Cadidate Key)
- 릴레이션을 구성하는 속성들 중에서 튜블을 유일하게 식별할 수 있는 속성들의 부분집합을 의미한다.
- 모든 릴레이션은 반드시 하나 이상의 후보키를 가져야한다.
- 릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 만족시켜야 한다.
ex) <학생> 릴레이션에서 '학번’이나 '주민번호’는 다른 레코드를 유일하게 구별할 수 있는 기본키로 사용할 수 있으므로 후보키가 될 수 있다. 즉, 기본키가 될 수 있는 키들을 후보키라고 한다.
- 기본키(Primary Key)
- 후보키 중에서 선택한 주키(Main key)
- 한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성
- Null 값을 가질 수 없다.(개체 무결성의 첫 번째 조건)
- 기본 키로 정의된 속성에는 동일한 값이 중복되어 저장될 수 없다.(개체 무결성의 두 번째 조건)
ex) <학생> 릴레이션에서는 '학번’이나 '주민번호’기 기본키가 될 수 있고, <수강> 릴레이션에서는 ‘학번’+'과목명’으로 조합해야 기본키가 만들어 질 수 있다. 왜냐하면 <수강> 릴렝션에서는 ‘학번’ 속성과 ‘과목명’ 속성은 개별적으로 기본키로 사용할 수 없다. 다른 튜플들과 구별되지 않기 때문이다.
1004 학번을 가진 학생이 영어와 전산 과목을 수강하고 있다고 하면 학번만으로는 특정 튜플을 유일하게 구별할 수 없다. 그리고 영어 과목을 수강하는 학생들은 한명이 아니라 여러 명이 될 수 있기 때문에 유일하게 구별할 수 없다.
- 대체키(Alternate Key)
- 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키들을 말한다.
- 보조키라고도 한다.
ex) <학생> 릴레이션에서 '학번’을 기본키로 정의하면 '주민번호’는 대체키가 된다.
- 슈퍼키(Super Key)
- 슈퍼키는 한 릴레이션 내에 있는 속성들의 집합으로 구성된 키로서 릴레이션을 구성하는 모든 튜플 중 슈퍼키로 구성된 속성의 집합과 동일한 값은 나타내지 않는다.
- 릴레이션을 구성하는 모든 튜플에 대해 유일성은 만족하지만, 최소성은 만족시키지 못한다.
ex) <학생> 릴레이션에서는 ‘학번’, ‘주민번호’, ‘학번’+‘주민번호’+‘성명’ 등으로 슈퍼키를 구성할 수 있다. 또한, 여기서 최소성을 만족시키지 못한다는 말은 ‘학번’+‘주민번호’+'성명’가 슈퍼키인 경우 3개의 속성 조합을 통해 다른 튜플과 구별이 가능하지만, ‘성명’ 단독적으로 슈퍼키를 사용했을 때는 구별이 가능하지 않기 때문에 최소성을 만족시키지 못한다.
즉, 뭉쳤을 경우 유일성이 생기고, 흩어지면 몇몇 속성들은 독단적으로 유일성 있는 키로 사용할 수 없다. 이것을 최소성을 만족하지 못한다고 한다.
- 외래키(Foreign Key)
- 관계(Relation)를 맺고 있는 릴레이션 R1, R2에서 릴레이션 R1이 참조하고 있는 릴레이션 R2의 기본키와 같은 R1 릴레이션의 속성이다.
- 외래키는 참조되는 릴레이션의 기본키와 대응되어 릴레이션 간에 참조 관계를 표현하는데 중요한 도구로 사용된다.
- 외래키로 지정되면 참조하는 테이블의 기본키에 없는 값은 입력할 수 없다.(참조 무결성 조건)
ex) <수강> 릴레이션이 <학생> 릴레이션을 참조하고 있으므로 <학생> 릴레이션의 '학번’은 기본키이고, <수강> 릴레이션의 '학번’은 외래키이다.
즉, 각 릴레이션의 입장에서 속성은 기본키가 되기도 하고, 외래키가 되기도 한다.
ex) <수강> 릴레이션의 '학번’에는 <학생> 릴레이션의 '학번’에 없는 값은 입력할 수 없다.
쿼리 문법의 세 종류와 각 문법
SQL(Structured Query Language)
- 관계형 데이터베이스에서 사용하는 표준 질이 언어를 말한다.
- 사용 방법이나 문법이 다른 언어(Java, C, C#)보다 단순하다.
- 모든 DBMS에서 사용 가능하다.
- 인터프리터 언어
- 대소문자를 구별하지 않는다.
- 데이터 정의 언어(DDL)
- 데이터베이스 검색, 등록, 삭제, 갱신을 하기 위해 사용하는 데이터베이스 언어
- 데이터베이스의 검색 및 업데이트 등 데이터 조작을 위해 사용
- 데이터베이스의 스키마를 정의, 생성, 수정하는 기능
- 테이블 생성, 컬럼 추가, 타입 변경, 각종 제약조건 지정, 수정 등
SQL문 | 내용 |
---|---|
create |
데이터베이스 객체를 생성 |
drop |
데이터베이스 객체를 삭제 |
alter |
기존에 존재하는 데이터베이스 객체를 다시 정의 |
- 데이터 조작 언어(DML)
- 관계형 데이터베이스의 구조를 정의한다.
- 쌍, 속성, 관계 인덱스 파일 위치 등 데이터베이스 고유의 특성을 포함한다.
- 데이터베이스의 테이블에 있는 내용을 직접 조작하는 기능
- 테이블의 레코드(튜플)을 CRUD(Create, Retrieve, Update, Delete)
SQL문 | 내용 |
---|---|
insert |
데이터베이스 객체에 데이터를 입력 |
delete |
데이터베이스 객체에 데이터를 삭제 |
update |
데이터베이스 객체 안의 데이터 수정 |
select |
데이터베이스 객체 안의 데이터 조회 |
- 데이터 제어 언어(DCL)
- 데이터베이스에서 데이터에 대한 액세스를 제어하기 위한 데이터베이스 언어 또는 데이터베이스 언어 요소
- 박탈, 연결, 권한 부여, 질의, 자료 삽입, 갱신, 삭제 등
- 데이터베이스의 테이블에 접근 권한이나 CRUD 권한을 정의하는 기능
- 특정 사용자에게 테이블의 조회권한 허가 / 금지 등
SQL문 | 내용 |
---|---|
grant |
데이터베이스 객체에 권한을 부여 |
revoke |
이미 부여된 데이터베이스 객체 권한을 취소 |
CRUD
CRUD(Create, Retrieve, Update, Delete)
이름 | 조작 | SQL |
---|---|---|
create |
생성 | insert |
read(retrieve) |
읽기(인출) | select |
update |
갱신 | update |
delete |
삭제 | delete |
- Create : 데이터베이스 객체 생성
- insert into
- 새로운 레코드를 추가
- Update : 데이터베이스 객체 안의 데이터를 수정
- update
- 특정 조건의 레코드의 컬럼 값을 수정
- Delete : 데이터베이스 객체의 데이터 삭제
- delete
- 특정 조건의 레코드를 삭제
- Retrieve : 데이터베이스 객체 안의 데이터 검색
- select
- 조건을 만족하는 레코드를 찾아 특정 컬럼 값을 표시(모두 표시 : *)
예제
1.select 명령문
SELECT 컬럼명 FROM 테이블명 WHERE 조건절;
ex)
-
Q : 국가 코드가 'KOR’으로 되어 있는 도시의 이름을 구하시오.
-
A : SELECT Name FROM City WHERE CountryCode=‘KOR’;
-
Q : 인구가 500만 이상인 도시들의 이름을 구하시오
-
A : SELECT Name FROM City WHERE Population > 5000000;
2. insert into 명령문
INSERT INTO 테이블명(컬럼명) VALUES(값);
ex)
주의
: 각각의 필드와 대응 시켜줘서 insert를 시켜주어야 한다.
INSERT INTO City (ID, Name, CountryCode, District, Population) values (10000, “Sample”, “KOR”, “Seoul”, 1000000);
주의
: 아래의 경우에는 모든 컬럼 값들이 일일히 필드와 대응되면 생략이 가능하다.
INSERT INTO City values(20000, "SampleTest
, “KOR”, “Busan”, 2000000);
결과 확인
// ID가 20000인 레코드 출력
SELECT * FROM City WHERE ID = 20000;
// ID가 20000인 레코드 출력
SELECT * FROM City WHERE ID = 10000;
3. update 명령문
UPDATE 테이블명 SET 컬럼명=값, … WHERE 조건절;
ex)
// ID가 10000인 레코드의 name을 "SampleUSA"로 변경
UPDATE City SET Name = “SampleUSA” WHERE ID = 10000;
결과 확인
// ID가 10000인 레코드 출력
SELECT * FROM City WHERE ID = 10000;
4. delete 명령문
DELETE FROM 테이블명 WHERE 조건절;
ex)
// ID가 20000이며 Population이 2000000인 레코드를 삭제
DELETE FROM City WHERE (ID = 20000) AND (Population = 2000000);
// ID가 10000이며 Population이 1000000인 레코드를 삭제
DELETE FROM City WHERE (ID = 10000) AND (Population = 1000000);
결과 확인
// ID가 10000인 레코드 출력
SELECT * FROM City WHERE ID = 10000;
// ID가 20000인 레코드 출력
SELECT * FROM City WHERE ID = 20000;