관계형 데이터베이스와 SQL Server
테이블·행·열이 무엇인지, SQL 이 무엇을 시키는 말인지 봅니다.
데이터를 어디에 담는가
프로그램이 다루는 값을 파일에 적어 둘 수도 있습니다. 회원 목록을 텍스트 파일 한 줄에 하나씩 적는 식입니다. 다루는 양이 적고 혼자 사용한다면 그것으로 충분합니다.
사람이 늘고 프로그램이 여럿이 되면 파일로는 감당하기 어려운 일이 생깁니다.
- 동시에 고칠 때 — 두 사람이 같은 파일을 동시에 저장하면 나중에 저장한 쪽이 앞의 내용을 덮어씁니다.
- 찾을 때 — 백만 줄에서 조건에 맞는 것을 찾으려면 처음부터 끝까지 읽어야 합니다.
- 중간에 멈출 때 — 여러 파일을 차례로 고치다 도중에 프로그램이 죽으면, 앞의 파일만 바뀌고 뒤의 파일은 그대로인 상태가 남습니다.
데이터베이스 관리 시스템(DBMS)은 이 세 가지를 대신 처리합니다. 이 단원에서 다루는 SQL Server 가 그중 하나이고, 데이터를 테이블의 형태로 담기 때문에 관계형 데이터베이스라고 부릅니다.
테이블, 행, 열
관계형 데이터베이스가 담는 것은 테이블(table) 하나뿐입니다. 테이블은 세로로 열(column) 을, 가로로 행(row) 을 가집니다.
- 열 — 무엇을 담을지 정합니다. 이름과 형식이 있고, 테이블을 만들 때 정해집니다.
- 행 — 실제 값 한 벌입니다. 회원 한 사람, 글 한 편이 각각 한 행입니다.
1.2 에서 만들 회원 테이블(Member.USERS)의 열은 다섯 개입니다.
형식(int·nvarchar)이 무엇인지는
1.4 에서 따로 다룹니다. 여기서는 열마다 담을 것이 미리 정해져 있다는
점만 보면 됩니다.
| 열 | 형식 | 담는 것 |
|---|---|---|
| num | int | 회원 번호. 자동으로 매겨집니다 |
| user_id | varchar(50) | 로그인 아이디 |
| nickname | nvarchar(50) | 화면에 보이는 이름 |
| varchar(200) | 전자 메일 주소. 없을 수 있습니다 | |
| reg_date | datetime2 | 가입한 때 |
열에 형식이 있다는 것이 파일과의 가장 큰 차이입니다. 숫자를 담기로 한 자리에 글자를 넣으면 저장되지 않고 거부됩니다. 잘못된 값이 들어간 뒤에 찾아내는 것보다 들어가지 못하게 막는 편이 훨씬 쌉니다.
SQL 은 무엇을 하는 말인가
SQL(Structured Query Language)은 데이터베이스에 시키는 말입니다. 어떻게 찾을지가 아니라 무엇을 원하는지를 적으면, 실제로 어느 순서로 읽을지는 데이터베이스가 정합니다.
아래는 회원 테이블에서 번호가 5 이하인 사람을 번호 순으로 보는 문장입니다. 1.2 를 마치면 여러분의 화면에서도 같은 결과가 나옵니다.
SELECT num, user_id, nickname, email FROM Member.USERS WHERE num <= 5 ORDER BY num;
| num | user_id | nickname | |
|---|---|---|---|
| 1 | hong | 홍길동 | hong@example.com |
| 2 | kim | 김철수 | kim@example.com |
| 3 | lee | 이영희 | lee@example.com |
| 4 | park | 박민수 | park@example.com |
| 5 | choi | 최지우 | NULL |
이 트랙의 예제는 브라우저가 아니라 여러분의 SQL Server 에서 돌립니다.
네 줄이 각각 하는 일이 있습니다. 지금은 이름만 익혀 두고, 각각은 1.5 부터 하나씩 다룹니다.
| 절 | 하는 일 |
|---|---|
| SELECT | 어느 열을 낼지 정합니다 |
| FROM | 어느 테이블에서 가져올지 정합니다 |
| WHERE | 어느 행만 남길지 거릅니다 |
| ORDER BY | 어떤 차례로 낼지 정합니다 |
다섯 번째 회원의 전자 메일 자리에 NULL 이 있습니다. 빈 문자열이 아니라 값이 없다는 뜻이고, 다루는 방법이 따로 있어 1.9 에서 한 단원을 들여 살펴봅니다.
테이블이 여럿일 때 — 관계
회원과 글을 한 테이블에 담으면 글을 작성할 때마다 작성자의 이름과 전자 메일을 함께 적게 됩니다. 그 사람이 이름을 바꾸면 그가 작성한 글을 모두 찾아 고쳐야 하고, 하나라도 빠뜨리면 같은 사람이 두 이름으로 남습니다.
그래서 테이블을 나누고 번호로 가리킵니다. 글 테이블에는 작성자의 이름 대신 회원 번호만 담고, 이름이 필요할 때 회원 테이블에서 가져옵니다. 이렇게 가리키는 관계를 외래 키라 하고, 두 테이블을 이어 한 결과로 내는 일을 조인이라 합니다(2.1).
1.2 에서 만드는 실습 데이터베이스는 테이블 여섯 개로 이루어져 있습니다.
| 테이블 | 담는 것 |
|---|---|
| Member.USERS | 회원 |
| Board.BOARDS | 게시판 |
| Board.CATEGORIES | 말머리 |
| Board.POSTS | 글 |
| Board.COMMENTS | 댓글 |
| Board.FILES | 첨부 |
이름 앞의 Member·Board 는 스키마입니다. 테이블을 영역별로 묶는 이름이고, 3.8 에서 다룹니다.
SQL Server 와 다른 데이터베이스
관계형 데이터베이스는 여럿이고 SQL 의 뼈대는 표준으로 정해져 있습니다.
SELECT·FROM·WHERE
는 어디서나 같으므로, 하나를 익히면 다른 것으로 옮겨 갈 때 처음부터 배우지 않아도 됩니다.
다만 표준은 조회와 변경에 관한 부분만 정합니다. 변수를 두거나 조건에 따라 다른 문장을 실행하는 것처럼 절차를 적는 문법은 제품마다 따로 만들었고, 표준 안의 기능에도 제품이 더한 것이 있습니다. SQL Server 의 것을 T-SQL(Transact-SQL)이라 부르고, 이 트랙의 4부가 그것을 다룹니다.
| 제품 | 확장 문법 | 비고 |
|---|---|---|
| SQL Server | T-SQL | 이 트랙이 다루는 것입니다 |
| Oracle | PL/SQL | 대규모 기간계에서 많이 사용합니다 |
| MySQL · MariaDB | — | 웹 서비스에서 널리 사용합니다 |
| PostgreSQL | PL/pgSQL | 표준을 비교적 가깝게 따릅니다 |
| SQLite | — | 파일 하나로 동작합니다. 서버가 없습니다 |
이름이 달라도 하는 일은 비슷합니다. 한쪽을 익히면 다른 쪽의 문서를 읽을 때 무엇을 찾아야 하는지 알게 됩니다.
어느 판을 설치해야 하나
SQL Server 는 판(에디션)이 나뉘고 값과 제한이 다릅니다.
| 판 | 값 | 쓰임 |
|---|---|---|
| Express | 무료 | 데이터베이스 하나에 10GB 까지. 작은 서비스를 실제로 돌릴 수 있습니다 |
| Developer | 무료 | 기능은 Enterprise 와 같지만 개발·테스트 용도로만 허용됩니다 |
| Standard · Enterprise | 유료 | 운영 서버용입니다 |
배우는 동안에는 무료인 Express 로 충분한데, 여기서 한 단계 더 가볍게 할 수 있습니다. Express 에는 LocalDB 라는 실행 방식이 있습니다. 같은 엔진을 사용하지만 서비스로 늘 떠 있지 않고, 연결할 때 켜졌다가 사용하지 않으면 꺼집니다.
Express 서버를 설치하지 않고 LocalDB 만 따로 설치할 수 있습니다. 개발 장비에 두기에 알맞아 이 트랙이 사용하며, 설치 방법은 1.2 에서 다룹니다.
이 트랙의 예제는 SQL Server 2019 이상을 기준으로 합니다. 그보다 낮은 판에서는 일부 문법이 동작하지 않습니다. 설치한 것의 판과 버전은 아래 문장으로 확인합니다.
SELECT SERVERPROPERTY('ProductVersion') AS ver, SERVERPROPERTY('Edition') AS edition;
직접 해보기
도서관의 대출 기록을 담는다고 할 때 어떤 테이블이 필요할지, 각 테이블에 어떤 열이 들어갈지 적어 보세요. 한 테이블에 다 담지 않는 까닭도 함께 생각해 보십시오.
아래 문장이 무엇을 가져오는지 한국어로 풀어 적어 보세요.
SELECT nickname FROM Member.USERS WHERE email IS NULL;
- 관계형 데이터베이스는 데이터를 테이블로 담습니다. 세로가 열, 가로가 행입니다.
- 열마다 형식이 정해져 있어 맞지 않는 값은 저장되지 않습니다.
- 같은 값이 되풀이되지 않도록 테이블을 나누고 번호로 가리킵니다. 이어서 볼 때는 조인을 사용합니다.
- SQL 은 무엇을 원하는지 적는 말입니다. 어떻게 찾을지는 데이터베이스가 정합니다.
- SQL Server 가 표준에 더한 문법을 T-SQL 이라 하고, 배울 때는 무료인 LocalDB 로 충분합니다.