|
|||
|
'ORACLE > SQL' 카테고리의 다른 글
DB 최적화를 고려한 다건조회 페이징처리 (0) | 2010.01.03 |
---|---|
SQL TIP (0) | 2010.01.03 |
UNION (0) | 2010.01.03 |
case (0) | 2010.01.03 |
NVL,DECODE (0) | 2010.01.03 |
|
|||
|
DB 최적화를 고려한 다건조회 페이징처리 (0) | 2010.01.03 |
---|---|
SQL TIP (0) | 2010.01.03 |
UNION (0) | 2010.01.03 |
case (0) | 2010.01.03 |
NVL,DECODE (0) | 2010.01.03 |
SQL TIP (0) | 2010.01.03 |
---|---|
nvl2 (0) | 2010.01.03 |
case (0) | 2010.01.03 |
NVL,DECODE (0) | 2010.01.03 |
constraint 제약조건 (primary, foreign , unique,check, default) (0) | 2009.11.02 |
* CASE 함수
[ 형식 ]
CASE 컬럼명|표현식 WHEN 조건식1 THEN 결과1
WHEN 조건식2 THEN 결과2
......
WHEN 조건식n THEN 결과n
ELSE 결과
END
아래는 CASE WHEN 조건 분기를 사용하여 여러조건을 동시에 만족하는(교집합) 특정 값들을 얻고, NOT EXISTS 를 써서 특정 결과를 뺀(여집합) 결과를 구하는 쿼리 예제 입니다.
nvl2 (0) | 2010.01.03 |
---|---|
UNION (0) | 2010.01.03 |
NVL,DECODE (0) | 2010.01.03 |
constraint 제약조건 (primary, foreign , unique,check, default) (0) | 2009.11.02 |
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2 (0) | 2009.09.11 |
|
||||
|
UNION (0) | 2010.01.03 |
---|---|
case (0) | 2010.01.03 |
constraint 제약조건 (primary, foreign , unique,check, default) (0) | 2009.11.02 |
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2 (0) | 2009.09.11 |
ROLLUP , CUBE , GROUPING (0) | 2009.09.02 |
1.무결성 제약조건 6가지
1) primarty key
2)foreign key
3)unique
4)check
5)default 정의
6)null 값허용
2.primary key(기본키)
1)crate 시 생성
ㄱ) create table usertb1 (userid nchar(8) not null primary key, ........)--제약조건 자동생성됨
ㄴ) create table usertb1(userid nchart(8) not null constraint pk_userid primary key, ....) -- 제약조건 이름 강제 설정
2) alter (수정)시 생성
alter table usertb1
add constraint pk_userid --제약조건 이름 설정
primary key (userid) --userid를 기본키로 설정
단, userid(기본키 설정할려는 항목)이 null일경우 에러가남
그럴경우 먼저. not null로 변경해줘야함
예) alter table usertb1
alter column userid nchar(8) not null
cf)identity 속성으로 지정한경우 자동 not null 임
3.foreign key(외래키)
1) craete 시 생성
ㄱ)create table buytb1 ( num int not null primary key, userid nchar(8) not null foreign key reperences usertb1(userid), ...)
ㄴ)create table buytb1 ( num int not null primary key, userid nchar(8) not null constraint fk_usertb1_buytb1 foreign key reperences usertb1(userid)..)
2)alter 사용
alter table buytb1
add constraint fk_usertb1_buytb1--제약조건 이름 설정
foreign key (userid) - 참조키 설정(buytb1의 항목)
references usertb1(userid) -- 참조할 기본키
on update cascade-- usertb1의 기본키가 변경될시 buytb1의 userid도 자동변경
on delete cascade -- 기준테이블에 삭제일어날경우 외래키테이불도 삭제가 일어나도록 설정
단, 만약 usertb1 의 userid 와 buytb1의 userid 에 일치하지 않은 항목이 있으면. 에러남
그런경우 동일하지 않은 기존데이터를 무시하고 키설정
alter table buytb1 with nocheck -- with nocheck 속성 추가
4.unique 제약조건
중복되지 않는 유일한 값을 입력해야함 (null허용 , 단 중복되면 안됨으로 1개의 null만 허용)
1)create 시 생성
create table usertb1 (userid ............addr nchar(30) null unique)
create table usertb1(userid........ addr nchar(30) null constraint ak_addr unique)
create table usertb1(userid.... addr nchar(30) null, constraint ak_addr unique(addr)) -- 먼저 생성후 별도로 제약조건 추가
2)alter 사용
alter table usertb1
add constraint ak_addr --제약조건 이름 설정
unique(addr)
5.check 제약조건
check 제약조건은 입력되는 데이터를 점검하는 기능을 수행한다
(예 전화번호 국번, 출생년도 조절)
1) 예제1
출생년도가 1900년 이후 그리고 현재의 연도 이전
alter table usertb1
add constraint ck_birthYear
check
(birthyear >= 1900 and birthyear <= year(getdate()))
2)예제2
전화번호 국번 제약
alter table usertb1
add constraint ck_mobile1
check
(mobile1 in ('010', '011', '016', '017', '018', '019'))
3) with nocheck 옵션
전화번호 국번 제약조건을 걸때 이미 012라는 번호가 들어있는경우
국번체크 제약조건에 위배되지만 . 무시하고 넘어갈때 사용
alter table usertb1
with nocheck
add constraint ck_mobile1
check(mobile in ('010', '011', '016', '017', '018', '019'))
6.default 정의
default 정의는 데티너를 입력하지않았을때 자동으로 입력되는 디폴드 값을 정의 하는 방법이다
1)create시 정의
create table usertb1( userid .... birthYear int not null default year(getdate()), addr nchar(2) not null default '서울')
2)alter사용(for 문 사용해야함)
alter table usrtb1
add constraint cd_addr
default year(getdate()) for birthYear
go
3)insert시 default사용
insert into usertb1 valuse('wjn',.......default, defalut) --디폴트값사용
insert into usertb1 (userid, name ) values('wtw'.'우태운') --열이름이 명시되지않으면 default로 설정된값이 해당열에 자동입력됨
insert into usertb1valuse('hyh',......'1965','경기') -- 값이 직접 명기되면 default 값은 무시됨
7.제약조건 삭제
alter table usertb1
drop constraint 제약조건이름
단,pk는 fk먼저 삭제해야함
cf)현재 table의 constraint 보기 : exec sp_help table이름
case (0) | 2010.01.03 |
---|---|
NVL,DECODE (0) | 2010.01.03 |
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2 (0) | 2009.09.11 |
ROLLUP , CUBE , GROUPING (0) | 2009.09.02 |
Oracle 널값(null)에 대하여 정리 (0) | 2009.08.21 |
NVL,DECODE (0) | 2010.01.03 |
---|---|
constraint 제약조건 (primary, foreign , unique,check, default) (0) | 2009.11.02 |
ROLLUP , CUBE , GROUPING (0) | 2009.09.02 |
Oracle 널값(null)에 대하여 정리 (0) | 2009.08.21 |
SELECT문 및 연산자 (0) | 2009.08.10 |
* CUBE 연산자
- GROUP BY절에 있는 모든 컬럼들에 대한 가능한 모든 조합을 그룹으로 생성한다.
* GROUPING 함수
- 각 결과 행이 CUBE, ROLLUP 연산자들에 의해 계산된 것인지를 알기 위해 사용된다.
- 해당컬럼에 대해 계산되었다면 0, 그렇지 않다면(컬럼값이 NULL) 1을 반환한다.
- GROUP BY절에 나타나는 컬럼에 적용된다.
사용 예)
-- table생성(사원이름,급여,부서,직위,입사년도)
CREATE TABLE roll_test (
name VARCHAR2(10),
sal NUMBER,
dept VARCHAR2(10),
duty VARCHAR2(10),
entYear NUMBER(4)
);
INSERT INTO roll_Test VALUES('kim' , 1000, 'AA', '00', 2004);
INSERT INTO roll_Test VALUES('no' , 1500, 'AA', '00', 2004);
INSERT INTO roll_Test VALUES('choi', 2000, 'BB', '02', 2003);
INSERT INTO roll_Test VALUES('park', 2000, 'BB', '02', 2003);
INSERT INTO roll_Test VALUES('lee' , 3000, 'CC', '03', 2002);
INSERT INTO roll_Test VALUES('cho' , 4000, 'AA', '04', 2001);
INSERT INTO roll_Test VALUES('lyu' , 4000, 'DD', '04', 2001);
INSERT INTO roll_Test VALUES('ham' , 4000, 'AA', '04', 2001);
INSERT INTO roll_Test VALUES('kang', 7000, 'DD', '05', 2001);
COMMIT;
SELECT * FROM roll_Test;
-- 1. 각 부서에 대한 급여 소계를 구하고, 총계를 구하라
-- (하나의 Column Grouping)
-----일반-----------
SELECT dept, SUM(sal)
FROM roll_Test
GROUP BY dept;
---------------------
----- ROLLUP ---------
SELECT dept, SUM(sal), GROUPING(dept)
FROM roll_Test
GROUP BY ROLLUP(dept);
-----------------------
----- CUBE ----------
SELECT dept, SUM(sal), GROUPING(dept)
FROM roll_Test
GROUP BY CUBE(dept);
-----------------------
-- 일반적인 GROUP BY를 사용할 경우 급여 소계만 나오고, 총계는 따로 구해야 함
-- ROLLUP과 CUBE 차이점 없음
-- 2. 각 부서별, 직위별 급여 소계를 구하고, 총계를 구하라
-- (두개의Column Grouping)
-----NORMAL-----------
SELECT dept, duty, SUM(sal)
FROM roll_Test
GROUP BY dept, duty;
-----------------------
----- ROLLUP ----------
SELECT dept, duty, SUM(sal), GROUPING(dept), GROUPING(duty)
FROM roll_Test
GROUP BY ROLLUP(dept, duty);
-----------------------
----- CUBE ----------
SELECT dept, duty, SUM(sal), GROUPING(dept), GROUPING(duty)
FROM roll_Test
GROUP BY CUBE(dept, duty);
-----------------------
-- ROLLUP은 부서에 대한 소계 / 부서에 대한 직위별 소계만 볼 수 있고,
-- CUBE는 부서에 대한 소계 / 부서에 대한 직위별 소계 / 직위별 소계를 볼 수 있음
-- GROUP BY 내의 왼쪽 컬럼부터 자동으로 오름차순 정렬 됨
-- 3. 각 부서별, 직위별, 입사년도별 급여 소계를 구하고, 총계를 구하라
-- (세개의 Column Grouping)
-----NORMAL-----------
SELECT dept, duty, entYear, SUM(sal)
FROM roll_Test
GROUP BY dept, duty, entYear;
-----------------------
----- ROLLUP ----------
SELECT dept, duty, entYear, SUM(sal), GROUPING(dept), GROUPING(duty), GROUPING(entYear)
FROM roll_Test
GROUP BY ROLLUP(dept, duty, entYear);
-----------------------
----- CUBE ----------
SELECT dept, duty, entYear, SUM(sal), GROUPING(dept), GROUPING(duty), GROUPING(entYear)
FROM roll_Test
GROUP BY CUBE(dept, duty, entYear);
-----------------------
- ROLLUP 사용시 3개의 소계와 1개의 총계를 구할 수 있음
(부서별, 부서*직위별, 부서*직위*입사년도별, 총계)
※ GROUP BY 내의 가장 왼쪽 컬럼을 기준으로 하여 순차적으로 하위 그룹 생성
- CUBE 사용시 7개의 소계와 1개의 총계를 구할 수 있음.
(부서별, 직위별, 입사년도별, 부서*직위별, 부서*입사년도별, 직위*입사년도별, 부서*직위*입사년도별, 총계)
※ 생성 가능한 모든 경우를 그룹 생성
사용 예)
* 부서에 대한 소계를 보고 싶을 때
HAVING GROUPING(dept) = 0 AND GROUPING(duty) = 1
AND GROUPING(entYear) = 1;
constraint 제약조건 (primary, foreign , unique,check, default) (0) | 2009.11.02 |
---|---|
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2 (0) | 2009.09.11 |
Oracle 널값(null)에 대하여 정리 (0) | 2009.08.21 |
SELECT문 및 연산자 (0) | 2009.08.10 |
DBMS에 따른 날짜포맷 변환 (0) | 2009.08.07 |
1. NULL값 정의
RDBMS에서 NULL은 0 이나 공백이 아닌 값을 알수가 없다의 의미입니다.
이말은 값이 없다 입니다. 이는 Oracle 상에서 수치를 계산할때 문제가 됩니다.
null이 포함된 수식 계산에서는 무조건 null이 출려되어 잘못된 결과가 나오기 때문입니다.
특히 수치계산일때는 테이블 생성시 not null로 해주거나 nvl()함수로 제대로 치환해줘야
합니다.
2. NULL값 잘못된 처리
숫자의 경우
create table jun1(
a number,
b number);
insert into jun1 values(null,12);
select a+b from jun1;
라고 한다면 12가 나올것 같지만 null값이 포함된 계산식은 무조건 null이 나옵니다.
그래서 nvl()를 사용하거나 not null을 사용하는게 좋습니다.
문자열의 경우
create table jun2(
a varchar2(10),
b varchar2(10));
insert into jun2 values(null,'11');
select concat(a,b) from jun2;
라고 한다면 11이 나옵니다. mysql에서는 문자열도 null이지만 oracle에서는
문자열은 null이 들어가도 null로 출력되지 않고 그대로 연결됩니다.
''(빈공백)을 null로 인식하는 오라클 테스트 예제
create table test
(
a varchar2(10),
b varchar2(10)
)
insert into test values ('',null);
insert into test values ('test','test');
commit;
select count(*) from test where a = '';
--0개출력
select count(*) from test where a is null;
--1개출력
select count(*) from test where b = '';
--0개출력
select count(*) from test where b is null;
--1개출력
※ 오라클에서는 ''(빈공백)을 NULL값으로 인식합니다.
※ 오라클에서는 '' 을 null로 인식하며 '' 는 = '' 가 아닌 IS NULL 로 조회해야 검색가능하다.
※ 오라클에서는 NULL값이나 ''(빈공백)값은 널연산자외에 연산자로는 조회 불가능합니다.
이말은 널연산자외에 연산자에서는 널값을 조회대상에서 제외한다는 애기입니다.
3.많은 양의 null처리
상당히 많은 양의 레코드에 null이 있다면 계산하는데 문제가 많다.
update table_name set num=0 where num is null; -- 정수의 경우
update table_name set num=' ' where num is null; -- 문자열의 경우
와 같이 null값을 지정된 숫자로 일괄로 바꾸어준다.
table을 만들시에 모든컬럼에 not null 제약조건을 주는게 좋습니다.
※nvl()함수를 이용한다.
null이면 지정된 값으로 출력합니다. 실제 데이타는 바뀌지 않으며 단지 출력용입니다.
select nvl(comm,0) from emp;
--comm컬럼의 값이 null이면 0을 출력하고 값이 있다면 해당 값을 출력한다.
select nvl(hiredate,'01-JAN-97') from emp;--hiredate컬럼의 값이 null이면 01-JAN-97을 출력하고 값이 있다면 해당 값을 출력한다.
select nvl(job,'not') from emp;
--job컬럼의 값이 null이면 job을 출력하고 값이 있다면 해당 값을 출력한다.
select ename,sal,comm,(sal*12)+nvl(comm,0) from emp;
--수치계산에서는 null이 포함되면 결과는 null이지만 nvl()로 처리되어 모두 계산되어진다.
select ename,sal,comm,(sal*12)+comm from emp;
--수치계산에서는 null이 포함되면 결과는 null이다 그래서 comm에 null이 포함된 레코드는
--결과값이 null로 나옵니다.
4.mysql과 다른 oracle의 범위
mysql에서는 select * from table_name where name is null하면 실제 컬럼에 null이 들어가고 공백이나 실제로 값이 있는 컬럼은 빼고 검색하지만
oracle에서는 select * from table_name where name is null하면 실제컬럼에 공백이나 빈공간이 null로 인식되어 검색됩니다.
※name은 예를든 컬럼
mysql null범위
1.데이타값이 null인값 -> ''의 문자값은 = ''로 비교를 해야하고 name is null로 하면 안됩니다.
oracle null범위
1.데이타값이 빈공간이나('') 값 -> '' 의 문자값은 = ''로 비교가 안되고 name is null로 합니다.
5. 널값은 비교대상이 될수 없다.
SELECT '널값' test FROM dual WHERE '' <> '널값';
-- 아무것도 출력안됨
-- 오라클에서 ''은 null입니다. null은 비교 대상이 될수 없으므로 is not null 연산자를
-- 이용해서 비교해야 정상적으로 자료가 출력됩니다.
-- 한마디로 널값은 =, <> 등으로 비교할 수 없습니다.
SELECT '널값' test FROM dual WHERE nvl('','널값') <> '널값';
-- 널값
-- 널값을 nvl 함수로 치환후 비교하면 정상출력됨
SELECT '널값' test FROM dual WHERE '' is null;
-- 널값
-- is null 연산자를 이용해서 정상출력됨
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2 (0) | 2009.09.11 |
---|---|
ROLLUP , CUBE , GROUPING (0) | 2009.09.02 |
SELECT문 및 연산자 (0) | 2009.08.10 |
DBMS에 따른 날짜포맷 변환 (0) | 2009.08.07 |
CUBE 함수 (0) | 2009.07.08 |
|
||||||||||||||||||||||||||||||||||||||||||
|
ROLLUP , CUBE , GROUPING (0) | 2009.09.02 |
---|---|
Oracle 널값(null)에 대하여 정리 (0) | 2009.08.21 |
DBMS에 따른 날짜포맷 변환 (0) | 2009.08.07 |
CUBE 함수 (0) | 2009.07.08 |
ROLLUP 함수 (0) | 2009.07.08 |
Oracle - MS SQL - DB2 UDB 의 서로 다른 날짜 형식을 맞추기위한 SQL문
Oracle |
select sysdate from dual; 날짜+시분초 까지 조회가능 select current_timestamp from dual; 날짜+밀리초+시간존 까지 조회 |
MS SQL |
select getdate() 날짜 + 밀리초 단위까지 조회가능
|
DB2 UDB |
select current timestamp from sysibm.sysdummy1 날짜+밀리초까지 조회 가능 select current date from sysibm.sysdummy1 날짜만 조회 select current time from sysibm.sysdummy1 밀리초 단위의 시간만 조회 |
Oracle |
YY/MM/DD (한글) DD-MON-YYYY (영어) |
MS SQL |
YYY/MM/DD HH:MI:SS (한글) MM-DD-YYYY HH:MI:SS (영어) |
DB2 UDB |
YYYY-MM-DD-HH:MI:SS.MMMMMM (TIMESTAMP 타입) YYYY-MM-DD (DATE 타입) HH:MI:SS.MMMMMM (TIME 타입) |
형식 |
RDBMS |
변환 문법 |
|
Oracle |
TO_CHAR(date_exp, 'YYYY.MM.DD') |
'YYYY.MM.DD' |
MSSQL |
CONVERT(VARCHAR, date_exp, 102) |
|
DB2 |
REPLACE(CHAR(DATE(date_exp),ISO), '-', '.') |
|
Oracle |
TO_CHAR(date_exp, 'HH:MI:SS') |
'HH:MI:SS' |
MSSQL |
CONVERT(VARCHAR, date_exp, 108) |
|
DB2 |
CHAR(TIME(date_exp) , JIS ) |
|
Oracle |
TO_CHAR(date_exp, 'YYYY/MM/DD') |
'YYYY/MM/DD' |
MSSQL |
CONVERT(VARCHAR, date_exp, 111) |
|
DB2 |
REPLACE(CHAR(DATE(date_exp), ISO), '-', '/') |
|
Oracle |
TO_CHAR(date_exp, 'YYYYMMDD') |
'YYYYMMDD' |
MSSQL |
CONVERT(VARCHAR, date_exp, 112) |
|
DB2 |
CHAR(DATE(date_exp)) |
|
Oracle |
TO_CHAR(date_exp, 'HH24:MI:SS') |
'HH24:MI:SS' |
MSSQL |
CONVERT(VARCHAR(8), date_exp, 114) |
|
DB2 |
CHAR(TIME(date_exp) ) |
|
Oracle |
TO_CHAR(date_exp, 'YYYY.MM.DD HH24:MI') |
'YYYY.MM.DD HH24:MI' |
MSSQL |
CONVERT(VARCHAR, date_exp, 102) + ' ' + CONVERT(VARCHAR(5), date_exp, 114) |
|
DB2 |
REPLACE(CHAR(DATE(date_exp), ISO), '-', '.') || CAST( TIME(date_exp) AS CHAR(5)) |
|
Oracle |
TO_CHAR(date_exp, 'YYYY/MM/DD HH24:MI:SS') |
'YYYY/MM/DD HH24:MI:SS' |
MSSQL |
CONVERT(VARCHAR, date_exp, 111) + ' ' + CONVERT(VARCHAR(8), date_exp, 114) |
|
DB2 |
REPLACE(CHAR(DATE(date_exp), ISO), '-', '/') || CAST( TIME(date_exp)) |
Oracle 널값(null)에 대하여 정리 (0) | 2009.08.21 |
---|---|
SELECT문 및 연산자 (0) | 2009.08.10 |
CUBE 함수 (0) | 2009.07.08 |
ROLLUP 함수 (0) | 2009.07.08 |
Oracle sum() over() - 누적계산 (0) | 2009.06.12 |