IT 프로그래밍/ORACLE2014. 1. 26. 21:54

이번에는 having 에 대해서 알아보겠습니다.

 

글 읽기 전에 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^

 

 

select 절에 조건을 사용하여 결과를 제한할 때는 where 절을 사용하며, 그룹의 결과를 제한할 때는 having절을 사용합니다.

 

부서별로 그룹을 지은 후(group by), 그룹 지어진 부서별 평균 급여가 2000 이상인(having) 부서의 번호와 부서별 평균 급여를 출력하는 경우입니다.

 

select deptno, avg(sal) from emp group by deptno having avg(sal) >= 2000;

 

 

 

 

where절은 테이블에서 데이터를 가져올 때 특정 조건에 부합하는 자료만을 검색할 때 사용하는 절입니다. 반면 having절은 그룹 함수 사용 시 그룹 함수를 적용해서 나온 결과값 중에서 원하는 조건에 부합하는 자료만 산출할 때 사용하는 절입니다. where절에서 조건에 사용되는 컬럼은 단순 컬럼이고, having절에서 그룹 함수를 적용한 컬럼이 조건으로 온다고 생각하면 이해하기 쉬우실겁니다.

 

예제를 하나 더 보겠습니다.

 

select deptno, max(sal), min(sal) from emp group by deptno having max(sal) > 2900;

 

위 예제는 부서의 최대값과 최소값을 구하되 최대 급여가 2900 이상인 부서만 출력하라는 예제입니다. 결과는 아래와 같습니다.

 

 

 

 

이해가 되셨는가요?

 

어려운 부분이 있으시다면 댓글 남겨주세요.^^

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 26. 21:40

이번에는 오라클 group by 절에 대해서 알아보겠습니다.

 

글 읽기 전에 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^

 

 

 

어떤 컬럼 값을 기준으로 그룹함수를 적용해 줄지 기술해 주어야 할 경우에는 select 문에 group by 절을 추가하되 group by 절 뒤에 해당 컬럼을 기술합니다.

 

그룹 함수는 테이블에 아무리 행이 많아도 단 한 개의 결과값만을 산출합니다. 그러나 직원 중 가장 높은 급여값을 구하는 것이 아닌, 부서별 가장 높은 급여값을 구하고 싶을 때가 있습니다. 즉, 최대값이나 최소값, 합계, 평균 등을 어떤 컬럼을 기준으로 보고자 하는 경우입니다.

 

이때는 그룹 함수를 쓰되 어떤 컬럼값을 기준으로 그룹 함수를 적용할지 기술해야 합니다.

 

group by 절 뒤에 해당 컬럼을 기술하면 됩니다. 형식은 다음과 같습니다.

 

[형식]

select 컬럼명, 그룹 함수

from 테이블명

where 조건(연산자)

group by 컬럼명;

 

합계, 평균, 최대값이나 최소값 등을 어떤 컬럼을 기준으로 그 컬럼의 값을 개별적으로 보고자 할 때 group by 절 뒤에 해당 컬럼을 기술하면 됩니다. group by절을 사용할 때 주의할 점은 group by절 다음에는 컬럼의 별칭은 사용할 수 없고, 반드시 기존에 있는 컬럼명을 기술해야 한다는 점입니다.

 

사원 테이블을 부서 번호로 그룹 지어 보겠습니다.

 

select deptno from emp group by deptno;

 

 

 

사원 테이블을 부서 번호로 그룹 짓기 위해서 group by절 다음에 부서 번호(deptno)를 기술하였습니다. 위 결과를 보면 사원들은 3개(10번, 20번, 30번) 중의 하나에 소속되어 있는 것을 알 수 있습니다.

 

사원 테이블에서 부서별로 평균 급여를 구하려면 우선 전체 사원을 소속 부서별로 그룹 지어 놓아야 합니다.

 

다음은 소속 부서별 평균 급여를 구하는 예제입니다.

 

select avg(sal) from emp group by deptno;

 

 

 

 

현재 직원들이 속한 부서는 10, 20, 30번부서 단 세 곳이므로 각각 10번, 20번, 30번 부서별 평균이 산출됩니다. 이대로 실행하면 의미 있는 정보가 산출이 될까요? 위의 결과값은 분명 3개 부서의 평균값, 3개의 로우가 산출됩니다. 하지만 각 평균 급여는 어느 부서의 평균값인지의 정보가 결여되어 있어 의미 있는 정보라고 하기는 어렵습니다.

 

어떤 부서의 평균인지를 알아보기 위해 아래와 같이 부서 번호인 deptno도 select절에 함께 기술합니다.

 

select deptno, avg(sal) from emp group by deptno;

 

 

 

 

그룹 함수를 적용하지 않은 단순 컬럼은 select 리스트에 함께 사용할 수 없습니다. 이유는 개수 문제로 매치가 불가능하기 때문입니다.

 

쉽게 예제로 설명을 드리겠습니다.

 

select deptno, ename, avg(sal) from emp group by deptno;

 

 

 

오류가 발생하게 됩니다.

 

그 이유는 deptno, ename, avg(sal)의 컬럼의 산출값이 틀리기 때문입니다.

 

그룹함수 사용 시 group by 절로 묶이지 않은 단순 컬럼은 select 리스트에 사용할 수 없고, 사용시 에러가 발생하므로 주의를 하셔야 합니다.

 

쉽게 설명을 한다고 적었는데 이해가 되셨는가요?

 

궁금하신점은 댓글에 남겨주세요~^^

 

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 26. 20:38

이번에는 그룹함수에 대해서 알아보겠습니다.

 

글 읽으시기 전에 손가락 한번 꾸~욱 눌러주시면 감사하겠습니다.^^

 

 

그룹 함수는 하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등을 하나의 결과로 나타냅니다.

 

우선 예제를 한번 보도록 하겠습니다.

 

select deptno, round(sal, 3) from emp;

 

결과는 다음과 같습니다.

 

 

 

 

위 결과를 보면 각 행에 대해서 함수가 적용되기 때문에 출력 결과가 함수를 적용하기 전과 동일하게 4개의 row로 구해집니다. 이러한 함수를 단일행 함수라고 하며 단일행 함수는 각 행에 대해서 함수의 결과가 구해지기 때문에 결과가 여러 개의 row로 구해집니다.

 

이번에는 그룹 함수를 이용해서 사원의 총 급여를 구해 보겠습니다.

 

select sum(sal) from emp;

 

 

 

 

그룹 함수의 결과는 사원이 총 4명인데도 결과는 하나의 행으로 출력됩니다.

 

다음은 그룹 함수의 종류를 정리한 표입니다.

 

 

 구분 

 설명 

 SUM 

 그룹의 누적 합계를 반환합니다. 

 AVG 

 그룹의 평균을 반환합니다. 

 COUNT 

 그룹의 총 개수를 반환합니다. 

 MAX 

 그룹의 최대값을 반환합니다. 

 MIN 

 그룹의 최소값을 반환합니다. 

 STDDEV 

 그룹의 표준편차를 반환합니다. 

 VARIANCE 

 그룹의 분산을 반환합니다. 

 

다음은 간단한 예제입니다.

 

평균 구하는 AVG 함수

select avg(sal) from emp;

 

최대값, 최소값 구하는 함수

select max(sal), min(sal) from emp;

 

row 개수 구하는 함수(count 함수는 null값에 대한 개수를 세지 않습니다.)

select count(comm) from emp;

 

크게 어려우신 부분은 없을듯 합니다.

 

다음 포스팅은 group by 절에 대해서 알아보겠습니다.

 

궁금하신 점은 댓글 남겨주세요~^^

 

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 25. 03:03

이번에는 update set 문에 대해서 보겠습니다.

 

형식은 다음과 같습니다.

 

UPDATE table_name set 컬럼='변경할 값' where 컬럼='변경할 값의 해당 컬럼의 값';

 

제가 작성하고도 이해하기 어렵네요 ㅎㅎ

 

예문을 보겠습니다.

 

 


 

우선 TEST 라는 테이블에 컬럼과 값이 이렇게 들어가있네요.

 

4번 인덱스에 TITLE 컬럼의 값 보이시나요?

 

밤 이라는 값을 바꿔보도록 하겠습니다.

 

UPDATE TEST SET TITLE='오전' WHERE CONTENT='굿밤';

 

결과를 보도록 하겠습니다.

 

 


 

오전이라고 값이 바뀌었습니다.

 

이제 UPDATE SET 문의 응용을 보도록 하겠습니다.

 

UPDATE TEST SET COLUMN1='ABC' WHERE NO > 10;

설명 : TEST 테이블의 'COLUMN1' 컬럼값을 ABC로 수정하되 'NO' 컬럼의 값이 10이상인 모든것을 수정한다.

 

UPDATE TEST SET POINT=(POINT+100) WHERE NO <> 10;

설명 : TEST 테이블의 'POINT' 컬럼 값을 현재 값보다 100을 더한 값으로 수정하되 수정대상은 'NO' 컬럼값이 10을 제외한 모든것을 수정한다.

 

UPDATE TEST SET COLUMN1='ABC', COLUMN2='DEF' WHERE NO > 3 AND ID < 10;

설명 : TEST 테이블의 'COLUMN1' 컬럼과 'COLUMN2' 컬럼의 값을 수정하되 'NO' 컬럼값이 3보다 커야하고 'ID' 컬럼의 값이 10보다 작은 모든 값을 수정한다.

 

UPDATE TEST SET COLUMN1='ABC' WHERE NO > 3 ORDER BY UID LIMIT 20;

설명 : TEST 테이블의 'COLUMN1' 컬럼의 값을 ABC로 수정하되 'NO' 컬럼값이 3보다 커야하고 전체 목록을 UID 컬럼값을 기준으로 정렬해서 상위 20개를 수정한다.

 

UPDATE TEST SET COLUMN1=REPLACE(COLUMN1, '컴퓨터', 'COMPUTER');

설명 : TEST 테이블의 'COLUMN1' 컬럼의 값에 '컴퓨터' 라는 단어가 포함되어 있다면 모두 'COMPUTER'로 수정한다.

 

UPDATE TEST SET COLUMN1=CONCAT(COLUMN1, 'COPY') WHERE NO > 10;

설명 : TEST 테이블의 'COLUMN1' 컬럼의 값에 'COPY'를 덧붙이되 'NO' 컬럼의 값이 10 이상인 값에 덧붙인다.

 

 

이해가 잘 되셨는가요?

 

궁금하신점은 댓글 남겨주세요~

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 25. 03:02

이번에는 insert 문에 대해서 알아보겠습니다.

 

insert into 구문을 사용하면 테이블에 데이터를 삽입할 수 있습니다.

 

형식은 다음과 같습니다.

 

INSERT INTO table_name [ (attribute_list) ] values (value_list) [;]

INSERT INTO table_name DEFAULT [VALUE] [;]

 

table_name : 데이터를 입력하고자 하는 테이블 이름

attribute_list : 입력하고자 하는 값의 컬럼 이름. 만약 attribute_list를 명시하지 않으면 테이블에 정의된 모든 컬럼에 대한 값을 넣어야합니다. 만약 attribute_list에 일부 컬럼만 명시가 된다면 나머지 컬럼에는 정의된 디폴트 값이 할당되며 디폴트 값이 없을 경우 NULL 값이 할당됩니다.

value_list : attribute_list 의 컬럼에 대응되는 값을 명시합니다. value_list 의 항목은 표현식, 메소드 호출일 수 있으며, attribute_list 의 속성 위치와 도메인 형식이 일치해야 합니다. 각 이름과 값은 콤마(,)로 구별됩니다.

DEFAULT : 두 번째 형식의 INSERT 문은 각각의 속성에 디폴트 값을 할당하여 데이터를 생성합니다. 만약 테이블 정의에서 컬럼에 디폴트 값이 설정되어 있지 않으면 그 컬럼의 값으로 NULL이 할당됩니다.

 

처음 접하시는 분들은 아마 이해가 잘 안되실텐데 예제를 살펴보도록 하겠습니다.

 

먼저 제가 만든 테이블을 살펴보겠습니다.

 

 


 

TEST 란 테이블에 컬럼이 ID, TITLE, CONTENT, FILENAME 이렇게 있네요.

 

각각 컬럼에 값이 4개가 들어가 있네요.

 

여기에서 추가를 해보겠습니다.

 

INSERT INTO TEST(ID, TITLE, CONTENT, FILENAME) VALUES('값 입력', 'INSERT INTO문', '값을 입력하는것입니다.', '이해가 되셨는가요?');

 

이렇게 하고 결과를 보도록 하죠

 

 


 

네~입력이 잘 되었네요.

 

그럼 이번에는 다르게 한번 넣어볼께요.

 

INSERT INTO TEST VALUES('간략한', 'INSERT', 'INTO', '방법입니다.');

 

앞전이랑 좀 다른부분이 있죠?

 

네~그렇습니다. 바로 필드명을 명시를 안해주었는데 이렇게 해주어도 되냐구요? 결과를 보도록 하죠.

 

 


 

정상적으로 값이 들어가지네요.

 

INSERT INTO 문을 사용할때 컬럼값을 생략하고자 하면 VALUES 다음에 넣는 값을 각각컬럼의 형식에 맞게끔 넣어주면 값이 정상적으로 들어가지게 됩니다.

 

단 주의할점은 컬럼의 순서에 맞는 형식을 입력해야 하며 모든 컬럼의 값을 입력해야 합니다. 그렇지 않으면 에러가 납니다.

 

예제를 한번 보도록 하죠.

 

컬럼이 총 4개인데 입력값은 3개이죠? 그럼 결과가 어떻게 나올까요?

 

 


 

예~ 무시무시한 오류를 발생시키면서 값을 입력 못하네요.

 

INSERT INTO 문을 사용할때 컬럼값을 생략하고싶으시면 모든 컬럼에 대한 맞는 값을 넣어줘야 한다는것을 잊으시지 마시구요.

 

만약 특정 컬럼에만 값을 넣고 싶으시다면 이렇게 하시면 됩니다.

 

INSERT INTO TEST(ID) VALUES('ID에만 값 입력');

 

결과를 볼까요

 

 


 

ID 컬럼에만 값이 입력되고 나머지는 NULL 값이 되는것이 보이네요.

 

이해가 잘 되셨나요?

 

궁금하신점은 댓글로 주세요~

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 25. 03:01

테이블에 이미 존재하는 컬럼을 삭제해 보도록 하겠습니다.

 

우선 그림을 보시면 TEST 컬럼이 있습니다.

 

 


 

TEST 컬럼을 삭제해 보도록 하겠습니다.

 

ALTER TABLE TEST DROP COLUMN TEST;

 

결과를 볼까요?

 

 


 

컬럼이 삭제된것을 확인할 수 있습니다.

 

그리고 당부의 말을 드리자면 DROP 또는 DELETE 명령어는 진짜 왠만하면 사용하지 않으시고 반드시 써야하면 심사숙고하고 많이 알아보신 다음에 하시는것을 권장합니다.

만약 일하는 도중에 실수로 데이터를 삭제하는 경우가 생긴다면......인생 쫑날수도 있으니까요.

 

궁금하신 점은 댓글 달아주세요.^^

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 25. 03:01

ALTER TABLE MODIFY문을 다음과 같은 형식으로 사용하면 테이블에 이미 존재하는 컬럼을 변경할 수 있습니다.

 

형식은 다음과 같습니다.

 

ALTER TABLE table_name MODIFY(column_name, data_type expr, ....);

 

컬럼을 변경한다는것은 컬럼에 대한 데이터 타입이나 크기, 기본값을 변경한다는 의미입니다. 하지만 컬럼을 변경할 때 데이터가 존재하는 경우에는 컬럼의 데이터 타입이나 크기를 자유롭게 변경할 수 없기 때문에 다음과 같은 점에 주의해야 합니다. 데이터가 존재하는데도 데이터의 타입을 변경할 수 있는 경우는 오직 CHAR와 VARCHAR2 사이의 타입을 변경하는 경우입니다. 컬럼의 크기 변경 역시 기존에 저장된 데이터의 길이와 같거나 클 경우에만 변경이 가능합니다.

 

정리를 하자면

1. 해당 컬럼에 자료가 없는 경우

  - 컬럼의 데이터 타입을 변경 가능

  - 컬럼의 크기를 변경 가능

 

2. 해당 컬럼에 자료가 있는 경우

  - 컬럼의 데이터 타입을 변경 불가능

  - 크기를 늘릴 수는 있지만 현재 가지고 있는 데이터의 크기보다 작은 크기로 변경은 불가능

 

컬럼의 크기를 변경하는 방법에 대해 알아보겠습니다. 우선 ALTER TABLE MODIFY문으로 컬럼의 크기를 변경해 보겠습니다.

 

 

 

위 사진을 보시면 TEST 컬럼의 속성인 NUMBER 가 4자리로 지정이 되어 있습니다. 이걸 변경해 볼께요

 

ALTER TABLE TEST MODIFY(TEST NUMBER(10));

 

그럼 결과를 보겠습니다.

 

 


 

TEST 컬럼의 속성값이 변경된것이 보이시죠?

 

크게 어려운 부분은 없을거라 생각됩니다.

 

다음 포스트는 컬럼을 삭제하는것에 대해서 알아보겠습니다.

 

혹시 궁금하신거는 댓글로 남겨주세요.

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 25. 03:00

ALTER TABLE로 컬럼을 추가, 수정, 삭제하기 위해서는 다음과 같은 명령어를 사용합니다.

 

ADD COLUMN 절을 사용하여 새로운 컬럼을 추가합니다.

MODIFY COLUMN절을 사용하여 기존 컬럼을 수정합니다.

DROP COLUMN절을 사용하여 기존 컬럼을 삭제합니다.

 

우선 컬럼을 추가하는것을 알아보겠습니다.

 

새로운 컬럼은 테이블 맨 마지막에 추가되므로 원하는 위치에 만들어 넣을 수 없습니다. 또한 이미 이전에 추가해 놓은 로우가 존재한다면 그 로우에도 컬럼이 추가되지만, 컬럼값은 NULL값으로 입력됩니다.

 

컬럼추가 형식은 이렇습니다.

 

ALTER TABLE table_name ADD(column_name, data_type expr, ...);

 

이렇게봐서는 잘 모르시겠죠? 예제를 보도록 하죠.

 

desc test; 입력하니깐 아래 그림처럼 나오네요.

 

 


 

컬럼은 총 4개로서 ID, TITLE, CONTENT, FILENAME 이렇게 나오네요.

 

여기에다가 제가 TEST 컬럼을 추가해 보도록 하겠습니다.

 

ALTER TABLE test add(TEST NUMBER(4));

 

이렇게 한 다음 다시 결과를 보니깐

 

 


 

TEST 컬럼이 추가된것이 보이시죠?

 

컬럼의 형식은 NUMBER(4) 로 주었습니다.

 

컬럼은 추가되었지만 안에는 NULL 값이 들어가있는 상태라서 넣고자 하는 값들을 넣으시면 되겠습니다.

 

다음 포스트에서는 컬럼 속성 변경에 대해서 알아보겠습니다.

 

이해안되시는 부분은 댓글 남겨주세요.

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 25. 02:59

앞전 포스트에서 select 에 대해서 알아보았습니다.

 

이번에 보실 where 조건은 내가 보고싶은 데이터만 쏙 빼와서 볼 수 있도록 해주는것입니다.

 

예를들어 select * from article; 라고 입력하면 article 테이블에 있는 모든 컬럼의 모든 데이터를 볼 수 있게됩니다.

 

그림을 보도록 하죠

 

빨간색 사각형 안에 있는것들이 컬럼이고 보라색 사각형안에 있는것들은 데이터 입니다.

 

저렇게 모든 데이터가 나오게 되니깐 제가 찾고자 하는걸 볼수가 없네요

 

그래서 where 조건을 사용해서 제가 원하는 데이터를 찾을수 있습니다.

 

제가 찾고자하는게 TITLE 컬럼에서 값이 독크루저 라는것을 찾고자 하면 이렇게 하면 됩니다.

 

select * from article where title = '독크루저';

 

그럼 결과는 이렇게 나옵니다.

 

 

빨간 사각형 보이시죠?

 

title 의 값이 독크루저 라는 컬럼의 모든 값이 출력되게 됩니다.

 

이해가 되셨나요?

 

참고로 where = '독크루저'; 할때 where = 다음에 조건을 줄때 문자형이면 반드시 ''(싱글코테이션)을 주셔야 하고

 

숫자일경우는 ''(싱글코테이션)을 주시면 안됩니다.

 

궁금하신점은 댓글로 남겨주세요.

 

Posted by 정윤문경아빠
IT 프로그래밍/ORACLE2014. 1. 25. 02:58

오라클에서 가장 많이 사용하는 명령어가 아마 select 문 이라고 생각합니다. 필드에서도 select 문을 어떻게 하느냐에 따라서 몸값에 엄청난 차이가 많이 발생하죠.

 

그럼 select문에 대해서 알아보겠습니다.

 

아래는 select문의 기본 형식입니다.

 

SELECT * FROM table_name;

 

SQL 명령어는 하나의 문장으로 구성되어야 하는데 여러 개의 절이 모여서 문장이 되는 것이고 이러한 문장들은 반드시 세미콜론(;)으로 마쳐야 합니다.

 

SELECT문은 반드시 SELECT와 FROM이라는 2개의 키워드로 구성되어야 합니다. 이 두 개의 키워드를 기준으로 SELECT절과 FROM절로 구분됩니다.

 

SELECT절은 출력하고자 하는 컬럼의 이름을 기술합니다. 특정 컬럼의 이름 대신 *(에스테리스크) 를 기술할 수 있는데, *는 테이블 내의 모든 컬럼을 출력하고자 할 경우 사용합니다. FROM절 다음에는 조회하고자 하는 테이블의 이름을 기술합니다.

 

예를 다시 하나 더 들어볼께요.

 

CREATE TABLE EXAM (A NUMBER(4), B VARCHAR(20));

 

이렇게 해서 EXAM 이라는 테이블을 생성했습니다.

 

여기에 A 컬럼과 B 컬럼에 값을 입력합니다.

 

INSERT INTO EXAM (A, B) VALUES(1, '가');

INSERT INTO EXAM (A, B) VALUES(2, '나');

INSERT INTO EXAM (A, B) VALUES(3, '다');

 

이렇게 하면 EXAM 테이블에 값이 입력되어지게 됩니다.

 

이제 값들을 조회하는 SELECT문을 사용해보도록 하겠습니다.

 

SELECT * FROM EXAM;  <- 하면 결과가 어떻게 나오게 될까요?

 

 A

B

 1

 가

 2

 나

 3

 다

 

위 표와 같이 결과가 나오게 됩니다. 즉 A 컬럼에는 1,2,3 값이, B 컬럼에는 가,나,다 라는 값이 입력되어 있습니다.

 

이해가 되셨는가요?

 

이제 다른 방법으로 조회하는것을 알아보겠습니다.

 

SELECT A, B FROM EXAM;

 

이렇게 하면 결과가 어떻게 나올까요?

 

 

 A

B

 1

 가

 2

 나

 3

 다

 

 

예~ 똑같은 결과가 나오네요.

 

우선 위 코드를 보면 중간에 * 와 A, B 가 차이가 있다는것을 알 수 있습니다.

 

이렇게 컬럼의 숫자와 데이터 숫자가 작으면 * 를 사용해도 크게 상관없으니

 

대기업 및 공기업에서는 그렇게 해서는 안됩니다.

 

왜냐하면 데이터 검색속도에서 매우 많은 차이가 발생하기 때문입니다.

 

그렇기때문에 가급적이면 컬럼명을 정확하게 입력해주도록 합니다.

 

다음 포스트는 SELECT 문에 WHERE 문을 적용시키는 방법에 대해서 포스팅 하겠습니다.

Posted by 정윤문경아빠