1. 데이터베이스
- 일반적으로 데이터베이스라고 말할 때는 특정 기업이나 조직, 개인이 필요에 따라 데이터를 일정한 형태로 저장해 놓은 것을 의미
- i.g. 학교에서는 학생 관리를 목적으로 학생 개개인의 정보를 모으고 기업에서는 직원들을 관리하기 위해 직원들의 이름, 부서, 월급 등의 정보를 모아둠
- 관리 대상이 되는 데이터의 양이 점점 많아지고 같은 데이터를 여러 사람이 동시에 다양한 용도로 사용하게 되면 단순히 엑셀 같은 개인이 관리하는 소프트웨어만으로는 한계가 따름
- 개인의 사소한 부주의로 인해 기업의 사활이 걸린 중요한 데이터가 손상되거나 유실되는 상황까지 발생할 수 있음
- 따라서 많은 사용자들은 더 효율적인 데이터 관리뿐 아니라 예기치 못한 사건으로 인한 데이터 손상을 피하고, 필요한 데이터를 복구하기 위한 강력한 기능의 소프트웨어를 필요로 하게 되었고 이 기본적인 요구사항을 만족시켜 주는 시스템을 DBMS (Database Management System)이라고 함
- 파일 시스템은 하나의 파일을 많은 사용자가 동시에 검색할 수 있지만 동시에 입력, 수정 및 삭제할 수 없기 때문에 정보의 관리가 어려움
- 동일한 데이터가 여러 곳에 저장되어 여러 데이터 파일이 존재하는 상황에서, 하나의 원본 파일에 변경 작업이 발생했을 때 모든 복사본에 동시에 변경 작업을 적용하지 않을 경우 데이터 불일치성이 발생
- 결과적으로 파일 시스템은 분산된 데이터 간 정합성을 유지하는 데 과다한 노력이 필요하고 데이터의 정합성을 보장하기 힘듦
- 관계형 데이터베이스는 정규화를 통한 합리적인 테이블 모델링을 통해 이상 (Anomaly) 현상을 제거하고 데이터 중복을 피할 수 있으며, 동시성 관리와 병행 제어를 통해 많은 사용자가 동시에 데이터를 공유 및 조작할 수 있는 기능을 제공하므로 파일 시스템에서 발생하는 문제를 해결할 수 있음
- 또한 메타 데이터를 총괄 관리할 수 있으므로 데이터의 성격, 속성 또는 표현 방법 등을 체계화할 수 있고, 데이터 표준화를 통한 데이터 품질을 확보할 수 있는 장점을 가지고 있음
- DBMS는 인증된 사용자만 접근할 수 있는 보안 기능과 테이블 생성 시 활용 가능한 다양한 제약 조건을 제공하여 사용자가 조건에 위배되는 데이터를 입력하거나 관계를 연결하는 중요 데이터를 실수로 삭제하는 것을 방지함으로써 데이터 무결성 (Integrity)을 보장
- 추가로 DBMS는 시스템의 갑작스런 장애로부터 사용자가 입력, 수정 및 삭제하던 데이터가 제대로 반영될 수 있도록 보장해 주는 기능과 시스템 다운 등의 상황에서도 데이터를 복구할 수 있는 기능을 제공
2. SQL (Structured Query Language)
- SQL은 관계형 데이터베이스에서 데이터 정의, 데이터 조작, 그리고 데이터를 제어하기 위해 사용하는 언어
- SQL의 문법이 영어 문법과 흡사하기 때문에 SQL 자체는 다른 개발 언어보다 기초 단계 학습은 쉬운 편이지만, SQL이 시스템에 미치는 영향이 크므로 고급 SQL이나 SQL 튜닝의 중요성은 계속 올라가고 있음
- SQL 교육은 정확한 데이터를 출력하는 것이 목표
- SQL 튜닝의 목적은 시스템에 큰 영향을 주는 SQL을 가장 효과적으로 작성하는 것이 목표
- ANSI/ISO를 통해 표준화하고 정의된 SQL 기능은 벤더별 DBMS 개발의 목표
- 일부 구체적인 용어는 다르더라도 대부분의 관계형 데이터베이스에서 ANSI/ISO 표준을 최대한 따르고 있으므로 SQL에 대한 지식은 다른 데이터베이스를 사용하더라도 상당 부분 기존 지식을 재활용할 수 있음
- ANSI/ISO SQL-99, SQL-2003 이후의 기준을 준수하는 SQL이라면 프록그램의 이식성을 높이는 데도 공헌함
- 각 벤더의 관계형 데이터베이스는 표준화한 SQL 이외에도 벤더 차별화 및 이용 편리성을 위해 추가 기능이나 내장 함수 등에서 독자적 개발을 계속하고 있음
- 상호 호환성이 뛰어난 표준 기능과 벤더별 특징을 갖고 있는 독자적 기능 중 어떤 기능을 선택할지는 사용자의 몫
- 가능한 ANSI/ISO 표준을 기준으로 작성하는 것을 권장
- SQL 문장은 단순 스크립트가 아니라 일반적인 개발 언어처럼 독립된 하나의 개발 언어
- 일반적인 프로그램이 언어와는 달리 SQL은 관계형 데이터베이스에 대한 전담 접속 용도로 사용되며 세미콜론 (;)으로 분리된 SQL 문장 단위로 독립되어 있음
- 특정 데이터들의 집합에서 필요로 하는 데이터를 꺼내서 조회하고 새로운 데이터를 입력, 수정 및 삭제하는 행위를 통해 사용자는 데이터베이스와 대화하게 되며 SQL은 이러한 대화를 가능하도록 매갭 역할을 수행함
- 결과적으로 SQL 문장을 배우는 것이 곧 관계형 데이터베이스를 배우는 기본 단계
- SQL 문장과 관련된 용어 중에서 먼저 테이블에 대한 내용은 건드리지 않고 단순히 조회하는 SELECT 문장이 있음
- INSERT, UPDATE, DELETE 문장은 테이블에 들어 있는 데이터들을 조작하는 SQL 문장들
- 그 외 테이블을 생성하고 수정, 변경 및 삭제하는 테이블 관련 SQL 문장이 있고
- 추가로 데이터에 대한 권한을 제어하는 SQL 문장도 있음
3. STANDARD SQL 개요
- 국내 뿐만 아니라 전 세계적으로 많이 사용되는 관계형 데이터베이스는 오브젝트 개념을 포함한 여러 새로운 기능들이 꾸준히 추가되고 있음
- 많은 시스템의 두뇌 역할을 하는 관계형 데이터베이스를 유일하게 접속할 수 있는 언어가 바로 SQL
- 사용자와 개발자 입장에서는 SQL의 진화 및 변화가 가장 큰 관심사
- 초창기 SQL의 기본 기능을 정리했던 최초의 SQL-86 표준과 관계형 DBMS의 폭발적인 전성기를 주도했던 ANSI/ISO SQL2 세대를 지나면서 기술적으로 많은 발전이 있었음
- 그러나 ANSI/ISO SQL2은 표준 SQL에 대한 명세가 부족한 부분이 있었고, DBMS 벤더별로 문법이나 사용되는 용어의 차이가 너무 커져서 상호 호환성이나 SQL 학습 효율이 떨어지는 문제가 발생함
- 이에 향후 SQL에서 필요한 기능을 정리하고 호환 가능한 여러 기준을 제정한 것이 1999년에 정해진 ANSI/ISO SQL3
- 이후 가장 먼저 ANSI/ISO SQL3의 기능을 시현한 것이 Oracle의 8i/9i 버전
- 2003년에 ANSI/ISO SQL 기준이 소폭 추가 및 개정되었고 현재 사용되는 데이터베이스는 대부분 SQL 2003 표준을 기준으로 하고 있음
- 다른 벤더들의 DBMS도 2006년 이후 발표된 버전에서 ANSI/ISO SQL-99와 SQL:2003의 핵심 기능을 만족스러운 수준으로 지원하는 것으로 평가받고 있음
- 아직도 벤더별로 일부 기능의 개발이 진행 중인 경우도 있고, 벤더별 특이한 기술 용어는 여전히 호환이 안되고 있지만 ANSI/ISO SQL 표준을 통해 STANDARD JOIN을 포함한 많은 기능이 상호 벤치마킹되고 발전되면서 DBMS 간에 평준화를 이루어 가고 있다고 볼 수 있음
- 결과적으로 사용자 입장에서는 ANSI/ISO SQL의 새로운 기능들을 사용함으로써 더 쉽게 데이터를 추출하거나 SQL 튜닝 효고라르 함께 얻을 수 있게 되었음
- 대표적인 ANSI/ISO 표준 SQL의 기능은 다음 내용을 포함함
- STANDARD JOIN 기능 추가 (CROSS, OUTER JOIN 등 새로운 FROM 절 JOIN 기능들)
- SCALAR, SUBQUERY, TOP-N QUERY 등의 새로운 SUBQUERY 기능들
- ROLLUP, CUBE, GROUPING SETS 등의 새로운 리포팅 기능
- WINDOW FUNCTION 같은 새로운 개념의 분석 기능들
가. 일반 집합 연산자
- 일반 집합 연산자를 현재의 SQL과 비교하면 다음과 같음
- UNION 연산은 UNION 기능으로 구현
- INTERSECTION 연산은 INTERSECT 기능으로 구현
- DIFFERENCE 연산은 EXCEPT (Oracle은 MINUS) 기능으로 구현
- PRODUCT 연산은 CROSS JOIN 기능으로 구현
나. 순수 관계 연산자
- 순수 관계 연산자는 관계형 데이터베이스를 구현하기 위해 새롭게 만들어진 연산자
- 순수 관계 연산자를 현재의 SQL 문장과 비교하면 다음과 같음
- SELECT 연산은 WHERE 절로 구현
- PROJECT 연산은 SELECT 절로 구현
- (NATURAL) JOIN 연산은 다양한 JOIN 기능으로 구현
- DIVIDE 연산은 현재 사용되지 않음
관계형 데이터베이스의 경우 요구 사항 분석, 개념적 데이터 모델링, 논리적 데이터 모델링, 그리고 물리적 데이터 모델링 단계를 거치게 됩니다.
- 해당 단계에서 엔티티 확정 및 정규화 과정, M:N (다대다) 관계를 분해하는 절차를 거침
- 특히 정규화 과정의 경우 데이터 정합성과 데이터 저장 공간의 절약을 위해 엔티티를 최대한 분리하는 작업, 일반적으로 3차 정규형이나 BCNF 정규형까지 진행하게 됨
- 이런 정규화를 거치면 하나의 주제에 관련된 엔티티가 여러 개로 나뉘게 되며 해당 엔티티들이 주로 테이블이 되는데 이렇게 흩어진 데이터를 연결해 원하는 데이터를 가져오는 작업이 바로 JOIN
4. 테이블
- 데이터는 관계형 데이터베이스의 기본 단위인 테이블 형태로 저장됨
- 모든 자료는 테이블에 등록되고
- 우리는 테이블로부터 원하는 자료를 꺼내 올 수 있음
- 테이블은 어느 특정한 주제와 목적으로 만들어지는 일종의 집합
- [표 II-1-2]처럼 켘이리그 선수들의 정보들을 하나의 표에서 정리할 수 있다면, 해당 표만으로도 내가 좋아하는 선수들의 상세한 정보를 볼 수 있고, 선수들의 정보를 상호 간 비교해 볼 수 있음
- 새로운 선수를 입력하려고 할 때, 새로운 테이블을 생성할 필요 없이 데이터만 추가함으로써 선수들의 정보를 모두 관리할 수 있음
- 테이블에는 등록된 자료들이 있으며, 해당 자료들은 삭제하지 않는 한 지속적으로 유지됨
- 만약 우리가 자료를 입력하지 않는다면 테이블은 본래 만들어졌을 때부터 갖고 있던 속성을 그대로 유지하면서 존재함
- 테이블에 대해 좀 더 상세히 살펴보면 다음과 같이 정리할 수 있음
- 테이블은 데이터를 저장하는 객체로서 관계형 데이터베이스의 기본 단위
- 관계형 데이터베이스에서는 모든 데이터를 칼럼과 행이라는 2차원 구조로 나타냄
- 세로 방향을 컬럼 (Column), 가로 방향을 행 (Row)이라고 지칭하며 칼럼과 행이 겹치는 하나의 공간을 필드 (Field)라고 함
- 선수와 관련된 데이터를 저장할 때 모든 데이터를 하나의 테이블로 저장하지 않음
- [그림 II-1-5]을 보면 선수와 관련된 데이터를 선수 테이블과 팀 테이블이라는 복수의 테이블로 분할 및 저장하고 있음
- 분할된 테이블은 해당 칼럼의 값에 의해 연결되며 이렇게 테이블을 분할해 데이터의 불필요한 중복을 줄이는 것을 정규화 (Normalization)이라고 함
- 데이터의 정합성 확보와 데이터 입력, 수정 및 삭제 시 발생할 수 있는 이상현상을 방지하기 위해 정규화는 관계형 데이터베이스 모델링에서 매우 중요한 프로세스
- 각 행을 한 가지 의미로 특정할 수 있는 한 개 이상이 칼럼을 기본 키 (Primary Key)라고 함
- 여기서는 <선수> 테이블의 `선수번호`와 <팀> 테이블의 `팀코드`가 기본 키가 됨
- <선수> 테이블의 `팀 코드`와 같이 다른 테이블의 기본 키로 사용되면서 테이블과의 관계를 연결하는 역할을 하는 칼럼을 외부 키 (Foreign Key)라고 함
5. ERD (Entity Relationship Diagram)
- 팀 정보와 선수 정보 간에는 어떤 의미의 관계가 존재하며, 다른 테이블과도 어떤 의미의 연관성이나 관계를 갖고 있음
- ERD는 이와 같은 관계의 의미를 직관적으로 표현할 수 있는 좋은 수단
- [그림 II-1-6]처럼 팀과 선수 간에는 `소속`이라는 관계가 맺어져 있으며 테이블 간 서로의 상관관계를 그림으로 도식화한 것을 E-R 다이어그램이라고 함
- ERD의 구성 요소는 엔티티 (Entity), 관계 (Relationship), 속성 (Attribute) 세 가지이며, 현실 세계의 데이터는 이 세 가지 구성 요소로 모두 표현할 수 있음
- [그림 II-1-7]과 [그림 II-1-8]은 앞으로 사용하게 될 케이리그의 테이블 관계를 IE 표기법과 Barker 표기법으로 표현한 ERD
- 케이리그 테이블 간의 양방향 관계는 다음과 같음
- 하나의 팀은 여러 명의 선수를 포함할 수 있음
- 한 명의 선수는 하나의 팀에 꼭 속함
- 하나의 팀은 하나의 전용 구장을 꼭 가짐
- 하나의 운동장은 하나의 홈 팀을 가질 수 있음
- 하나의 운동장은 여러 게임의 스케줄을 가질 수 있음
- 하나의 스케줄은 하나의 운동장에 꼭 배정됨
6. 데이터 유형
- 데이터 유형은 데이터베이스의 테이블에 특정 자료를 입력할 때, 해당 자료를 받아들일 공간을 자료의 유형별로 나누는 기준
- 특정 칼럼을 정의할 때, 선언한 데이터 유형은 그 칼럼이 받아들일 수 있는 자료의 유형을 규정함
- 따라서 선언한 유형이 아닌 다른 종류의 데이터가 들어오려고 하면 데이터베이스는 에러를 발생시킴
- 데이터 유형과 더불어 지정한 크기 (Size)도 중요한 역할을 하며 선언 당시에 지정한 데이터의 크기를 넘어선 자료가 입력되면 에러를 발생시킬 수 있음
- 데이터베이스에서 사용하는 데이터 유형은 다양한 형태로 제공되며 벤더별로 SQL 문장의 차이는 줄어들고 있지만, 데이터 유형과 내장형 함수 부분에서는 차이가 많은 편
- ex) ANSI/ISO 기준에서는 NUMERIC Type의 하위 개념으로 NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT, BIGINT, FLOAT, REAL, DOUBLE PRECISION을 소개하고 있고 SQL Server와 Sybase는 ANSIS/ISO 기준의 하위 개념에 맞추어서 여러 숫자 타입을 제공하고 있으며, 추가로 MONEY, SMALLMONEY 등의 숫자 타입도 갖고 있음
- ex) 반면, Oracle은 NUBMER 한 가지의 숫자 데이터 유형만 지원함, 사용자 입장에서는 데이터 유형이나 내장형 함수까지 표준화가 되면 편리하겠지만, 벤더별 특화한 기능마다 장단점이 있으므로 사용자가 여러 상황을 고려해 판단할 문제
- 테이블의 칼럼이 갖고 있는 대표적인 네 가지 데이터 유형은 다음과 같음
- 아래 네 가지 유형 외에도 ANSI/ISO에서는 Binary String Type, Binary Large Object String Type, National Character String Type, Boolean Type 등의 다양한 유형을 표시하고 있음
- 문자열 유형의 경우, CHAR 유형과 VARCHAR 유형 중 어느 유형을 지정하는지에 대한 문제가 자주 논의됨
- VARCHAR 유형은 가변 길이이므로 필요한 영역은 실제 데이터 크기뿐이기 때문에 길이가 다양한 칼럼과, 정의된 길이와 실제 데이터 길이에 차이가 있는 칼럼에 적합함, 저장 측면에서도 CHAR 유형보다 작은 영역에 저장할 수 있으므로 장점이 있음 (40바이트가 지정되더라도 실제 데이터 길이가 11바이트일 경우 11바이트 공간만을 차지함)
- CHAR에서는 문자열을 비교할 때 공백을 채워서 비교하는 방법을 사용하므로 공백 채우기 비교에서는 우선 짧은 쪽의 끝에 공백을 추가해 두 개의 데이터가 같은 길이가 되도록 한 뒤 앞에서부터 한 문자씩 비교함, 즉 TRIM 해서 비교함 (그에 반해 VARCHAR 유형에서는 맨 처음부터 한 문자씩 비교하고 공백도 하나의 문자로 취급하므로 끝의 공백이 다르면 다른 문자로 판단함)
- CHAR가 아닌 VARCHAR, NUMERIC 유형에서 정의한 길이나 자릿수의 의미는 해당 데이터 유형이 가질 수 있는 최대한의 한계값을 정의한 것이라고 보아야 함
- 문자열 (CHAR와 VARCHAR)에 대한 최대 길이와 NUMBER 칼럼의 정밀도 (Precision)을 지정하는 것은 테이블 설계 시 반드시 고려해야 할 중요 요소
- 잘못된 판단은 추후 ALTER TABLE 명령으로 정정할 수 있지만, 데이터가 입력된 상황이라면 처리 과정이 쉽지 않음
참고
SQL 전문가 가이드 2020 개정판 - 한국데이터산업진흥원
반응형
'DB > SQL 전문가 가이드' 카테고리의 다른 글
[과목 II 1장 3절] 함수 (0) | 2025.03.22 |
---|---|
[과목 II 1장 2절] SELECT 문 (0) | 2025.03.22 |
[과목 I 2장 5절] 본질식별자 vs. 인조식별자 (0) | 2025.03.17 |
[과목 I 2장 4절] Null 속성의 이해 (0) | 2025.03.17 |
[과목 I 2장 3절] 모델이 표현하는 트랜잭션의 이해 (0) | 2025.03.17 |