SQL (Structured Query Language)
소위 머신러닝, 딥러닝 등의 데이터 분석 기법을 하기 위해서는 무엇보다도 분석의 대상이 되는 데이터가 있어야 한다. 데이터는 주로 데이터베이스에 저장되어 있는데, 왜냐하면 다음의 이유 등으로 데이터베이스를 활용하는 것이 메모리 사용이나 시간 측면에서 더 유리하고 편리하기 때문이다:
1) 엑셀이나 csv를 통해 데이터에 접근할 경우, 데이터를 사용할 때마다 파일을 매번 읽어와야 한다. 이러한 작업은 데이터의 양이 많을수록, 파일의 크기가 커질수록 많은 시간을 소요하게 된다. 또한 동시에 다뤄야 하는 데이터가 많을수록 각각의 파일들을 연동해서 다루기 복잡해진다.
2) 파이썬 등의 프로그래밍 언어에서 변수로 데이터를 저장하는 경우, 프로그램이 종료되는 순간 프로그램에서 사용하던 데이터도 같이 사라진다. 따라서 데이터를 분석할 때마다 프로그램을 다시 시작해야 하며, 데이터의 수명이 프로그램의 작동에 의존하게 된다.
따라서 실무에서 데이터 분석을 하기 위해서는 이런 데이터베이스에 접근하고 원하는 데이터를 가져오기 위한 SQL에 대한 이해가 필수적이다. SQL은 엑셀이나 csv가 여러 파일이나 시트에 나누어서 저장하는 여러 데이터를 그 데이터들의 관계를 포함하는 테이블로 저장하여 제공하기 때문에 복잡하거나 용량이 큰 데이터도 비교적 빠르게 가져오고 처리할 수 있다.
이때 SQL은 글자 그대로 '구조화된 쿼리 언어'(Structured Query Language)를 뜻한다. '질의문'이라는 뜻을 가진 query의 의미에서 알 수 있듯, SQL은 기존에 존재하는 데이터를 쿼리문을 통해 요청하는 조건에 따라 필터링 한 후 가져올 수 있다. 즉, SQL은 '데이터베이스에 쿼리를 통해 원하는 데이터를 가져올 수 있도록 요청하는 데이터베이스 용 프로그래밍 언어'라고 할 수 있다.
SQL은 관계를 가지는 형태로 구조화된 데이터를 사용하며, 이때 구조화된 모습은 엑셀에서 볼 수 있는 정형화되어 있는 행과 열로 이루어진 테이블이다. (이런 정형화된 테이블로 구성되어 있지 않은 데이터베이스를 NoSQL이라 부른다.)
SQL의 종류
SQL는 목적과 용도에 따라 DDL, DML, DCL, DQL, TCL로 나누어질 수 있다. (그러나 아직 내가 실력이 부족해서 그런지는 몰라도, 막상 실제로 사용할 때는 이런 개념적 구분을 의식하면서 쓰지는 않는 것 같다.)
1) Data Definition Language (DDL)
말 그대로 데이터베이스 테이블과 같은 오브젝트를 '정의(definition)'할 때 사용하는 언어. 테이블을 만들 때 사용하는 `CREATE`나 제거할 때 사용하는 `DROP` 등이 포함된다.
2) Data Manipulation Language (DML)
데이터베이스에 있는 데이터를 '조작(manipulation)'할 때 사용하는 언어. 새로운 레코드를 추가하는 `INSERT`, 데이터를 삭제하는 `DELETE`, 변경하는 `UPDATE` 등이 포함된다.
3) Data Control Language (DCL)
데이터베이스에 대한 접근 권한과 관련된 문법이다. 데이터 접근 권한을 부여하는 `GRANT`나 철회하는 `REVOKE` 등이 포함된다.
4) Data Query Language (DQL)
정해진 스키마 안에서 데이터에 대한 쿼리를 할 수 있는 언어다. 보통 SQL을 배우고 사용할 때, 가장 많이 활용되는 부분으로 생각하면 될 것 같다. DML과 다른 언어로 분류되지만, DML의 일부처럼 이야기된다.
보통 `SELECT`로 시작되는 SQL문들이 DQL에 포함된다.
5) Transaction Control Language (TCL)
DML을 거친 데이터의 변경 사항을 수정할 수 있다. DML을 수행했다고 해도 DML이 작업한 내용을 데이터 베이스에 기록하는 `COMMIT`, 커밋한 내용을 다시 취소하는 `ROLLBACK` 등 TCL 구문을 수행하지 않으면 변경한 내용이 실제 데이터베이스에 반영되지 않는다.
데이터베이스의 설계 구조
SQL에서는 구조화된 데이터가 하나의 테이블로 저장되며, 이 데이터 테이블 간의 상호작용이 관계 형태로 표현된다. 따라서 SQL을 통해 접근하는 데이터베이스는 서로 관계를 갖는 여러 개의 테이블이 저장되어 있고, 사용자는 SQL 명령어를 통해 이 데이터 베이스에서 원하는 작업을 수행한다.
이 데이터 베이스를 구성하는 테이블 안에서 각 부분들을 다음과 같은 개념을 통해 부를 수 있다.
- Table : 행과 열로 구조화되어 있는 데이터
- Data : 각 항목에 저장되는 값
- Field (Column) : 테이블의 열
- Record (Tuple) : 테이블의 한 행에 저장된 정보
- Key : 테이블에 있는 각 레코드를 구분할 수 있는 고유한 값이다. Key에는 Primary Key와 Foreign Key가 있다.
테이블 간의 관계
1) 1:1 관계
한 데이터 테이블의 각각의 레코드 하나가 다른 데이터 테이블의 각각의 레코드 하나씩만 연결되어 있는 경우를 뜻한다.
가령, 중복 닉네임을 허용하지 않는 게임에서,
user 테이블이 user의 계정, 이름, 닉네임을 저장하고 있고
character 테이블이 닉네임, 캐릭터의 능력 등을 저장하고 있는 경우
user와 character 테이블은 user 테이블에 있는 각각의 유저와 character에 포함되어 있는 각각의 캐릭터가 1대 1로 연결되므로 1:1 관계에 해당한다.
보통 1:1 관계는 하나의 테이블로 표현할 수 있기에, 잘 사용되지 않는다.
2) 1:N 관계 (일대다 관계)
관계형 데이터베이스에서 가장 흔한 관계로, 테이블 레코드 하나가 여러 개의 레코드와 연결되어 있는 경우를 의미한다.
위의 예시를 다시 들어보면, 닉네임의 중복은 허용하지 않지만 한 계정에 여러 개의 캐릭터를 만들 수 있는 경우
user 테이블과 character 테이블은 1:N 관계를 갖게 된다.
(하나의 user id가 여러 개의 character를 가질 수 있지만, 한 character가 여러 개의 user id를 가질 수는 없음)
3) N:M 관계 (다대다 관계)
여러 개의 레코드가 여러 개의 레코드를 가지는 관계이다.
이런 경우는 보통 여러 개의 1:N 관계가 결합한 것이며, SQL 문에서는 'JOIN' 문을 통해 관리 및 검색된다.
이후에는 일반적으로 많이 사용되는 (그리고 내가 지금 공부하고 있는) PostgreSQL의 구문들을 틈틈히 정리해보고자 한다.
'sql' 카테고리의 다른 글
SQL : OUTER JOIN (0) | 2022.10.01 |
---|---|
SQL : Inner Join (0) | 2022.09.19 |
SQL 기본 구문: SELECT와 FROM (0) | 2022.09.15 |