코드프레소 백엔드 개발자 양성 과정
구조화 질의어
흔히 SQL이라고 불리는 구조화 질의어가 무엇인지 알아보고 간단한 예제를 풀어보도록 하자.
구조화 질의어
SQL 혹은 구조화 질의어는 데이터베이스 내에서 데이터를 관리하기 위한 프로그래밍 언어이다. SQL은 우리가 흔히 접할 수 있는 다른 개발용 언어와는 달리 1987년에 국제표준화기구에 의해 데이터베이스를 관리하는 데 하나의 범국가적 기준으로 채택되었다.
SQL과 관계형 데이터베이스의 등장 이전에는 코다실 (CODASYL: Conference on Data Systems Languages, 데이터 시스템 언어 회의) 네트워크 모델이라고도 불리는 그물형 데이터베이스에서, 집합이라는 단위에 담긴 기록을 탐색하여 자료를 조회했다. 그물형 데이터베이스에서는 아래와 같이 집합을 이루는 ‘오너 레코드’와 ‘멤버 레코드’라는 구성 요소 사이에서 순환을 하며 정보를 불러왔다.
위 방식은 순환문을 사용해 얼핏 보면 프로그래밍 측면에서 비효율적으로 보일 수도 있으나, 코다실 데이터베이스에서 이 방식으로 정보를 조회하는 것이 표 모양의 관계형 데이터베이스에서 SQL로 조회하는 것보다 약 절반의 CPU 시간과 메모리를 사용한다. 다시 말해, SQL을 표준으로 채택하면서 우리는 연산 처리 시간과 여유분의 메모리를 포기한 것이다.
그렇다면 어떤 이유에서 SQL이 데이터베이스의 공용어가 될 수 있었던 걸까? SQL이 어떤 장점을 지녔기에 CPU 시간과 메모리를 모두 포기하면서까지 이를 도입한 것일까?
첫 번째 이유로는 무어의 법칙을 꼽을 수 있다. 무어의 법칙은 인텔의 공동설립자 고든 무어가 내놓은 가설로, 2년마다 컴퓨터의 집적 회로에 들어가는 반도체 트랜지스터의 개수가 두 배가 된다는 이론이다. 즉, 2년마다 성능이 두 배가 된다는 뜻이다. 비록 더 이상 사실이 아닌 것으로 관찰되고 있으나, SQL이 표준으로 자리매김하던 1980년대에는 기술의 동향이 법칙의 내용과 흡사하여, 사람들이 점점 처리 시간과 메모리에 연연하지 않게 되었다고 한다.
발전된 하드웨어 덕분에 메모리와 처리 속도가 관건이 아니라면, SQL이 코다실 데이터베이스를 순환문으로 훑는 방식보다 확연히 월등한 점이 있다. 바로 두 번째 이유인 용이성과 개발 편이성이다. SQL은 프로그래밍 언어 중 자연어(영어)와 가장 닮아 문법과 표현이 직관적이며, 그로 인해 개발 시간을 단축하고 관련 인력 양성 비용과 시간을 절감할 수 있다는 점에서 인기가 높았다. 이 점은 아래 예제를 보며 체감할 수 있다.
SELECT
기본적인 정보 처리 기능 네 가지 생성, 검색, 갱신, 삭제 중, 검색 기능부터 알아보도록 한다. 정보 조회를 위한 SQL의 명령문은 SELECT
이며, 표 모양의 데이터베이스에서 열 기준으로 정보를 검색한다. 문법은 다음과 같다.
SELECT column_1, column_2, ...
FROM table_name;
예를 들어, 이름이 city인, 아래와 같이 생긴 데이터베이스에서 세계 각국의 도시명과 인구수만 조회하고자 한다면 다음과 같은 명령문을 입력하면 된다.
SELECT Name, Population
FROM City;
이렇게 명령하면 조회하고자 했던 정보만 표시됨을 확인할 수 있다.
조회 조건을 좀 더 까다롭게 하여 더 정밀한 검색을 구현해보도록 한다. 국가 코드가 네덜란드(NLD)거나 아이티(HTI)인 도시를 인구 기준으로 내림차순으로 정렬하여 도시명, 국가코드, 인구수만 검색해보겠다.
SELECT Name, CountryCode, Population
FROM City
WHERE CountryCode='NLD' OR CountryCode='HTI'
ORDER BY Population DESC;
우선 SELECT
명령 바로 뒤에 찾고자 하는 열의 이름을 나열한 후, WHERE
절을 사용해 행 단위로 걸러낼 기준을 적용해준다. 여기서는 CountryCode 열의 값이 NLD이거나 HTI인 행만 추출하는 조건을 부여해준 것이다. 자연어에서 ‘이거나’에 해당하는 조건은 직관적으로 OR
로 표현되어 두 조건을 이어준다. 정렬은 ORDER BY
문을 적용한 후, DESC
키워드로 맺어줌으로써 큰 인구수에서부터 작은 인구수로 내려가며 나열하도록 설정해준다.
앞서 말했듯, SQL의 표현과 문법은 매우 직관적이고 쉬워 언어 자체를 습득하는 데에 적은 시간과 노력이 소요된다. 조회를 할 때는 물론 SELECT
를 사용해야 하지만 이 외에 사용했던 FROM
, WHERE
, AND
, OR
따위는 다른 기능을 수행하는 명령문과 같이 사용할 수도 있다.
INSERT
생성, 검색, 갱신, 삭제 중 데이터 생성에 해당되는 SQL 명령문은 INSERT
로 표현한다. 이 또한 문자 그대로 표 형태를 한 데이터베이스에 자료를 삽입하겠다는 뜻으로, 다음과 같이 작동한다.
INSERT INTO table_name (column_1, column_2, column_3, ...)
VALUES (value_1, value_2, value_3, ...);
값 1, 값 2, 값 3의 값들을 이름이 어떠한 표에서 대응하는 열 1, 열 2, 열 3에 각각 삽입하라는 명령이다. 마찬가지로 매우 직관적이다.
예제로 보았던 세계 도시 데이터베이스에 이름은 Blackacre이며, 국가코드는 RRT이고, 지역명은 Northern Ruritania이며, 인구는 1,894명인 가상의 도시를 추가해보겠다.
우선 복습도 할 겸 앞서 배운 SELECT
문을 이용해 실제로 그런 도시가 있는지 확인한다.
SELECT * -- *은 모든 열을 조회
FROM City
WHERE CountryCode='RRT';
자료가 없다. 그러므로 데이터베이스에 추가해보도록 한다.
INSERT INTO City (ID, Name, CountryCode, District, Population)
VALUES ('1001', 'Blackacre', 'RRT', 'Northern Ruritania', '1894');
삽입한 후 데이터베이스에서 다시 국가코드가 RRT인 도시를 조회한 결과, 성공적으로 추가되었음을 확인할 수 있다.
UPDATE
시간이 흘러 Blackacre시의 이름이 Whiteacre로, 국가코드는 SMV로, 지역은 Western Samavia로 변경되고, 인구는 천 배인 1,894,000명으로 늘었다고 가정한다. 이번에는 갱신 기능을 통해 데이터를 변경해보겠다.
UPDATE table_name
SET column_1 = value_1, column_2 = value_2, ...
WHERE condition;
위 형태를 따라 UPDATE
명령어 뒤에 데이터베이스 이름을 입력하고, SET
뒤에 갱신할 열 1의 이름과 새 값 1을, 열 2의 이름과 새 값 2를 넣어준다. 또한 WHERE
절을 이용해 갱신하고자 하는 자료를 꼭 세밀하게 지정해준다. 정보를 실수로 잘못 덮어씌웠다간 데이터베이스의 무결성을 심각하게 훼손할 수 있기 때문이다. 실수가 없도록 우선 SELECT
문을 이용해 갱신하고자 하는 행만 호출되는지 확인해보는 것도 좋은 접근법이다.
UPDATE City
SET Name = 'Whiteacre', CountryCode = 'SMV', District = 'Western Samavia', Population = 1894000
WHERE ID = '1001';
WHERE
문으로 한 행만 정밀하게 가려내고자 한다면 행마다 고유한 값으로 그 행을 식별해주어야 한다. 예제의 데이터베이스에서는 각 도시마다 ID값이 달라 WHERE
절에 이로 가려내도록 하였다.
그 결과 명령대로 정확히 갱신되었음을 확인할 수 있다.
DELETE
마지막으로 데이터 처리의 네 번째 요소인 삭제에 대해 알아보겠다. 삭제는 갱신과 마찬가지로 서비스 운영과 데이터베이스 무결성에 치명적이라, 실무에선 사용할 일이 거의 없을 뿐더러, 사용하더라도 재차 확인과 백업이 이루어진 후에야 실행할 수 있는 기능이다.
DELETE FROM table_name WHERE condition;
삭제인 만큼 DELETE
문은 장황한 조건문이 붙을 이유는 없다. 단지 WHERE
절을 위와 같이 중복이 없는 값으로 자료를 정확하게 가려내기만 하면 된다. 이 또한 자연어와 닮아, 자연어로 지시하듯 작성하면 된다.
DELETE FROM City
WHERE ID = '1001';
City라는 표에서 ID가 1001인 자료를 삭제하라고 명령하였다. 가상 도시 Whiteacre가 사라졌음을 확인할 수 있다.
이렇게 SQL이 무엇인지, 어떻게 작동하며 어떤 특징을 지녔기에 국제 표준으로 자리잡을 수 있었는지 알아보았다.