데이터이야기

DB 노하우, 데이터직무, 다양한 인터뷰를 만나보세요.

간단한 SQL 퀴즈

데이터 이야기
작성자
dataonair
작성일
2014-10-17 00:00
조회
7086


간단한 SQL 퀴즈

SQL은 일단적인 3GL 언어처럼 순서를 기술하지 않더라도 원하는 집합을 기술하면 DBMS의 옵티마이저가 최적의 경로를 통해 결과 집합을 반환하게 됩니다. 이러한 특성으로 인해 SQL은 웃으면서 들어가서 울면서 나온다고 흔히 이야기합니다. 즉, 배우기는 쉬워도 숙달하기에는 좀처럼 쉽지 않습니다.

주변에서 어떻게 하면 SQL을 잘 짤 수 있냐는 질문을 많이 받습니다. 왕도는 없다고 봅니다. 영어회화처럼 많이 연습해보는 수 밖에 없습니다. 만약 자신이 개발자라면 SQL을 짤 기회가 많이 주어질 겁니다. 하지만 단순히 결과값을 내는 것에만 연연하다 보면 좀처럼 실력이 늘지 않습니다.

결론적으로 단순히 많이 짜는 행위뿐만 아니라 깊이 있는 사고가 필요하다고 볼 수 있습니다.

다음은 어떤 분이 게시판에 질문으로 올렸던 SQL입니다. 난이도로 치면 상당히 쉬운 편에 속하지만 워밍업 차원에서 한번 풀어보시기 바랍니다.

테이블 구조와 샘플 데이터는 다음과 같습니다(여기서 빨간색은 ‘G’값의 출현빈도입니다)



예제 보기
OUTCOME PROB G'값의 출현빈도
RRRRG 111 1
RRRGG 111 2
GRRRG 111 2
GRGRG 111 3
RRRRR 111 0
ARGRA 111 1
GGGGG 111 5





CREATE TABLE MYTEST

(

OUTCOME VARCHAR2(30 BYTE),

PROB NUMBER

);

INSERT INTO MYTEST (OUTCOME, PROB) VALUES ('RRRRG', 111);

INSERT INTO MYTEST (OUTCOME, PROB) VALUES ('RRRGG', 111);

INSERT INTO MYTEST (OUTCOME, PROB) VALUES ('GRRRG', 111);

INSERT INTO MYTEST (OUTCOME, PROB) VALUES ('GRGRG', 111);

INSERT INTO MYTEST (OUTCOME, PROB) VALUES ('RRRRR', 111);

INSERT INTO MYTEST (OUTCOME, PROB) VALUES ('ARGRA', 111);

INSERT INTO MYTEST (OUTCOME, PROB) VALUES ('GGGGG', 111);

COMMIT;

위와 같은 테이블 및 데이터가 존재할 때, OUTCOME 칼럼에서 ‘G’값이 출현한 빈도에 해당하는 데이터만 조회하고 싶다고 합니다.

만약 G값이 1회 출현하는 레코드를 조회하고자 한다면 다음과 같이 결과가 나와야 합니다.

RRRRG

ARGRA

1. 먼저 replace함수를 활용하여 출현빈도를 파악하는 방법을 생각해볼 수 있습니다.

replace함수의 용법은 다음과 같습니다.

replace(대상문자열, ‘찾으려는 문자열’, ‘대체하려는 문자열’)

참고: 만약 3번째 매개변수인 대체하려는 문자열을 생략하면 2번째 매개변수에 해당하는 값이 대상 문자열에서 제거됩니다.

replace함수를 적용한 결과는 다음과 같습니다.

select outcome, replace(outcome, 'G') from mytest

OUTCOME

REPLACE(OUTCOME,'G')

RRRRG

RRRR

RRRGG

RRR

GRRRG

RRR

GRGRG

RR

RRRRR

RRRRR

ARGRA

ARRA

GGGGG

 

위의 결과에서 첫 번째 원래 칼럼의 길이에서 Replace함수를 거친 후 ‘G’값이 제거된 칼럼의 길이를 빼주면 출현 빈도를 판단할 수 있습니다.

, 다음과 같습니다.

select outcome, replace(outcome, 'G'), nvl(length(outcome) - length(replace(outcome, 'G')), length(OUTCOME)) as "출현빈도" from mytest

OUTCOME

REPLACE(OUTCOME,'G')

출현빈도

RRRRG

RRRR

1

RRRGG

RRR

2

GRRRG

RRR

2

GRGRG

RR