
이번에는 데이터베이스 기초에 대해 학습을 했다. 데이터베이스는 학생 때 수업을 통해서, 정보처리기사를 준비하며 학습한 것이 내 데이터베이스의 개념에 대한 모든 것이었지만, 이번에 다시 배우며 꽤 도움이 된 것 같다는 생각이 든다. 데이터베이스를 모두 다루긴 힘드니, 학습을 하며 내가 더 기억하면 좋을 것 같은 개념들을 정리를 해보겠다.
데이터베이스를 이용하지 않고 데이터를 저장하고 불러오는 경우
In-Memory
File I/O
하지만 관계형 데이터베이스에서는 하나의 CSV 파일이나 엑셀 시트같이 한 개의 테이블로 저장을 할 수 있다.
Structured Query Language 약자이며 데이터베이스 언어이며 구조화된 쿼리 언어이다., 주로 관계형 데이터베이스에서 사용한다. (MySQL, Oracle, SQLite, PostgreSQL 등)
쿼리
USE DATABASE_NAME;
DESCRIBE(OR DESC) TABLE_NAME;
트랜잭션이란 여러 개의 작업을 하나로 묶은 실행 유닛이다.
각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야만 정상적으로 종료를 한다. 하나의 트랜잭션에 속해있는 작업 중 하나의 작업이라도 실패한다면, 이 트랜잭션에 속한 모든 작업을 실패한 것으로 판단한다. 모든 작업이 성공하면 성공 그것이 아니면 실패 이 두가지의 결과만 존재한다. (COMMIT, ROLLBACK이 트랜잭션과 관련있다.) 트랜잭션이 ACID의 특성을 가지고 있다.
구조화된 데이터는 하나의 테이블로 표현할 수 있다. 테이블을 relation이라고도 부르기 때문에, 테이블을 사용하는 데이터베이스를 관계형 데이터베이스(Relational database)라고 한다.
관계형 데이터베이스의 키워드
데이터 : 각 항목에 저장되는 값
테이블(table or relation) : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적된다.
컬럼(column or field) : 테이블의 한 열을 가리키며 속성을 나타낸다.
레코드(record or tuple) : 테이블의 한 행에 저장된 데이터이며, 한 객체라고 봐도 좋다.
키(key) : 테이블의 각 레코드를 구분할 수 있는 값이다. 각 레코드마다 고유한 값을 가지며, 기본키(primary key)와 외래기(foreign key) 등이 있다.
관계 종류
집합연산 : 레코드를 조회하고 분류한 뒤, 특정 작업을 하는 연산
GROUP BY : 데이터를 조회할 때 그룹으로 묶어서 조회한다.
HAVING : GROUP BY로 조회된 결과를 필터링한다. 그룹화한 결과에 대한 필터이므로, WHERE과 다르다. WHERE는 저장된 레코드를 필터링한다.
COUNT() : 레코드의 갯수를 뽑을 때 사용한다.
SUM() : 레코드의 합을 리턴한다.
AVG() : 레코드의 평균값을 계산한다.
MAX(), MIN() : 각각 레코드의 최대값과 최소값을 리턴한다.
SELECT의 실행 순서
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
SELECT CustomerId, AVG(Total) FROM invoices WHERE CustomerId >= 10 GROUP BY CustomerId HAVING SUM(Total) >= 30 ORDER BY 2
위 쿼리문의 실행 순서는 다음과 같다.
1. FROM invoices: invoices 테이블에 접근을 한다다.
2. WHERE CustomerId >= 10: CustomerId 필드가 10 이상인 레코드들을 조회한다.
3. GROUP BY CustomerId: CustomerId를 기준으로 그룹화한다.
4. HAVING SUM(Total) >= 30: Total 필드의 총합이 30 이상인 결과들만 필터링한다.
5. SELECT CustomerId, AVG(Total): 조회된 결과에서 CustomerId 필드와 Total 필드의 평균값을 구한다.
6. ORDER BY 2: AVG(Total) 필드를 기준으로 오름차순 정렬한 결과를 리턴한다.
CREATE 이나 테이블을 제거할 때 사용되는 DROP 등이 DDL에 해당한다. 데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용한다.INSERT 처럼 새로운 레코드를 추가할 때 사용되는 문법을 포함해 데이터를 삭제하는 DELETE 나, 변경하는 UPDATE 가 DML에 포함된다.GRANT 나, 권한을 가져가는 REVOKE 등이 DCL에 포함된다.SELECT 가 DQL에 해당한다. 이렇게 언어를 분류했지만, DQL을 DML의 일부분으로 취급하기도 한다.COMMIT 처럼 DML이 작업한 내용을 데이터베이스에 커밋하거나, ROLLBACK 처럼 커밋했던 내용을 다시 롤백하는 문법이 있다.if문과 같은 기능을 사용할 수 있다. CASE 를 사용하면, 특정 조건에 따라 다른 결과를 받을 수 있다.SELECT CASE WHEN CustomerId <= 25 THEN 'GROUP 1' WHEN CustomerId <= 50 THEN 'GROUP 2' ELSE 'GROUP 3' END FROM customers
이 쿼리문은 CustomerId 필드값에 따라 3개의 그룹('GROUP 1', 'GROUP 2', 'GROUP 3')으로 나뉜다.
쿼리문을 작성할 때, 다른 쿼리문을 포함할 수 있다. 서브쿼리는 실행되는 쿼리에 중첩으로 위치해, 정보를 전달한다. 서브쿼리는 소괄호로 감싸야 한다.
서브쿼리의 결과는 개별 값이나 레코드 리스트이다.
서브쿼리의 결과를 하나의 칼럼으로 사용할 수 있다.
SELECT CustomerId, CustomerId = (SELECT CustomerId FROM customers WHERE CustomerId = 2) FROM customers WHERE CustomerId < 6
SELECT * FROM customers WHERE CustomerId IN (SELECT CustomerId FROM customers WHERE CustomerId < 10)
SELECT EmployeeId FROM employees e WHERE EXISTS ( SELECT 1 FROM customers c WHERE c.SupportRepId = e.EmployeeId ) ORDER BY EmployeeId
SELECT * FROM ( SELECT CustomerId FROM customers WHERE CustomerId < 10 )