728x90
728x90

SEQUENCE

- 생성 및 확인

maxvalue, minvalue를 선언하지 않고 사용해도 된다
사실상 거의 나는 선언하지 않고 사용했었다

maxvalue는 start with, minvalue보다 크고 정수일 경우 최대 28자리까지 지원해주는걸로 알고 있다 

minvalue는 maxvalue보다 작아야하고 start with보다 커야한다

 

- 수정

-초기화 (= 삭제)

 

(사용 예)


SYNONYM

 

 

EMPLOYEES라는 테이블을 "사원들"이라고 alias 하면 그렇게 사용할 수 있다는 뜻이다

728x90
728x90
728x90

FULL OUTER JOIN

 

모든 테이블의 값이 다 나온다


LEFT / RIGHT OUTER JOIN을 할 수 있는 방법은 총 2개가 있다 

(+) 붙어있는 쪽이 안 붙어 있는 테이블과의 조건에서 값이 없을 경우 NULL로 해서 JOIN을 시켜주는 것
즉, (+) 안 붙어있는 쪽의 내역은 다 보여준다는 의미이다

LEFT OUTER JOIN
RIGHT OUTER JOIN

Table_One에 부서코드 4가 있지만 안나온걸 확인할 수 있다

728x90
728x90
728x90

1) INNER JOIN

ANSI SQL이 기본 문법으로 일반적으로 사용되는 문법이며

MS SQL은 ORACLE과 비슷하게 사용하면 된다

그리고 INNER JOIN 이라고 굳이 쓰지 않고 그냥 JOIN으로 쓰거나 WHERE 절에 조건만 서로 걸어주면 된다

조건에 맞춰서 연결한 두 테이블에서 내역을 가져온걸 확인 할 수 있다

728x90
728x90
728x90

- EXISTS / NOT EXISTS

EMP의 DEPTNO 20이 있을 경우만 SELECT 하겠다

결과는 DEPTNO 20이 EMP 테이블 내에 존재하니 다 나오는 것이다

20이 존재하는데 없는 경우 빼라고 했으니까 결과가 안나오는 것이다

예를들어 특정 부서번호가 없는걸 NOT EXISTS로 빼고 싶다고하면 위와 같이 해주면 된다

1이 존재하지 않냐 존재하냐 여부를 따져주는 것이기때문이다

그래서 NOT EXISTS 괄호 안에 FROM EMP 대신 FROM DUAL을 해줘도 동일하게 돌아간다

 

NOT IN은 속도면에서 성능이 좋지 않기 때문에
쿼리 튜닝을 할 때 NOT IN을 NOT EXISTS로 하려한다

* NOT IN의 경우 조건에 맞는 데이터가 있다고 하더라도 NULL 이 존재하면 NO ROWS SELECTED라고 나오는데 이때 NVL 처리를 해서 NULL 처리를 해줘야 한다

 

- CASE WHEN -THEN/ELSE-END

CASE WHEN 조건 THEN TRUE면 이 값 ELSE 아니면 이 값 END로 마무으리

 

- ROLLBACK / SAVEPOINT

ROLLBACK은 전체 롤백 아닌 P1같이 설정해주면 거기까지만 롤백

 

* Commit

: 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어

트랜젝션의 처리 과정을 데베에 반영하기 위해 변경된 내용을 모두 영구 저장한다

commit 수행하면 하나의 트랜젝션 과정이 종료하게 된다

728x90
728x90
728x90

- ADD_MONTHS( date, int)

 

- MONTHS_BETWEEN ( date1, date2)

앞에서 뒤를 빼는 형식이라 뒤가 더 커서 음수 값이 나온다

TO_DATE를 굳이 쓰지 않고 사용 가능하며 '-' 없이도 가능하다

 

일수를 알고 싶을 때는 그냥 위와 같이 사용해주면 된다

- NEXT_DAY (date, char)

date 이후의 날짜의 매개변수로 적은 요일에 해당하는 요일이 첫번째로 오게되면 그 날짜를 반환해준다

즉, 2021년 4월 1일 이후 첫번째 월요일은 4월 5일이므로 그 날짜를 반환해준다

 

- EXTRACT ( [ year / month / day / hour / minute / secound ] )

YEAR, MONTH ,DAY를 추출할 때는 Date 형이나 TimeStamp형등 어떤 값이 와도 괜찮지만

HOUR, MINUTE, SECOND 등과 같이 시간 정보가 필요할 때는 꼭 TIMESTAMP 형이 와야 합니다

 

TimeStamp형에는 시간 정보가 항상 있지만 Date형에는 시간 정보가 없을 수도 있기 때문입니다

그리고 이런 식으로도 사용할 수 있는데요

TIMEZONE_HOUR

TIMEZON_MINUTE

TIMEZON_REGION : TIMEZONE 의 지역

TIMEZON_ABBR : TIMEZONE 의 지역에 대한 약어

TIMESTAMP WITH TIMEZONE이나 TIMESTAMP WITH LOCAL TIMEZONE 형이 와야 됩니다

SYSTEM 0S에서 가져온 내 지역 시간을 추가해줘야 정확한 시간이 나온다

위 방법보다 아래의 방법을 사용하는게 좋다

 

728x90
728x90
728x90

관리자 , 사용자로 나누어 사용자에게 제한적인 권한을 부여하기 위해 사용되는 것이다

 

GRANT는 권한을 부여한다는 의미로

 

SELECT, INSERT, DELETE, UPDATE를 할 수 있는 권한을 

 

ON 어떤 테이블에

 

TO 어떤 사용자에게 

 

라고 봐주면 된다

 

SCOTT 계정에 MAKETABLE 이란 테이블의 SELECT 문의 권한을 준다 

그러면 SCOTT 계정은 이제 MAKETABLE을 SELECT 할 수 있는 것이다

 

반대로 권한을 뺏는 것은 REVOKE로 GRANT에서 예시로 보여준 것과 동일하게 해주면 된다

 

SCOTT 계정의 MAKETABLE 테이블을 SELECT 할 수 있는 권한을 뺏겠다

 

라고 하는 말이다

 

728x90
728x90
728x90

- DECODE

DECODE(컬럼, 조건, TRUE 결과값, FALSE 결과값)

- NVL2

NVL2( 값, 지정값1, 지정값2)

LATE이란 컬럼이 있는데 해당 컬럼에 값이 존재할 경우에는 Y를 출력하고 아닐 경우에는 N을 나오게 한다

마치 DECODE 같지만 이거는 값의 존재 여부 이거에 따라서 치환된다고? 생각하면 된다

근데 DECODE도 NVL2와 동일하게 사용 할 수 있다

 

LATE가 null 일 경우에는 N을 내보내고 , 값이 있으면 Y를 내보내라

 

- NULLIF

NULLIF( 값1, 값2)


문자열

- CONCAT : 문자열 연결

> 해피벌스데이

 

- INITCAP : 첫문자를 대문자로

> KOREA

 

- LOWER, UPPER

>oracle

:: Lower은 괄호 안에 들어간 문자가 모두 다 소문자로 나올 수 있도록

Upper는 다 대문자로 나올 수 있도록 해주는 함수이다

 

-TRIM : LEADING ( 왼쪽) / TRAILING (오른쪽) / BOTH (양쪽)

왼쪽의 A들을 없애주라 -> BBCCDD

오른쪽의 D를 없애주라 -> AABBCC

양쪽의 A를 없애주라 -> BBCCDD

 

그냥 TRIM을 조건 없이 사용한다면 공백을 제거 해주는 것이다 
LTRIM은 왼쪽만, RTRIM은 오른쪽만

 

LEADING A를 사용하지 않고 위 그림의 두번째 행을 참고해서 사용해도 된다

 

- SUBSTR / SUBSTRB (char, position, length)

 

10번째행에서 2개를 가져온다는 의미

SUBSTRB는 BYTE로 계산한다 (한글 : 2byte / 영문, 공백 : 1byte )

만약 position 값이 0이면 디폴트값 1이 들어가집니다

 

- REPLACE

> We are not alone

728x90
728x90
728x90

- CONSTRAINT 

테이블의 COLUMN에 설정을 해주는 값들이며 데이터 관리를 효율적으로 하기 위한 제약조건으로 보면 된다

 

- NOT NULL

문자형의 NULL 값인 ''을 넣으면 ERROR가 발생한다

 

- PRIMARY KEY

PKCOL PRIMARY KEY라고 해도 알아서 PK테이블이 만들어진다

즉, 그냥 DROP만 해주면 안된다는 의미는 그냥 TABLE만 DROP하는 것이 아닌 제약조건도 DROP 해줘야 한다는 의미이다 

맨 하단에 보면 CONSTRAINT PK명칭 하고 () 괄호 안에 컬럼이름을 넣어주면 된다

그냥 테이블을 만들고 아래의 ALTER TABLE 이하처럼 만들어주면 된다

여기서 만들어지지 않을 경우 ALL_CONSTRAINTS 테이블과 USER_INDEXES에서도 확인해주면 된다

그러면 이미 있다는 뜻이니까,,

위에 DROP CASCADE CONSTRAINTS 와 더불어 PRIAMRY KEY를 없애는 방법이다

 

- UNIQUE

컬럼명 자료형 UNIQUE KEY 해줘도 선언이 된다

 

- FOREIGN KEY

다른 테이블의 PK나 UK를 FK키로 해서 사용하는 방법이다

대부분 JOIN을 위해 사용된다

예를들면 사원 테이블이 있고 부서 테이블이 존재한다면

사원의 정보에 부서내역이 존재해야 하니 부서의 PK 값을 가져와 JOIN 시켜줘서 한번에 SELECT를 해주는 것이다

EMP : EMPNO, EMPNAME, DEPTNO(FK)

DEPT : DEPTNO(PK), DEPTNAME

이런식으로 생각해주면 된다

 

- CHECK

CHECK 제약조건에 걸린대로 내용에 맞춰서 컬럼에 INSERT를 해줘야하며 그 외 값은 INSERT시 에러가 난다

728x90
728x90
728x90

직접 실행하여 확인해보시는걸 추천합니다

그리고 웬만해서는 아래의 테이블들을 손대지 않는걸 추천!

 

USER_INDEXES

pk등 다양한 내용을 table_name을 조건절로 줘서 확인할 수 있다

pk등 없앤 것 같은데 오류가 난다? 이 테이블에서 확인해주면 좋다

 

ALL_TAB_COMMENTS

만약 TABLE에 코멘트를 달아놨다면 이 코멘트를 검색하여 찾아 볼 수 있다

 

ALL_COL_COMMENTS

TABLE의 COLUMN에 코멘트를 달아놨을 경우 확인하기 편하다

 

TAB

TABLE이 뭐가 있는지 찾아볼 수 있다

ALL_CONSTRAINTS

제약조건을 담아놓은 테이블이다

 

ALL_OBJECTS

모든게 다 담겨져 있는 테이블

 

USER_SOURCE

사용자가 만든 FUNCTION, PROCEDURE등을 확인할 수 있는 테이블 

728x90
728x90
728x90

ORA-02296 :: 제약(%s)을 사용할 수 없음. 부합하는 값이 없습니다

 

라는 오류가 발생...!!!

 

바로 ORA02296을 검색하였으나 대부분 NULL 오류 등과 관련된 얘기라서 나랑 다른 이야기인 줄 알았다!!

그러나... 값이 NULL이라서 생긴 오류였음을...

 

우선 이런 오류가 나타나게 된 원인

이미 기존에 생성되어있던 테이블에 컬럼을 추가 하였고

이 컬럼에 NOT NULL로 지정해주려 하였는데 저런 오류가 발생하였다

 

이번에 생성된 컬럼이니 기존에 존재하던 테이블 내역에는 

새로 추가한 컬럼의 값이 NULL일테니 이런 오류가 발생한 것이다

 

UPDATE로 ' '나 그냥 DEFAULT 값을 넣어줘서 테이블 내역에 새로 추가한 컬럼이 NULL인 부분에 넣어주고

그 후에는 NOT NULL 지정해주면 사용 가능하다

728x90

+ Recent posts