서론
jsp를 공부하던 중에 db의 필요성을 느껴 유튜브(뉴렉처님) 영상을 보며 공부한 내용을 정리한 내용을 기록하기 위해 글을 작성했다.
db(오라클)
기본 세팅
SQL, DB, DBMS의 의미와 필요성
database는 중복을 없애는 방법으로 결함을 줄여준다.
이때 database를 이용할때에는 동시성, 성능, 보안등과 같은 요소들을 해결해주어야 한다.
이러한 동시성, 성늘, 보안등을 해결해주는 시스템을 DBMS(database management system)이라고 한다.
이러한 DBMS에게 데이터를 요청할때에 사용하는 언어를 SQL(Structured Query Language)이라고 한다
오라클 DBMS 설치
https://www.oracle.com/database/technologies/xe-downloads.html에서 oracle서버를 설치한다.
같이 설치된 sqlplus를 이용해서 db를 다룰 수 있지만, 콘솔 기반 UI가 불편할 수 있기 때문에
sql developer를 이용할 것 이다.
sql developer를 아래와 같이 이용한다.

오라클 원격 접속을 위한 설정
EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE); 를 통해서 로컬환경에서만 접속하는것이 아니게 된다.
이후 접속을 할때 주소값에 ip주소를 입력하면 된다. (물론 이때에 db가 설치된 컴퓨터는 방화벽이 해제되어있어야한다.)
오라클 pdb서버 접속하기
pdb(pluggable database)서버란? 오라클에 cdb라는 메인 서버에 모듈처럼 잘게 쪼개진 가상 데이터 베이스
sql에서 아래와 같은 명령어를 작성하여 pdb가 존재하는지 확인
select name from v$pdbs;
PDB$SEED ← seed에 해당한다 이를 복사해서 가상db를 계속 만들어 나간다 즉 복사원본이라고 생각해면 된다.
XEPDB1 ← 현재 존재하는 pdb이다.
사용자와 데이터베이스 생성하기








오라클 명령어
오라클 명령어 종류
ddl : create / alter / drop
dml : crud
dcl : grant / revoke(권한)
MEMBER테이블 생성하기
CREATE TABLE MEMBER
(
ID VARCHAR2(50),
PWD VARCHAR2(50),
NAME VARCHAR2(50),
GENDER VARCHAR2(50),
AGE NUMBER,
BIRTHDAY VARCHAR2(50),
PHONE VARCHAR2(50),
REGDATE DATE
);
DROP TABLE MEMBER;
자료형
character 형식(문자)
예시 : ‘hyeonjun’ ‘a’ ‘1466’
CHAR(3)//괄호 안에 숫자로 크기를 지정해준다.(이때 크기는 고정된 크기의 데이터를 할당하기 때문에 id처럼 사용자에 따라 길이가 가변적인 데이터에는 부적절하다)
VARCHAR2(30)//괄호안에 숫자로 크기를 지정해준다.(이때 크기는 최대값을 지정해주고 사용하지 않는 데이터는 반환한다.)(데이터를 구분자를 이용해서 구분하기 때문에 데이터 탐색에 있어서 검색속도가 낮다는 단점이있다.)
NCHAR(2)//전세계의 다양한 언어가 들어올때에 사용함
NVARCHAR2(23)//전세계의 다양한 언어가 들어올때에 사용함
LOB 형식(큰데이터)
LONG //대용량 텍스트 데이터 타입 (최대 2gb)(최근 등장한 CLOB을 조금더 선호하는편)
CLOB //대용량 텍스트 데이터 타입(최대 4gb)
NCLOB//대용량 텍스트 유니코드 데이터 타입 (최대 4gb)
numeric형식(숫자)
예시 : 45, 4.5, 43.43
NUMBER(4)//최대 4자로 이루어진 숫자
NUMBER(4,2)//소수점 2자리를 포함하는 최대 4자리의 숫자
NUMBER //=NUMBER(38,*)
NUMBER(*,5)
data 형식(날짜)
date : ‘2013-02-09’
TIMESTAMP : ‘2013-06-03 10.38.29.0000’
테이블 수정하기(ddl)
테이블 컬럼 수정
ALTER TABLE MEMBER MODIFY ID NVARCHAR2(50);
테이블 컬럼 삭제
ALTER TABLE MEMBER DROP COLUMN AGE;
테이블 컬럼 추가
ALTER TABLE MEMBER ADD EMAIL VARCHAR2(200);
데이터 조작하기(dml)
Insert
INSERT INTO <테이블> VALUES <값목록>
모든 필드값을 입력하기
INSERT INTO MEMBER VALUES(’’);
원하는 필드만 원하는 순서대로 입력하기//입력하지 않은 값은 NULL값으로 채워진다.
INSERT INTO MEMBER(ID,PWD) VALUES(’ididid’, ‘pwpwpw’);
SELECT
SELECT문에는 FROM / WHERE / GROUP BY/ HAVING / ORDER BY가 있다.
실행 순서 : FROM→ CONNECT BY → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
FROM : 기본적인 격자형 테이블을 마련한다.
SELECT id as user_id,name,pwd FROM MEMBER;
WHERE : 조건에 맞는것들만 필터링하게 된다.
SELECT * FROM NOTICE WHERE HIT > 3; //WHERE을 이용해 조건을 충족 할 수 있다.
GROUP BY : 집계함수
SELECT WRITER_ID,COUNT(ID) FROM NOTICE GROUP BY WRITER_ID;// WRITER_ID를 기준으로 ID가 몇개씩 존재하는지 카운트
HAVING : 집계 함수를 필터링
SELECT WRITER_ID,COUNT(ID) COUNT FROM NOTICE GROUP BY WRITER_ID HAVING COUNT(ID)<=2 ORDER BY COUNT DESC;
ORDER BY : 집계결과를 정렬
SELECT * FROM MEMBER WHERE NAME LIKE '김%' ORDER BY AGE ASC;
SELECT * FROM MEMBER ORDER BY NAME ASC;//오름차순 정렬
SELECT * FROM MEMBER ORDER BY NAME DESC;//내림차순 정렬
//만일 정렬했을때 동일한 값을 가지고 있다고 한다면 쉬표를 이용해 추가 조건을 주면 된다.
SELECT * FROM MEMBER WHERE NAME LIKE '김%' ORDER BY AGE ASC,BIRTHDAY ASC;
서브쿼리(부조회)
개념 : 구절의 순서를 바꿔야 하는경우 사용됨(즉, 정렬을 먼저 하고 상위 5개의 결과를 출력해야 하는 경우에 사용)
SELECT * FROM
(SELECT * FROM NOTICE ORDER BY REGATE DESC)
WHERE ROWNUM BETWEEN 1 AND 5;
------------------------------------------------
SELECT *
FROM MEMBER
WHERE AGE>=(SELECT AVG(AGE) FROM MEMBER);
UPDATE
UPDATE MEMBER SET PWD='dojepw123',name='홍길동' WHERE ID='dojeid';
DELETE
DELETE MEMBER WHERE PWD='dojepwpw';
트랜잭션
트랜잭션이란? 업무 실행단위
예를 A session에서 어떠한 업무를 진행 중일때에 B session에서 같은 값에대해 다른 행동을 하게 되면 데이터에 결함이 발생하게 된다. 이러한 문제를 해결하기 위해서 하나의 업무단위인 트랜잭션이라는 개념이 필요하다. 즉 commit 이전까지의 내용은 임시 저장소에 저장되지만 commit을 한 시점에는 이 임시저장소에서 영구 저장소로 저장되게 된다.
commit;
roleback;
오라클 연산자
- 산술 연산자 : +, -, *, /문자열끼지 더하고 싶으면 ||를 이용해 줘야 한다 3||10 → 310
SELECT NAME||'('||ID||')' AS NAME_ID FROM MEMBER- 1+’3’과 같이 문자열과 숫자를 더하면 4로 숫자로 변환된다.
- 비교 연산자 : =,≠,^=,<>,<,>,≤,≥,IS NULL, IS NOT NULLselect 할때에 WHERE문을 이용해서 조건을 추가하여 사용할 수 있다.
SELECT * FROM NOTICE WHERE HIT > 3; //WHERE을 이용해 조건을 충족 할 수 있다.- ^=,<> : ≠와 같은 의미다.
- 관계 연산자 : NOT, AND, OR, BETWEEN, IN
IN : 아래 두 코드가 동일한것을 생각하면 좋다.SELECT * FROM NOTICE WHERE (0<=HIT)AND(HIT<3); SELECT * FROM NOTICE WHERE HIT BETWEEN 0 AND 2; SELECT * FROM NOTICE WHERE (0=HIT)OR(HIT=2)OR(HIT=7); SELECT * FROM NOTICE WHERE HIT IN (0,2,7);- BETWEEN : 아래 두 코드가 동일한것을 생각하면 좋다.
- 패턴 연산자 : LIKE, %,_
//'강'씨 성을 조회하시오 SELECT * FROM MEMBER WHERE NAME LIKE '강%'; //'강'씨 성을 가진 외자 회원을 조회하시오 SELECT * FROM MEMBER WHERE NAME LIKE '강_';- 정규식을 이용한 패턴 비교
시작할때에는 ^ 끝날때에는 ${}안에 숫자만큼 반복시킴 쉼표를 이용해서 {3,4} 3번 혹은 4번 반복시킴\D : 0-9가 아닌것이 와야함? : 없거나 있거나SELECT * FROM MEMBER WHERE REGEXP_LIKE(PHONE ,'^01[016-9]-\d{3,4}-\d{4}$');- : 0 이상
- :1이상
- | : or연산자
- \w : 0-9A-Za-z를 대변함
- \d : 0-9를 대변함
- []안에 조건을 작성하면 한글자를 대변함
- https://regexlib.com/CheatSheet.aspx
- 행을 제한하기
SELECT * FROM (SELECT ROWNUM AS NUM, MEMBER.* FROM MEMBER) WHERE NUM BETWEEN 6 AND 10;- 중복값 제거하기
SELECT DISTINCT AGE FROM MEMBER;
오라클 함수
문자열 함수
문자열 자르기
//SELECT SUBSTRB('<문자열>',자르기 시작할 지점,몇개의 글자를 자를지) FROM DUAL; // 실행 결과 HE
SELECT SUBSTRB('HELLO',1,2) FROM DUAL; // 실행 결과 HE
SELECT SUBSTRB('HELLO',2) FROM DUAL; // 실행 결과 ELLO
문자열 합치기
SELECT CONCAT('홍','길동') FROM DUAL;
// == '홍'||'길동'
문자열 공백 제거 함수
SELECT LTRIM(' HELLO ') FROM DUAL;//왼쪽 공백 삭제
SELECT RTRIM(' HELLO ') FROM DUAL;//오른쪽 공백 삭제
SELECT TRIM(' HELLO ') FROM DUAL;//양쪽 공백 삭제
문자열 대소문자 변경
SELECT LOWER('dOJe BeLOG') FROM DUAL; // 모두 소문자로 변환
SELECT UPPER('dOJe BeLOG') FROM DUAL; // 모두 대문자로 변환
문자열 대치 함수
SELECT REPLACE('WHERE WE ARE','WE','YOU') FROM DUAL;// WE를 YOU로 변환해줌
SELECT TRANSLATE('WHERE WE ARE','WE','YOU') FROM DUAL;// 모든 W는 Y로 모든 E는 O로 변화
문자열 패딩 함수
SELECT LPAD('HELLO',10,'*') FROM DUAL; //*****HELLO
SELECT RPAD('HELLO',10,'*') FROM DUAL; //HELLO*****
문자열 첫 글자 대문자 변환
SELECT INITCAP('kang hyeonjun') FROM DUAL;//Kang Hyeonjun
문자열 검색 함수
SELECT INSTR('ALL WE NEED TO IS JUST TO','TO') FROM DUAL;//13반환
SELECT INSTR('ALL WE NEED TO IS JUST TO','TO',15) FROM DUAL;//24반환 3번째 인자에 의해서 15번째 문자부터 검색함
SELECT INSTR('ALL WE NEED TO IS JUST TO','TO',1,2) FROM DUAL;//24반환 4번째 인자에 의해서 2번째로 찾은 문자의 위치 반환해줌
문자열 길이를 얻는 함수
SELECT LENGTH('WHERE WE ARE') FROM DUAL;
코드값 반환 함수
SELECT ASCII('A') FROM DUAL;
SELECT CHR(65) FROM DUAL;
숫자 함수
절대값을 구하는 함수
SELECT ABS(35),ABS(-35) FROM DUAL;
음수/양수를 알려주는 함수
SELECT SIGN(35),SIGN(-35),SIGN(0) FROM DUAL;
//양수는 1, 음수는 -1, 0은 0
숫자의 반올림 값을 알려주는 함수
SELECT ROUND(34.34323,2),ROUND(34.56789,3) FROM DUAL;
숫자의 몫/나머지 값을 반환하는 함수
SELECT TRUNC(17/5),MOD(17,5) FROM DUAL;
숫자의 제곱/제곱근을 구하는 함수
SELECT POWER(5,2),SQRT(25) FROM DUAL;
날짜 함수
현재 시간을 얻는 함수
SELECT SYSDATE,CURRENT_DATE,SYSTIMESTAMP,CURRENT_TIMESTAMP FROM DUAL;
//SYSDATE = oracle이 설치된 서버의 시간 기반
//CURRENT = session설정에 따른 시간 기반(접속자)
//TIMESTAMP의 경우는 MS까지 얻어주기 때문에 더 정밀한 시간을 얻어줌
시간 출력 포멧변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SESSION의 기준 시간 변경
ALTER SESSION SET TIME_ZONE ='09:00';
날짜 추출 함수
SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;
SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL;
SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL;
SELECT EXTRACT(SECOND FROM SYSDATE) FROM DUAL;
SELECT EXTRACT(MINUTE FROM SYSDATE) FROM DUAL;
날짜를 누적하는 함수
SELECT ADD_MONTHS(SYSDATE,1) FROM DUAL;
SELECT ADD_MONTHS(SYSDATE,-1) FROM DUAL;
날짜의 차이를 알아내는 함수
SELECT MONTHS_BETWEEN(SYSDATE,REGDATE) FROM MEMBER;
다음 요일의 날짜를 알려주는 함수
SELECT NEXT_DAY(SYSDATE,'월')FROM DUAL;
SELECT NEXT_DAY(SYSDATE,'월요일')FROM DUAL;
이번달의 마지막 날짜를 알려주는 함수
SELECT LAST_DAY(SYSDATE) FROM DUAL;
지정된 범위에서 날짜를 반올림 하는/ 자르는 함수
SELECT ROUND(SYSDATE,'CC'),TRUNC(SYSDATE,'CC') FROM DUAL;//세기 단위로 반올림.버림
SELECT ROUND(SYSDATE,'YEAR'),TRUNC(SYSDATE,'YEAR') FROM DUAL;//년 단위로 반올림.버림
SELECT ROUND(SYSDATE,'Q'),TRUNC(SYSDATE,'Q') FROM DUAL;//분기 단위로 반올림.버림
SELECT ROUND(SYSDATE,'MONTH'),TRUNC(SYSDATE,'MONTH') FROM DUAL;//월 단위로 반올림.버림
SELECT ROUND(SYSDATE,'W'),TRUNC(SYSDATE,'W') FROM DUAL;//1월 1일 기준 한주 단위로 반올림.버림
SELECT ROUND(SYSDATE,'DAY'),TRUNC(SYSDATE,'DAY') FROM DUAL;//날짜 단위로 반올림.버림
SELECT ROUND(SYSDATE,'D'),TRUNC(SYSDATE,'D') FROM DUAL;//일-토 한주 단위로 반올림.버림
SELECT ROUND(SYSDATE,'HH'),TRUNC(SYSDATE,'HH') FROM DUAL;//시간 단위로 반올림.버림
SELECT ROUND(SYSDATE,'MI'),TRUNC(SYSDATE,'MI') FROM DUAL;//분 단위로 반올림.버림
변환 함수
숫자 → 문자열
TO_CHAR()
SELECT TO_CHAR(12345678,'$9999999999.99') FROM DUAL;
| 포맷 문자 | 설명 |
|---|---|
| 9 | 숫자 |
| 0 | 빈자리를 채우는 문자 |
| $ | 앞에 $표시 |
| , | 천 단위 구분자 표시 |
| . | 소수점 표시 |
문자열 → 날짜
TO_DATE()
SELECT TO_DATE('2019-01-22 12:33:03','YYYY-MM-DD HH:MI:SS') FROM DUAL;
//문자열을 날짜로 변환할때에는 포맷문자를 굳이 작성하지 않아도 괜찮다.
| 포맷문자 | 설명 |
|---|---|
| YYYY | 년도 표시 |
| MM | 월 표시 |
| DD | 일 표시 |
| AM / PM | 오전 오후 표시 |
| HH / HH24 | 시간 표시 |
| MI | 분 표시 |
| SS | 초 표시 |
날짜→ 문자열
TO_CHAR()
SELECT TO_CHAR(SYSDATE,'YYYY.MM.DD / HH:MI:SS') FROM DUAL;
| 포맷문자 | 설명 |
|---|---|
| YYYY | 년도 표시 |
| MM | 월 표시 |
| DD | 일 표시 |
| AM / PM | 오전 오후 표시 |
| HH / HH24 | 시간 표시 |
| MI | 분 표시 |
| SS | 초 표시 |
문자열 → 숫자
TO_NUMBER()
SELECT TO_NUMBER('222')FROM DUAL;
NULL 관련 함수
반환값이 NULL일경우에 대체값을 제공하는 함수
SELECT NVL(AGE,0) FROM MEMBER;//NULL인경우 연산
SELECT NVL(AGE,,TRUNC(AGE/10)*10,0) FROM MEMBER;//NOT NULL인경우 / NULL인 경우 연산
두 값이 같은경우 NULL 아닌경우 첫번째 값 반환
SELECT NULLIF(AGE,20) FROM MEMBER;
조건에 따른 값 선택하기
SELECT DECODE(GENDER,'남자',1,2)FROM MEMBER;//동일 한 경우에 1 선택 아닌 경우 2선택 인자를 여러개 주어줄 수 있다.
집계함수
개수를 세는 함수
SELECT COUNT(NAME) FROM MEMBER;
요소들 합을 구하는 함수
SELECT SUM(AGE) FROM MEMBER;
요소들 평균 구하는 함수
SELECT AVG(AGE) FROM MEMBER;
순위함수
ROWNUM을 부여하면서 정렬하는 방법 (정렬한 이후에 ROWNUM을 부여하는 방식)
SELECT ROW_NUMBER() OVER(ORDER BY HIT DESC),NOTICE.* FROM NOTICE;
ROWNUM이 아닌 랭크를 부여하며 정렬하는 방법
**SELECT RANK() OVER(ORDER BY HIT DESC),NOTICE.* FROM NOTICE;**
랭크를 부여할때에 공동 등수이후의 등수를 증가시키지 않는 방법
SELECT DENSE_RANK() OVER(ORDER BY HIT DESC),NOTICE.* FROM NOTICE;
그룹을 지정해서 해당 그룹단위로 랭크 하는법
SELECT RANK() OVER(**PARTITION BY WRITER_ID** ORDER BY HIT DESC),NOTICE.* FROM NOTICE;
조인(JOIN)-관계
INNER JOIN
데이터 테이블 간에 참조 관계 부여하기
부모 - 자식 테이블 간의 관계가 형성됨
관계가 있는 테이블끼리만 연결됨
SELECT *
FROM MEMBER INNER JOIN NOTICE ON MEMBER.NAME= NOTICE.WRITER_ID;
OUTER JOIN
관계가 없는 테이블들도 연결해줌
LEFT / RIGHT / FULL을 명시해줌으로써 OUTER을 연결해줄 수 있다.
왼쪽의 OUTER를 포함시킨다
SELECT *
FROM MEMBER LEFT OUTER JOIN NOTICE ON MEMBER.NAME= NOTICE.WRITER_ID;
오른쪽의 OUTER를 포함시킨다
SELECT *
FROM MEMBER RIGHT OUTER JOIN NOTICE ON MEMBER.NAME= NOTICE.WRITER_ID;
양쪽의 OUTER를 포함시킨다
SELECT *
FROM MEMBER FULL OUTER JOIN NOTICE ON MEMBER.NAME= NOTICE.WRITER_ID;
OUTER JOIN을 이용한 게시글 목록 조회
SELECT M.NAME,N.WRITER_ID,COUNT(N.ID)
FROM MEMBER M
LEFT OUTER JOIN
NOTICE N ON M.NAME=N.WRITER_ID
GROUP BY M.NAME,N.WRITER_ID;
SELF JOIN
자기자신을 조인 하는 경우(예시 : 사원목록에서 부서관계, 댓글과 댓글간의관계 등)
//왼쪽 오른쪽 둘다 MEMBER가 들어오지만, 별칭을 다르게 설정해주어야 한다.
SELECT M.* ,B.NAME BOSS_ID
FROM MEMBER M
LEFT OUTER JOIN
MEMBER B ON B.ID=M.BOSS_ID;
유니온
조인은 컬럼간에 합치는 과정이었다면 유니온의 경우는 컬럼을 늘리는게 아닌 레코드를 합치는 작업이다.
유니온의 경우 크게 4가지가 있다.
- UNION : 앞 레코드와 뒷레코드 간에 데이터중 겹치는 값이 아닌 차이가 나는 값만 뒷 레코드에서 가져와서 앞 레코드에 추가해준다.
- MINUS : 앞 레코드와 뒷레코드 간에 데이터중 겹치는 값을 앞 레코드에석 제거시킨다.
- INTERSECT : 앞 레코드와 뒷레코드 간에 데이터중 겹치는 값만을 남겨둔다.
- UNION ALL : 중복과 상관없이 모든 값을 출력한다.
SELECT ID,NAME FROM MEMBER
UNION
SELECT WRITER_ID,TITLE FROM NOTICE;

뷰
CREATE VIEW <뷰 네임>
AS
~~~~~~~내가 원하는 방식의 코드 방식~~~~~~~~~~
SELECT * FROM <뷰 네임>
데이터 딕셔너리
오라클이 사용자 정보 등등을 저장하는 장소를 데이터 딕셔너리라고 한다.
과거에는 이곳을 뒤져서 테이블, 뷰, 사용자, 권한 등등을 알아 낼 수 있다.(물론 최근에는 윈도우 프로그램덕분에 이를 사용하는경우가 드물어 졌다)
SELECT * FROM USER_TABLES;
SELECT * FROM USER_TAB_COLUMNS;
SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME='MEMBER';
제약조건
데이터를 입력할때에 제약을 거는것!
도메인 제약조건
컬럼 단위로 유효한 값의 범위 제약을 걸어두는것 !
- NOT NULL : 값을 무조건 넣어줘야 할 때에
테이블을 이미 생성한 상태에서 변경하는방법CREATE TABLE MEMBER ( ID VARCHAR2(50) NOTNULL, PWD VARCHAR2(50) NOTNULL, NAME VARCHAR2(50) NOTNULL, GENDER VARCHAR2(50), AGE NUMBER, BIRTHDAY VARCHAR2(50), PHONE VARCHAR2(50), REGDATE DATE ); ALTER TABLE TEST MODIFY EMAIL VARCHAR(200) NOT NULL;- 테이블을 생성할 때 적용방법
- DEFAULT : 기본값을 시스템에서 지정할때에
테이블을 이미 생성한 상태에서 변경하는 방법CREATE TABLE MEMBER ( ID VARCHAR2(50, PWD VARCHAR2(50), NAME VARCHAR2(50), GENDER VARCHAR2(50), AGE NUMBER, BIRTHDAY VARCHAR2(50), PHONE VARCHAR2(50), REGDATE DATE DEFAULT SYSDATE ); ALTER TABLE TEST MODIFY EMAIL VARCHAR(200) DEFAULT '111';- 테이블을 생성할때에 부여하는 방법
- CHECK : 유효값 확인
테이블을 이미 생성한 상태에서 변경하는 방법CREATE TABLE MEMBER ( ID VARCHAR2(50, PWD VARCHAR2(50), NAME VARCHAR2(50), GENDER VARCHAR2(50), AGE NUMBER, BIRTHDAY VARCHAR2(50), PHONE VARCHAR2(50) CHECK(PHONE LIKE '010-%-___'), REGDATE DATE DEFAULT SYSDATE ); ALTER TABLE TEST ADD CONSTRAINT CK_TEST_PHONE CHECK(PHONE LIKE '010-%-___');- 테이블을 생성할때에 부여하는 방법
- 정규식을 이용한 체크 제약조건
ENTITY 제약조건
PRIMARY KEY & UNIQUE
PRIMARY KEY
NULL과 중복을 허가 하지 않는 제약조건
UNIQUE
NULL은 허용하지만 중복을 허가하지 않는 제약 조건
테이블을 생성할때에 부여하는 방법()
CREATE TABLE MEMBER
(
ID VARCHAR2(50) CONSTRAINT MEMBER_ID_PK PRIMARY KEY,
PWD VARCHAR2(50) PRIMARY KEY,
NAME VARCHAR2(50) UNIQUE,
GENDER VARCHAR2(50),
AGE NUMBER,
BIRTHDAY VARCHAR2(50),
PHONE VARCHAR2(50) CHECK(PHONE LIKE '010-%-___'),
REGDATE DATE DEFAULT SYSDATE
);
CREATE TABLE MEMBER
(
ID VARCHAR2(50) ,
PWD VARCHAR2(50) ,
NAME VARCHAR2(50),
GENDER VARCHAR2(50),
AGE NUMBER,
BIRTHDAY VARCHAR2(50),
PHONE VARCHAR2(50) CHECK(PHONE LIKE '010-%-___'),
REGDATE DATE DEFAULT SYSDATE
CONSTRAINT MEMBER_ID_PK PRIMARY KEY(ID),
CONSTRAINT MEMBER_NAME_UK UNIQUE(NAME)
);
테이블을 이미 생성한 상태에서 변경하는 방법
ALTER TABLE TEST ADD CONSTRAINT CK_TEST_PHONE PRIMARY KEY(ID);
ALTER TABLE TEST ADD CONSTRAINT CK_TEST_PHONE UNIQUE(ID);
시퀀스(일련번호)(ENTITY 제약조건에 기본값 부여)
시퀀스 선언
CREATE SEQUENCE NOTICE_ID_SEQ
INCREMENT
BY 1 START WITH 1 MAXVALUE 1 MINVALUE 1 CACHE 20 CYCLE;
//BY : 증분
//START WITH : 시작값
//MAXVALUE : 최대값
//MINVALUE : 최소값
//CACHE : 시퀀스를 가져올때 가져올때 마다 계산하면
//연산속도가 너무 오래걸리기 때문에 한번에 가져올 때 미라 여러개 개산해 오는것
//CYCLE : 최대값 이후에 다시 시작값으로 돌아갈 지 말지
시퀀스 사용
INSERT INTO NOTICE(ID,TITLE,WRITER_ID) VALUES(NOTICE_ID_SEQ.NEXTVAL);'DataBase > Oracle' 카테고리의 다른 글
| Doker를 이용한 Oracle개발 환경 세팅 (0) | 2025.02.07 |
|---|
