Offcanvas

개발자 / 데이터센터 / 빅데이터 | 애널리틱스 / 서버 / 애플리케이션

데이터베이스의 언어··· SQL이란 무엇인가

2017.08.31 Martin Heller  |  InfoWorld


이번 예제의 짧은 버전은 아주 간단하다. 관계에서 사용하려는 모든 테이블에는 기본 키 제약을 가지고 있어야 한다. 한 개의 필드이거나 표현식으로 정의된 여러 필드들의 조합일 수 있다. 예를 들면:

CREATE TABLE Persons (
PersonID int NOT NULL PRIMARY KEY,
PersonName char(80),
...

Persons와 관계를 맺어야 하는 모든 테이블은 Persons 기본 키에 상응하는 필드를 가지고 있어하며, 관계형 무결성을 보존하기 위해서는 해당 필드가 외래 키 제약을 가지고 있어야 한다. 예를 들자면:

CREATE TABLE Orders (
OrderID int NOT NULL PRIMARY KEY,
...
PersonID int FOREIGN KEY REFERENCES Persons(PersonID)
);

CONSTRAINT 키워드를 사용하는 두 가지 문에 대한 긴 버전도 있으며, 여기서는 사용자가 제약에 이름을 붙일 수 있다. 대부분의 데이터베이스 설계 도구들이 생성하는 것이 이것이다.

기본 키는 늘 인덱스되며 유일하다(Unique). 즉, 필드 값은 중복될 수 없다. 다른 필드들에 대한 인덱스는 옵션이다. 외래 키 필드 그리고 쓰기 작업과 업데이트로 인한 잠재적 오버헤드 때문에 능 그런 것은 아니지만, WHERE와 ORDER BY 절에 나타나는 필드에 대한 인덱스를 생성하는 것이 유용한 경우기 많다.

독자들이라면 John Doe가 주문한 모든 것을 되돌려주는 쿼리를 어떻게 작성할 것인가?

SELECT PersonName, OrderID FROM Persons
INNER JOIN Orders ON Persons.PersonID = Orders.PersonID
WHERE PersonName ="John Doe";

실제로, 네 가지 종류의 JOIN이 있다: INNER, OUTER, LEFT, 그리고 RIGHT. INNER JOIN이 기본이며(INNER라는 단어는 생략할 수 있다), 두 개의 테이블 모두에서 일치하는 값을 포함하고 있는 행들만을 포함하고 있기도 하다. 주문 여부와 관계없이 사람들(Persons)을 나열하고 싶었다면, 다음 예와 같이 LEFT JOIN을 사용했을 것이다:

SELECT PersonName, OrderID FROM Persons
LEFT JOIN Orders ON Persons.PersonID = Orders.PersonID
ORDER BY PersonName;

두 개 이상의 테이블을 결합(Join)하는 쿼리 실행을 시작하거나, 표현식을 사용 또는 강제 데이터 타입을 사용하려 할 때, 처음에는 이 구문이 조금 아슬아슬해 보일 수 있다. 다행히도, 대개 스키마 다이어그램에서 쿼리 다이어그램으로 테이블과 필드를 끌어다 놓음으로써, 정확한 SQL 쿼리를 생성할 수 있는 데이터베이스 개발 도구들이 있다.

저장 프로시저
때로는 SELECT 문의 선언적 속성이 사용자의 의도대로 이루어지지 않는다. 대부분의 데이터베이스는 저장 프로시저라는 기능을 가지고 있다. 불행하게도 거의 모든 데이터베이스들이 ANSI/ISO SQL 표준에 대한 고유의 확장 기능을 사용하고 있는 영역이기도 하다.

SQL 서버에서, 저장 프로시저 (또는 저장 프록(stored proc))에 대한 초기 다이얼렉트(Dialect, 방언)는 트랜잭트(Transact)-SQL 일명 T-SQL이었다. 오라클에서는 PL-SQL이다. 두 가지 데이터베이스는 저장 프로시저용으로 C#, 자바 그리고 R 같은 추가 언어를 더했다. 간단한 T-SQL 저장 프로시저는 단지 SELECT 문의 매개변수와 버전일 수도 있다. 이것의 장점은 사용의 편의성 그리고 효율성이다. 저장 프로시저는 실행될 때마다가 아니라 저장될 때 최적화된다.

좀 더 복잡한 T-SQL 저장 프로시저는 여러 개의 SQL 문, 입출력 매개변수, 지역 변수, BEGIN…END 블록, IF…THEN…ELSE 조건문, 커서 (세트에 대한 행 단위 처리), 표현식, 임시 테이블, 그리고 다른 절차형 언어의 모든 것을 사용할 수 있다. 저장 프로시저 언어가 C#, 자바 또는 R 인 경우, 해당 절차형 언어의 함수와 구문을 사용할 것이 분명하다. 즉, SQL을 사용하는 동기가 표준화된 선언적 쿼리를 사용하기 위한 것이라는 사실에도 불구하고, 현실 세계에서는 특정 데이터베이스 관련 절차형 서버 프로그래밍을 많이 볼 수 있다.

그렇다고 이런 현실이 우리를 코다실 데이터베이스 프로그래밍의 나빴던 과거로 되돌려 놓지는 않겠지만(비록 커서는 거의 그렇지만), SQL 문들을 표준화하고 성능에 대한 우려는 데이터베이스 쿼리 최적화기에 맡겨두는 것이 옳다는 생각이 들게는 한다. 다 따지고 보면, 성능을 두 배로 늘리는 것이 남겨놓은 문제가 너무 많다.  editor@itworld.co.kr

CIO Korea 뉴스레터 및 IT 트랜드 보고서 무료 구독하기
추천 테크라이브러리

회사명:한국IDG 제호: CIO Korea 주소 : 서울시 중구 세종대로 23, 4층 우)04512
등록번호 : 서울 아01641 등록발행일자 : 2011년 05월 27일

발행인 : 박형미 편집인 : 천신응 청소년보호책임자 : 한정규
사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.