여러분은 이제 SQL에 대한 감을 잡았으리라 생각합니다. 이제 좀더 깊이 있는 쿼리문을 작성해보도록 하겠습니다. 처음 부분은 집합적인 사고방식을 가지기 위한 쿼리문을 작성해보고 마지막부분 부터 쿼리의 성능에 대한 기본적인 사항들을 살펴보겠습니다. 이미 SELECT의 기본을 익혔으므로, 이제는 문제 해결능력을 길러야 할 때라고 생각합니다. 여러분이 이곳에 나온 문제를 스스로 해결할 수 있다면 여러분은 절대 초보가 아니라고 자신할 수 있습니다.
앞에서 언급했듯이 사용자는 DBMS에게 SQL로 원하는 정보가 무엇인지 요구하고, DBMS는 사용자에게 결과를 테이블 형태로 돌려줍니다. 일반적인 쿼리문은 테이블 형태로 표현되는 것을 알아야 합니다. 아마도 여러분은 아래의 IN_LINE VIEW를 사용해 함으로써 집합적인 사고방식을 가지게 될 것입니다.
* IE에서 소스 복사시 줄바꿈 안됨. MS-Word 등에 붙여 넣으세요. 줄바꿈 되는 브라우저: Chrome, Opera, Safari
첫 번째 쿼리문과 두번째 쿼리문은 성능과 결과가 같습니다. 그러나 FROM 절에 SELECT 문으로 질의를 한 결과도 하나의 테이블로 취급을 하는 것입니다. VIEW라는 것은 가상의 테이블로 질의의 결과를 하나의 테이블로 취급을 하는 것입니다. VIEW는 CREATE VIEW 문으로 만들수 있으며, 다음과 같이 사용합니다.
* IE에서 소스 복사시 줄바꿈 안됨. MS-Word 등에 붙여 넣으세요. 줄바꿈 되는 브라우저: Chrome, Opera, Safari
즉, VIEW는 사용자가 바라보는 하나의 관점으로 표현될 수가 있습니다. 종이에 구멍을 뚫어놓고 책의 인쇄면을 덮으면 구멍난 부분의 글 밖에 보이지 않을 것입니다. VIEW의 개념을 이렇게 보면 일반적으로는 무난합니다. 이렇게 CREATE VIEW를 사용하면 DBMS의 데이타 사전에는 SELECT문으로 기술한 것들이 기록되고(실행계획도 포함), 하나의 테이블로 취급을 합니다. 그러나 많은 사용자가 바라보는 관점을 모두 표현하는 것은 매우 어려운 일일 것입니다. 그래서 나온 것이 IN_LINE VIEW 입니다. IN_LINE VIEW는 질의를 하는 잠시동안만 FROM 절에서 테이블의 자격을 가지는 질의문의 결과를 말합니다. 즉, 앞의 첫번째 질의문에서 2 ~ 4 라인까지에 속한 SELECT * FROM EMP WHERE DEPTNO = 20 의 결과가 TABLE1이라는 별칭을 가지는 테이블이 되는 것입니다.
2 FROM (SELECT *
3 FROM EMP
4 WHERE DEPTNO = 20) TABLE1;
이러한 IN_LINE VIEW는 그 활용도가 매우 높습니다. 약간만 복잡해져도 기본적인 SELECT 문으로만 사용자가 원하는 정보가 무엇인지 나타내는 것은 매우 어렵습니다. 이제 IN_LINE VIEW와 다른 여러가지 요소를 응용하는 질의문을 작성해 보도록 하겠습니다.
다음은 필자가 데이타베이스를 시작하고 처음으로 가장 어려웠던 쿼리문입니다. 일반적으로집계함수를 사용하고, 또 다른 하나의 컬럼을 SELECT절에 명시해주면 반드시 GROUP BY 절을 사용해야 합니다. 이러한 집계함수와 GROUP BY 와의 관계에서 어떻게 또다른 컬럼을 출력해 낼수 있는가가 문제였습니다. 다음과 같은 쿼리는 쉽게 출력을 낼 수 있습니다.
* IE에서 소스 복사시 줄바꿈 안됨. MS-Word 등에 붙여 넣으세요. 줄바꿈 되는 브라우저: Chrome, Opera, Safari
그러나 이 쿼리에서 가장 많은 월급을 받는 사원의 사원번호까지 출력을 하려면 상당히 난감합니다. 그러나 우리는 앞서서 다루었던 IN_LINE VIEW를 활용하여 머리를 조금만 쓴다면 쉽게 원하는 정보를 출력할 수 있습니다. 이것을 깨우치신 분은 집합적인 사고방식을 가졌다고 보면 될 것입니다. 필자의 경우는 IN_LINE VIEW를 알고나서야 집합적인 사고방식이란 것이 무엇인가를 알았습니다. 여러분도 이것을 해보시기 전에 반드시 혼자 힘으로 해결하는 버릇을 들여야 할 것입니다. 여러분은 쿼리문을 잘 작성하는 것은 이렇게 출력이 제대로 나오는 것이라고 생각하면 큰 오산일 것입니다. 쿼리문은 사용자가 원하는 정보가 무엇인지 DBMS에게 알려주는 즉, DBMS와 통신을 하는 것입니다. 쿼리문을 작성한다는 것은 이러한 것과 어떤 실행경로를 통하여 원하는 정보를 가져오라는 것까지 내부적으로 포함하고 있다는 것을 염두해 주시기 바랍니다.
* IE에서 소스 복사시 줄바꿈 안됨. MS-Word 등에 붙여 넣으세요. 줄바꿈 되는 브라우저: Chrome, Opera, Safari
우리는 SELECT 기본부분에서 어떠한 절이 먼저 수행되는 가를 살펴보았습니다. 가장 먼저 수행되는 것은 FROM 절입니다. 그렇다면 FROM 절에서 테이블의 역할을 수행하는 SELECT 절부터 수행되겠지요.
이에 대한 구체적인 설명은 하지 않도록 하겠습니다. 그러나 DECODE 함수는 그 활용도가 매우높다는 것을 알아야 합니다. DECODE 함수를 이용하면 일반 어플리케이션에서 행할 수 있는 IF 처리를 할 수 있습니다. 그러므로 오라클에서 제공하는 함수와 DECODE 함수(물론 DECODE 함수도 오라클에서 제공합니다.)를 이용하면, 어플리케이션에서의 복잡한 처리를 하지 않아도 되는 것입니다. 물론 데이타를 데이타 처리에 특화된 소프트웨어인 DBMS에서 처리하지 않고 어플리케이션에서 처리한다는 것 자체가 보검으로 벼를 베고 있는 격이 되는 것입니다. 이 책은 SQL에 대한 책이 아니므로 DECODE의 자세한 설명은 생략하도록 하겠습니다. 구체적인 SQL은 다른 서적이나 웹문서 또는 메뉴얼을 참고하시기 바랍니다. 여기서는 하나의 예를 통해서 IF처리를 하는 것을 보여드리도록 하겠습니다. 꼭 분석해서 자기의 것으로 만드셔야 합니다.
* IE에서 소스 복사시 줄바꿈 안됨. MS-Word 등에 붙여 넣으세요. 줄바꿈 되는 브라우저: Chrome, Opera, Safari
일단 실습을 위한 테이블을 생성합니다. 이것은 VIEW와 UNION의 사용법을 알기위한 실습 예제입니다. 이 예제는 예전에 제가 어떤 분이 질문한 것을 답변을 달은 것인데, 일단은 성능에 대한 고려를 하지 않고 VIEW와 UNION의 사용을 익힌다는 것을 전제로 실습하시기 바랍니다.
* IE에서 소스 복사시 줄바꿈 안됨. MS-Word 등에 붙여 넣으세요. 줄바꿈 되는 브라우저: Chrome, Opera, Safari
이 쿼리는 CODE 값이 1, 2, P, Q 이렇게 4개의 값을 가지고 있는 테이블에서 같은월의 코드값에 1과 P가 같이 있으면 P에 있는 금액을, 2와 Q가 같이 있으면 Q에 있는 금액을 추려내고자 하는 쿼리입니다. P, Q 가 없는 월은 1, 2 코드의 금액을 가져 오는 것입니다. P, Q 코드가 있는 월에는 항상 1,2 코드가 있습니다. 1, 2 코드가 있다해서 P, Q코드가 항상 있는건 아닙니다.
* IE에서 소스 복사시 줄바꿈 안됨. MS-Word 등에 붙여 넣으세요. 줄바꿈 되는 브라우저: Chrome, Opera, Safari
이제 위의 쿼리문을 모두 이해하고 있다면 여려분은 쿼리문에 대해서 자신이 생기셨을 겁니다.