블로그 이미지
'무른모'란 부드럽다라는 뜻을 가진 '무르다'라는 말과 도구, 연장을 뜻하는 '연모'라는 순 우리말의 합성어로 소프트웨어를 말합니다. seanhigher

카테고리

분류 전체보기 (161)
Blog srart (16)
Dev Center (94)
Real Life (13)
Mac life (21)
Naver life (17)
Total657,251
Today60
Yesterday89
셀렉트문과 조건문을 통해 원하는 데이터를 뽑아내었다 할찌라도 원하는 데이터들이 뒤죽박죽으로 되어 있다면 사용을 하기가 매우 어려울 것이다. 데이터베이스를 사용하는 의미조차 찾기 어려워지는 것이다.



데이터들 정렬하기.
데이터를 정렬하는 방법은 매우 간단하다. 기본적인 셀렉트문을 사용한 후 마지막에 ORDER BY 구문을 사용해서 정렬 조건을 주면 된다.

SELECT last_name FROM employees ORDER BY last_name;
SELECT last_name, salary FROM employees WHERE salary > 10000 ORDER BY salary DESC;
SELECT last_name, salary FROM employees WHERE salary > 10000 ORDER BY last_name DESC, salary;

첫번째의 쿼리문은 이름을 가나다 순을 정렬해서 보여준다. ORDER BY 를 사용한 정렬에서, 정렬 형식을 지적해주지 않는다면 기본적으로 올림차순으로 정렬이 된다. 두번째 쿼리에서 처럼 급여가 10000 이상인 사람들을 급여가 높은 순으로 정렬을 하고 싶다면 ORDER BY 항목의 마지막에 'DESC' 를 추가하면 내림차순으로 정렬을 하는것이 가능하다. 세번째의 쿼리문같이 여러가지 항목으로 정렬을 하는것도 가능한데, 먼저 열거된 항목으로 정렬이 된 후, 그 안에서 정렬이 되는 형식을 따른다.



그룹별 검색을 위한 그룹함수.
이런 경우가 있다. 특정 부서에 있는 사람들의 평균이나, 총합을 구하고 싶을때, 각 그룹별로 구하고 싶을때. 많은 양의 데이터를 관리하게 될때, 이러한 요구는 충분히 많이 필요하게 될 것이다. 오라클에서는 이러한 부분들을 이미 함수로 만들어 준비해 두었다. 이전에 문자열로 변환하는 TO_CHAR(), 이나 숫자로 변환하는 TO_NUMBER() 도 하나의 함수이다. 함수를 사용하는데 있어서 주의해야 할것이 있는데, 그 함수가 그룹을 지원하는가에 대해서 생각해 보아야 한다는 것이다. 그룹별로 나뉘어진 데이터를 보고자 하는데, 그를 충족시키는 조건이 오지 않는다면 데이터베이스는 사용자의 의도대로 데이터를 보여주지 못할 것이다.

SELECT AVG(salary) FROM employees GROUP BY department_id;

부서별로 급여의 평균을 구하고자 한다면 위와 같은 쿼리문을 작성해서 사용할 수 있다. GROUP BY 는 그룹을 구분짓는 역할을 한다. 그룹별 구분을 짓는 GROUP BY 절을 사용할때는 SELECT 부분에는 그룹바이로 나뉘어진 항목이나, 그룹 함수를 사용한 항목만 표기하는 것이 가능하다. 위의 쿼리에서는 그룹함수 AVG() 가 사용되었기 때문에 아무런 문제 없이 출력이 가능하다. 위의 쿼리문에 추가할 수 있는 항목은, 또다른 그룹함수나, GROUP BY 항목으로 나뉘어져있는 department_id 외에는 올 수가 없다. 그룹 함수로 사용되는 또 다른 함수에는 항목의 총 합을 구하는 SUM() 함수, 항목내에서 가장 큰 값을 반환하는 MAX() 함수, 가장 작은 값을 반환하는 MIN() 함수가 있고, 그룹내에 포함되는 숫자를 알고 싶다면 COUNT() 함수를 사용하면 각 그룹에 몇개의 항목이 포함되어 있는지 알 수 있다.



그룹별 조건달기.
GROUP BY 절을 통해 각 그룹별 항목을 출력하는 것이 가능하다는 것을 알게 되었다. 일반적인 항목에 대해서는 WHERE 을 통해서 조건을 명시하는 것이 가능하였는데, 그룹을 조건으로 해야 할때도 WHERE 을 사용하는것이 가능할까? 가능할것 같기도 하지만, 실제론 그렇지 않다. 그룹별로 조건을 나누게 될때, 각 그룹안에 항목들을 구분지으며, 조건을 포함시킨다는 것은 실로 불가능하기 때문이다. 그래서 GROUP BY 를 통해 구분된 그룹에 조건을 추가하기 위해서는 HAVING 이라는 항목을 사용해야 한다.

SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING department_id > 30;

위의 쿼리문에서는 각 그룹별로 평균을 구하는데, 그 그룹 아이디가 30 보다 큰 그룹에 대해서만 평균을 구하는 것을 의미한다. 그룹을 구분짓는 조건에 대해서는 HAVIG 절을 사용했다는 것을 알 수 있다.



자주 사용되는 유용한 함수들.
오라클의 함수에는 그룹함수 이외에도 유용하게 쓰이는 함수들이 있다. 그리고 그 함수들은 중첩해서 사용하는 것이 가능하다. ROUND() 라는 함수는 자릿수를 제한하는 기능을 가진 함수인데, 평균을 구하는 AVG() 함수와 함께 사용하여 불필요한 소수점 이하의 자릿수를 줄이는 것이 가능하다.

SELECT department_id, ROUND(AVG(salary), 2) FROM employees GROUP BY department_id;

ROUND() 함수는 첫번째로 받은 인자를 두번째로 받은 수의 소수자릿수만큼만 표현을 해준다. 위에서 처럼 '2'를 입력했다면 소수 셋째자리에서 반올림하여 소수 둘째자리까지만 표현을 해주게 된다. 소수점을 표현하고 싶지 않다면 두번째 자리에 '0'을 입력하면 소수점 이하의 자리에서는 반올림이 이루어진다. 그리고 음수로 표현할 경우에는 10의자리 100의 자리로 점점 자릿수가 올라간다. 만일 '-2'를 입력한다면 10의 단위에서 반올림한 수가 출력되게 되는 것이다.

WIDTH_BUCKET() 함수는 네개의 인자값을 갖게 된다. 첫번째 인자는 입력한 값이 되고, 두번째와 세번째는 각각 최소값과, 최대값이 된다. 그리고 마지막은 최소값과 최대값 사이를 나누는 분할비가 된다. 이것은 일정한 등급을 분류할때 사용될 수 있다.

SELECT WIDTH_BUCKET(82, 0, 100, 10) FROM DUAL;

위와 같은 쿼리문을 실행한다면, '0'에서 '100' 까지를 10개의 단계로 나눈 후 입력값 '82'가 포함된 단계인 '9' 를 반환하게 된다.

NVL() 함수는 첫번째 값이 'NULL' 값을 가질 경우, 아무것도 표현하지 않는대신 다른 문자로 표현할 수 있도록 해준다.

SELECT commission_pct FROM employees;
SELECT NVL(commission_pct, 0) FROM employees;

첫번째 쿼리는 커미션이 없을 경우 없다는 의미의 '-'를 출력하지만, 두번째는 '-' 대신에 '0'이라는 숫자를 출력해준다. 주의해야할 점은 'NULL' 값을 대신하는 것은 그 데이터 타입과 동일해야 한다는 것이다.

FLOOR() 함수는 소수점 이하의 수를 내림 해주는 기능을 갖고, CELL() 함수는 소수점 이하의 수를 올림 해주는 기능을 갖고 있다. 이 두개의 함수는 무조건 정수형태의 값만을 리턴하게 된다. 그리고 추가적으로 TRUNC() 라는 함수는 두번째 인자로 내림하고자 하는 자릿수를 정할 수 있다. 인자값 만큼의 소수자리수를 남기로 내림을 실행하게 된다.

MOD() 함수는 첫번째 인자를 두번재 인자를 나눈 나머지값을 반환하는데, 자바에서의 MOD 연산자와 동일한 역할을 한다.
LOWER(), UPPER() 함수는 각각 인자로 받아들여진 문자열을 모두 소문자로, 대문자로 변환시켜준다.

SUBSTR() 함수는 문자열을 분리해주는 기능을 가지고 있다. 첫번째 인자로 받은 문자열을 두번째 인덱스 번호에서부터, 세번째 숫자만큼의 문자수만큼 잘라내어 반환해준다.

SELECT SUBSTR('HELLO BYE', 7, 3) FROM DUAL;

'HELLO BYE'에서 'BYE'만을 추출하기 위해서는 위와 같은 쿼리문을 사용할 수 있다. 7번째 인덱스인 'B'에서부터 세번째인 'E'까지의 문자열을 나타낸다.

Posted by seanhigher

댓글을 달아 주세요

최근에 달린 댓글

글 보관함