표준 SQL 및 데이터베이스 입문
이제 테이블설계를 들어가기 전에 SQL의 기본적인 작성법에 대해 알아봅시다. 실제로 시도하기 전에 이전 작성해본 SELECT문을 기억하십니까?
핵심은 SELECT문입니다. '질의(query)' 또는 '쿼리'라고도 하며, 데이터를 추출하는 작업에 사용되는 문장입니다. 이외에도 테이블 생성, 데이터 추가 및 삭제등 여러 작업이 있으며, 질의에도 훨신 다양한 변형이 있습니다. 즉, SQL은 SELECT문만 있는 것이 아니라는 것입니다. DBMS의 기능에서는 '데이터 조작기능'으로 묶었지만, 이 '데이터 조작'은 작업의 내용에 따라 '데이터조작', '데이터정의', '데이터제어'로 나눌 수 있습니다. SQL은 이 3가지를 모두 포괄하고 있습니다.
그렇다면 전부 기억해야 할까요?
우선은 이런 형태로 분류를 하고 있다는 사실만 인지하고 있으면 나중에 사용법을 찾아보거나 할 때 도움이 됩니다. 대략적으로 살펴봅시다.
데이터베이스 조작 언어에는 데이터 조작 언어(Data Manipulation Language, DML), 데이터 정의 언어(Data Definition Language, DDL), 데이터 제어 언어(Data Control Language, DCL)이라는 3가지 종류가 있습니다.
DML(데이터 조작 언어): 질의나 데이터 업데이트를 수행하기 위한 언어로 SQL엣거는 처음 본 SELECT와 INSERT, UPDATE, DELETE등이 해당합니다. SELECT는 때때로 '데이터질의 언어(Data Query Language, DQL)'로 분류되기도 합니다.
DDL(데이터 정의 언어): 테이블이나 뷰 정의를 담당하며, CREATE(생성), DROP(삭제), ALTER(정의변경 또는 추가)등의 명령어가 있습니다.
DCL(데이터 제어 언어): 사용자 권한을 관리하는 언어로 'GRANT(권한부여)'와 'REVOKE(권한취소)'등이 이에 해당합니다.
트랜잭션은 제어측면에서 DCL에 분류되거나, 데이토 조작을 수반한다는 측면에서 DML에 포함될 수 있으나, 일반적으로는 '트랜젝션 제어 언어(Transaction Control Language, TCL)'로 별도 분리됩니다. 또한 트랜잭션 제어 언어에는 'COMMIT(처리확정)'과 'ROLLBACK(처리취소)'등이 있습니다.
MySQL이나 Oracle과 같은 여러가지 데이터베이스 이름을 듣게 되는데, 이들 모두 관계형 데이터베이스인데 모두 같은 SQL을 쓸 수 있을까요?
사실 그렇지 않은 면도 있습니다. ISO(International Organization for Standardization, 국제표준기구)가 정한 표준 SQL이라는 것이 있지만, 어느 정도까지 지원하는지는 DBMS마다 다르고, 독자적인 기능이 추가되어 있는 경우도 있습니다.
물론 표준화된 내용에 따라서 개발해도 됩니다. 그러나, 표준화에는 시간이 걸리고, 용도에 따라 필요한 기능이 다를 수 있습니다. 또한, 표준화가 끝난 후에야 '이제 개발합시다'라고 하면 제때 대응하기 어려운 경우가 있습니다. 그리고 표준 SQL이라고 해도 여러가지 버전이 있습니다.
SQL도 발전하고 있기 때문에 기본적으로는 기능 확장이나 추가가 중심이지만, 비권장(deprecated)된 문법도 있기 때문에 비권장되는 방식은 가능한 피하는 것이 좋습니다.
관계형 데이터베이스는 1969년 Edgar Frank Codd(에드거 F.코드)가 고안한 관계모델(relational model)을 바탕으로 개발되었으며 현재도 수많은 제품이 출시되거나 공개되고 있습니다.
SQL의 최초 규격은 'SQL-86'으로 ANSI가 1986년에 제정했습니다. SQL-86에서는 표와 뷰의 정의, SELECT, INSERT, UPDATE, DELETE의 기본작업이 가능했습니다. 그 다음에 제정된 'SQL-89'에서는 CREATE TABLE이 추가되었습니다.
그 다음 주요 버전은 1992년에 제정된 'SQL-92'로 데이터타입의 확장과 CASE문의 추가등이 이루어졌습니다. SQL-92는 'SQL2라고도 불립니다. SQL-92는 Entry(초급), Intermediate(중급), Full(상급)이라는 3가지 수준으로 정해져 있으며, Entry클래스는 SQL-89와 동등하고 Intermediate클래스에서는 날짜/시간형과 도메인(DOMAIN)의 정의가, Full클래스는 ALTER문이나 어서션(ASSERTION)등의 구문이 추가되었습니다. DBMS가 'SQL-92 대응'이라고 주장하려면 Entry클래스 지원이 필요합니다.
세번째 주요버전은 'SQL:1999'(SQL-99, SQL3)로 이미지등의 데이터를 저장하기 위한 라지 오브젝트(Large Object)타입이나 배열타입등이 추가되었습니다. 또한 초급/중급/고급이라는 수준은 폐지하고 코어SQL(Core SQL)이라고 불리는 중심기능과 패키지 혹은 모듈이라고 불리는 확장기능으로 구성되게 되었습니다. 이후 "SQL:2003"에서는 XML용 확장과 윈도우 함수등이 추가되었고 이후에도 SQL:2011(시계열 데이터 처리 강화), SQL:2016(JSON지원), SQL:2023(SQL/PGQ, 그래프모델2용 확장)등의 새로운 버전재정이 진행됩니다.
우선 기본적인 기술규칙을 알아봅시다. 예를 들어, SELECT는 대소문자 상관없이 작성할 수 있는 규칙등이 있습니다. 이런 규칙들은 꼭 기억해 두어야 합니다.
① 각 단어는 공백 또는 개행으로 구분하고 문장끝에는 세미콜론(;)을 붙임
단어는 공백 또는 개행으로 구분하며, 문장 끝에는 세미콜론(;)을 붙입니다. 긴 문장의 경우, 적절히 개행을 넣으면 읽기 쉬워질 것입니다. 또한 행 머리에 공백을 넣어도 상관없습니다.
아래 예제들은 모두 동일한 내용을 나타냅니다. 여기서는 students테이블에 있는 student_id(학생ID)와 student_name(학생이름) 열을 표시하고 있습니다. WHERE절에서 지정한 branch에는 학생이 다니는 캠퍼스명이 표시됩니다. 예로 서초구, 종로구등의 문자열이 들어 있습니다. 이 예제는 examdb에서 실행할 수 있습니다.
② 키워드는 대문자 또는 소문자를 사용할 수 있음
'SELECT'나 'FROM'등 SQL문을 구성하는 단어들은 '키워드(keyword)'라고 부릅니다. 키워드는 대소ㅓ문자를 구분하지 않으므로, 예를 들어, 'SELECT', 'select', 'Select'는 모두 동일하게 취급됩니다. 필자는 이 강좌에서는 대문자로 통일합니다.
SQL키워드는 DBMS매뉴얼등에서 '예약어'라고 표현되는 경우가 있습니다. 표준 SQL에서는 키워드가 'SELECT', 'TABLE', 'AS'등과 같은 예약어(reserved word)와 'VIEW', 'ASC', 'DEC'등과 같은 비예약어(non-reserved word)로 구분되지만, 사용할 때에는 이 2가지 구분에 특별히 신경쓸 필요가 없습니다. SQL버전에 따라 동일한 단어가 예약어에서 비예약어로 변경되는 경우도 있습니다.
③ 테이블명이나 열명에는 영문자와 숫자, "_"를 사용함
표준 SQL에서는 테이블명이나 열명에 사용할 수 있는 문자로 영어 알파벳 외에도 다양한 언어의 문자와 숫자, 그리고 '_'(언더스코어)를 사용할 수 있다고 규정하고 있지만, 일부 DBMS에서는 영문자, 숫자, '_'로만 제한하는 경우도 있습니다. 따라서 안전을 위해서는 영문자와 숫자, '_'만 사용하는 것이 좋습니다.
테이블명의 대소문자 취급은 DBMS나 운영체제에 따라 다릅니다. 예를들어, MySQL 및 MariaDB에서는 대소문자 구분여부가 설정에 따라 달라지는데, 리눅스나 macOS에 설치한 경우 초기값은 '구분함'으로 되어 있으며 Windows환경에 설치하는 경우, '구분하지 않음'으로 되어 있습니다. PostgreSQL에서는 테이블명이 항상 소문자로 저장되며, SELECT문에서는 대소문자를 구분하지 않지만, 테이블명을 ' "~"(쌍따옴표)'로 깜사서 정의할 경우에는 설정 당시 문자열이 그대로 유지되며 대소문자를 구분하게 됩니다. 문제를 피하기 위해 '모두 소문자' 또는 '첫글자만 대문자'와 같이 DBMS 사양에 맞추어 일관되게 사용하는 것이 좋으며, 이 강좌에서는 모든 이름을 소문자로 통일합니다.
키워드는 테이블명이나 열명으로 사용할 수 없지만, 인용부호로 감싸면 사용할 수 있습니다. 이 경우, MySQL이나 MariaDB에서는 '`(백쿼트)'를, PostgreSQL에서는 '"(쌍따옴표)'를 사용하는등 DBMS마다 표기 방식이 다를 수 있으므로 사용중인 DBMS의 방식을 확인해야 합니다. 항상 인용부호를 붙이거나, 테이블명의 앞에 "t_"를 붙이는등 키워드와의 충돌을 피하고 해당식별자가 테이블임을 명확하게 나타내는 규칙을 정해 사용하는 방법도 있습니다.
④ 문자열과 날짜는 '~'(따옴표)로 묶음
입력이나 검색에 사용하는 문자열이나 날짜는 '~'(따옴표)로 감싸고, 숫자는 감싸지 않고 작성합니다.
students 테이블은 학생의 기본정보를 담고 있으며, branch(열)에는 학생이 다니는 캠퍼스명이 문자열로 저장되어 있습니다. exams 테이블은 시험성적을 관리하는 테이블로 score(열)에는 점수가 숫자로 저장되어 있습니다.
⑤ 주석은 '--'의 뒤 또는 '/*'와 '*/'사이에 쓰기
SQL문에 주석(comment)을 추가하고 싶은 경우, '--' 또는 '/* ~ */'를 사용합니다.
'--'의 경우, '--'라는 문자부터 행끝까지가 주석으로 처리됩니다. 참고로 MySQL과 MariaDB의 경우 '--'바로 뒤에 공백을 입력해야 합니다.
문장중간에 주석을 넣거나 여러 줄의 주석을 작성하고자 할 때는 '/* ~ */'를 사용합니다.
작성하는 방법은 좀 지나면 익숙해질 것입니다. DBMS와 같이 제공되는 명령줄 도구 실행결과와 오류메시지를 확인할 수 있으며 SQL문을 입력하여 결과를 확인할 수 있는 도구를 사용하면 에러가 발생한 부분도 체크그할 수 있습니다.
테이블명의 취급등이 조금 복잡하죠? 같은 DBMS를 계속 사용한다면, DBMS에 맞추면 되지만, 다른 환경으로 프로그램을 이식할 가능성이 있다면, 가능한 안전하게 최대한 규칙을 맞추는 것이 좋습니다. 예를 들어, 테이블명이나 열명은 영문자와 숫자만 사용하고 소문자로 통일하는 형태를 말합니다. 물론 한국어가 더 쉽게 이해되어 테이블명이나 열명을 한국어로 작성하는 경우도 있지만 DBMS가 대응한다고 해도 SQL문을 입력할 때 알파벳으로 통일하는 것이 입력하기에도 편리한 부분이 있어 소문자로 작성하는 방식을 추천합니다.
©2024-2025 GAEBAL AI, Hand-crafted & made with Damon JW Kim.
GAEBAL AI 개발사: https://gaebalai.com
AI 강의 및 개발, 컨설팅 문의: https://talk.naver.com/ct/w5umt5