데이터노트/데이터베이스

SQL(Structured Query Language)

Structured Query Language(SQL)는 우리말로 구조화된 질의 언어로 정의할 수 있습니다. SQL은 관계형 데이터베이스 관리 시스템(Relational Database Management System: RDBMS)에서 데이터 정의, 데이터 조작, 그리고 데이터 제어를 위해 사용하는 언어입니다. 영문 위키 페이지[관련링크]를 확인해보면, SQL의 표현을 '시큐얼' 또는 '에스큐엘'이라고 표현하고 있습니다. 시큐얼은 Structured English Query Language (SEQUEL)로 SQL의 최초 이름이었습니다. 그러나 표준으로 정의된 이름이 SQL이기 때문에, '에스큐엘'로 발음하는 것이 좋을 것 같습니다[각주:1]



SQL 역사


SQL의 초기 모델은 SEQUEL은 1970년대 초반 System R 프로젝트에 참여한 Donald D. Chamberlin and Raymond F. Boyce에 의해 개발되었습니다. 이후, 지속적인 발전을 걸쳐 SQL로 이름을 바꿔 현재에 이르게 되었습니다. 최근 시중에 출시된 대부분의 DBMS에서 SQL을 지원하고 있으며, 누가 뭐라고 해도 SQL은 표준 관계형 데이터베이스 언어로 자리잡고 있습니다. 


SQL은 American National Standard Institute(ANSI)와 International Organization for Standardization (ISO)의 두 단체에서 1986년에 표준화하였습니다. 이때, 표준화되어 발표된 것이 SQL-86입니다. 이후, 1989년에 기존 표준을 확장한 SQL-89(Minor Version)를 발표했습니다. SQL-89 이후 발표된 표준이 SQL-92(Major Version)[관련링크]으로 대부분의 상용 DBMS이 SQL-92를 지원하고 있습니다. 이후 지속적인 발전으로 SQL:1999[관련링크], SQL:2003[관련링크], SQL:2006 등이 발표되었으며 가장 최근에 발표된 표준은 SQL:2008[관련링크]입니다.



SQL 구성요소


몇 년전만 하더라도 SQL은 데이터 정의어, 데이터 조작어, 데이터 제어어로 구성된다고 한 문헌이 많이 있었습니다. 그러나 최근의 자료를 살펴보면 데이터 제어어가 제외된 자료가 많이 있음을 확인할 수 있습니다. 데이터베이스 개론서의 바이블로 꼽히는 A. Silberschatz, H.F. Korth, and S.Sudarshan의 <Database System Concepts>의 최신판[각주:2]에서도 데이터 제어어가 제외된 것을 확인할 수 있습니다. 기존 데이터 제어어의 정의를 살펴보면, "데이터의 보안, 무결성, 데이터 회복, 병행 수행 제어 등을 정의하는 데 사용하는 언어" 라고 설명하고 있습니다. 제가 생각하기에는 데이터베이스의 기능이 확장됨에 따라 데이터 제어어가 더 세분화되어 나뉜 것 같습니다. 


본 단락에서 소개하는 SQL 구성요소는 <Database System Concepts 6E>에서 소개하는 내용으로 정리하겠습니다. 본 문서에서 이에 대한 자세한 내용을 모두 소개할 수 없기 때문에, 자세한 내용은 <Database System Concepts>의 내용을 살펴보시기 바랍니다.


데이터 정의 언어(Data Definition Language: DDL)

릴레이션 스키마를 정의하고, 릴레이션을 삭제하고, 릴레이션 스키마를 수정하는 명령어를 제공합니다. DDL에 속하는 명령으로는 'CREATE', 'ALTER', 'DROP', 'TRUNCATE' 가 있습니다.


데이터 조작 언어(Data Manipulation Language: DML)

데이터베이스에 정보를 질의하고, 튜플(Tuple)을 삽입, 삭제, 수정하는 기능을 제공합니다. DML에 속하는 명령어로는 'SELECT'[각주:3], 'INSERT', 'UPDATE', 'DELETE', 그리고 최근에 많이 활용되는 'MERGE' 가 있습니다.


기타 구성요소

- 무결성(Integrity)

- 뷰 정의(View Definition)

- 트랜잭션 제어(Transaction Control)

- 내장 SQL(Embedded SQL) & 동적 SQL(Dynamic SQL)

- 인증(Authorization)



SQL 작성방법


SQL을 접해보신 다른 언어에 비해 어렵지 않다고 느끼신 분들이 많을 것으로 생각됩니다. 실제로 언어에 감각이 있으신 분들은 일주일 안에 모든 문법적인 요소를 익힐 수 있을 것입니다. 그렇지만, SQL을 익히는 것과 효율적으로 사용하는 것은 완전히 다른 문제입니다. SQL을 효율적으로 사용할 수 있는 능력을 갖췄다면, 전체적인 응용 프로그램의 성능을 획기적으로 개선할 수 있습니다. 이런 이유로, 본 단락에서는 SQL을 효과적으로 작성하는 방법에 대해 소개합니다.


본 절에서 소개하는 SQL 작성방법은 엔코아[관련링크]의 대표이사님으로 재직중이신 이화식 대표님[관련링크]께서 집필하신 <대용량 데이터베이스 솔루션Ⅱ>에서 작성하신 글입니다. 이 내용을 본 블로그에 그대로 옮기는 것이 큰 실례임을 알고 있습니다만, 많은 분들께 이 내용을 꼭 소개하고 싶어 첨부하게 되었습니다. 이뿐만 아니라, 개인적으로 <대용량 데이터베이스 솔루션>시리즈는 데이터베이스 분야의 바이블이기 때문에 데이터베이스에 관심이 많으신 분들은 꼭 한번 읽어보셨으면 좋겠습니다.


여러분들께서는 다음 글을 읽으신 후 어떤 느낌을 받으실지 모르겠습니다만, 제게는 주옥(珠玉)같은 메시지였습니다.

1. 어떻게 처리할 것인지를 먼저 생각하지 말고 무엇을 할 것인지를 먼저 파악하라.
2. 그러한 결과 값을 얻기 위해 어떤 집합이 필요한지를 찾아라.
3. 필요한 집합이 논리적으로 가능한지를 확인한다. 그러나 그 집합을 구체적으로 어떻게 생성할 것인지는 아직 생각하지 마라. 구체적인 생성 방법은 나중에 해도 충분하다.
4. 원하는 집합이 생성 가능하다면 그 전체 집합을 마치 하나의 테이블로 간주하라. 다시 말하면 원하는 집합을 테이블에 넣었다고 생각하라. 그러면 지금부터는 하나의 테이블에 있는 정보를 가공 처리하는 단순한 형태가 된다.
5. 추출되어야 할 결과 집합의 로우 단위를 명확히 해라. 즉, 어떤 단위로 중분류를 해야 하는가(Group by)를 결정하라.
6. 한 레코드씩 추출될 추출 단위(중분류)별로 내부에 속한 실제 로우들의 가공 처리 방법을 결정한다. 각각의 레코드마다 여러 개의 실제 로우가 모여서 한 레코드가 되는 것이므로 여러 개의 실제 로우를 경우에 따라 어떤 방법으로 가공시키라는 것은 곧 SUM(Decode(xxxx))문에서 'xxxx'로 표시된 부분에 각 로우마다 해당되는 경우의 수를 처리하는 것이다.
7. 추출한 항목이 완성되었으면 남겨 두었던 전체 집합을 구할 방법을 구체적으로 생각한다. 조인이나 UNION 등을 활용하되 액세스 경로의 양호한 정도를 감안한다.
8. SQL을 수행시켜 가면서 약간의 보정을 통해 결론에 도달한다. 이때 수행 속도에 대한 대비책도 같이 테스트 해야 한다.


- 대용량 데이터베이스 솔루션 II의 1장 89페이지 중에서


위 내용을 하나씩 음미해보면, 세상을 살아가는 이치와 닮아있음을 알 수 있습니다. 갑자기 철학적인 내용이 나와서 당황하신 분들도 계실 것 같습니다. 세상을 살아가면서 어떤 문제에 부딪혔을 때, 그것을 해결하는 방법은 매우 다양합니다. 또한, 명확한 답(해결책)이 있을 수도 있지만, 그렇지 않은 상황을 만날 수도 있습니다.


저는 상황에 따라 다르지만 어떤 문제에 봉착했을 때, 일반적으로 쉬운 해결 방법을 찾았습니다. 그런데 연구활동을 하면서 이 방법이 옳은(?) 방법이 아니란 것을 깨달았습니다. 쉬운 방법보다는 문제의 원인을 찾는 것이 가장 중요합니다. 그다음에는 최적의 해결 방법을 찾는 것이죠. 이처럼 어떤 문제들을 차근차근 분석해가면, 앞에서 언급했던 명확한 답이 없는 경우에도 그 문제를 해결할 수 있는 능력이 자연스럽게 길러지게 됩니다.


<대용량 데이터베이스 솔루션>을 처음 읽었을 때는 이런 깨달음을 얻지 못했는데, 최근에 다시 이 책을 읽었을 때 이 대표님께서 전달하고자 하는 메시지를 명확히 이해할 수 있었습니다. 그동안 연구활동을 하면서 축적된 경험과 지식으로 얻게 된 것이겠죠. 저도 조금은 발전한 것 같습니다. 예전에 이대표님의 메시지를 빨리 이해했으면, 현재의 제 모습이 한층 더 발전하지 않았을까? 란 생각을 해보게 되는군요.



SQL 학습방법


마지막 단락은 SQL 작성 능력을 향상하는 방법에 대해 작성하겠습니다. 이 방법도 앞의 SQL 작성방법에서 제안하신 엔코아의 이화식 대표님께서 언급하신 내용입니다.


1. 어려운 문제를 많이 풀어보라.
2. 원리와 기본에 충실하라.
3. 항상 SQL의 실행계획을 염두에 두라.


- 대용량 데이터베이스 솔루션 Ⅱ의 1장 125~126페이지 중에서


1번과 2번의 내용은 일반적인 수학의 학습 방법과 동일한 것 같습니다. 어려운 문제를 많이 풀어볼수록 응용력이 향상되고, 상황별 대처 능력이 향상되는 것은 당연한 진리니까요. 또한, 각각의 원리를 이해하면서 풀이하는 사람과 어떤 공식을 외워서 풀이하는 사람은 현재는 비슷할지라도 앞으로 그 차이는 엄청나게 벌어질 것입니다. 아무리 암기력이 뛰어난 사람이라도 이해를 한 사람보다 뛰어날 수 없을 것이기 때문입니다. 그 차이는 응용력에서 더 현격하게 차이가 날 것입니다.


문제는 3번입니다. SQL의 실행계획을 고려해서 문제를 풀이한다는 것이 생각처럼 간단하지 않습니다. 왜냐하면 데이터베이스의 구조를 명확히 이해해야 하며, 각 상황에 알맞은 방법을 찾아야하기 때문입니다. 이에 대한 내용은 앞으로 하나씩 알아보겠습니다.


SQL 학습에 도움을 주는 책을 한 권 소개하겠습니다. 이채남님의 <오라클 실습(전문가로 가는 지름길)>입니다. 오래 전에 출간된 책이기 때문에 시중에서 구하기가 쉽지 않을 것입니다. 실제로 절판이 되었습니다. 하지만 이 책의 내용을 확인하실 수 있습니다. 이 책에 대해 궁금하신 분은 링크를 방문해 보십시오. 그렇지만 이 책을 한번 보시면 SQL을 작성할 때, 많은 도움과 응용력 등을 향상시킬 수 있을 것입니다.



마치면서


지금까지 SQL에 대해 간단하게 살펴봤습니다. 앞으로 자주 찾아뵐 수 있도록 노력하겠습니다. 행복한 하루 보내세요.



References


1. Silberschatz et al., Database System concepts, Mc Graw Hill

2. 이화식, 대용량 데이터베이스 솔루션Ⅰ, 엔코아

3. 이화식, 대용량 데이터베이스 솔루션Ⅱ, 엔코아

4. SQL 전문가 가이드, 한국데이터베이스진흥원


  1. 한국데이터베이스진흥원에서 출간한 SQL 전문가 가이드에서도 '에스큐엘'이라고 읽는 것을 권고하고 있습니다. [본문으로]
  2. 필자가 보유한 3판에서는 데이터 제어어라고 표현하고 있으나, 최근 6판에서는 데이터 제어어가 없어진 것을 확인할 수 있었습니다. [본문으로]
  3. SELECT를 DML이 아닌 별도로 구분하기도 합니다. [본문으로]