sqldeveloper
다운로드서버주소, 포트번호, 데이터베이스명, 사용자아이디, 암호 입력 후 테스트 클릭
➡️ 상태:성공
인 경우 접속 클릭하면 접속완료
DDL(Data Definition Language)은 데이터 베이스에 데이터를 보관하기 위한 객체를 생성, 변경, 삭제등의 기능을 수행하는 명령어를 말한다
- CREATE : 테이블 생성
- DROP : 테이블 삭제
- ALTER : 테이블 수정(구조 변경)
- RENAME : 테이블 이름 변경
- TRUNCATE : 테이블에 있는 모든 데이터 삭제
- 주석은
—-
를 사용, 단축키crtl
+/
- 도구 - 환경설정 - 코드편집기 - 글꼴 ➡️ 글꼴 크기 조절 가능
- 테이블 생성 후
ctrl
+enter
(작업실행) ⇒ 스크립트 출력창에서 결과를 확인할 수 있다- 부서테이블, 직원테이블은 연습 많이 해보기 ⇒ 추후 평가문제 낼것
- 회원 테이블 생성 : 아이디(문자), 암호(문자), 나이(숫자), 연락처(문자), 성별(문자), 등록일(날짜)
- 제약조건 : 성별을 M 또는 F만 가능, ID는 기본키(고유값, not ull)
- GENDER VARCHAR2(1) 제약조건명 설정 CONSTRAINT MEMBER_GENDER_CK 제약조건 M또는 F만 올 수 있음 CHECK(GENDER IN('M', 'F')),
CREATE TABLE MEMBER(
ID VARCHAR2(30), -- 길이가 30인 문자
PASSWORD VARCHAR2(200),
AGE NUMBER,
PHONE VARCHAR2(15),
GENDER VARCHAR2(1) CONSTRAINT MEMBER_GENDER_CK CHECK(GENDER IN('M', 'F')),
REGDATE TIMESTAMP,
CONSTRAINT PK_MEMBER_ID PRIMARY KEY(ID)
);
-- 테이블 삭제
DROP TABLE MEMBER CASCADE CONSTRAINTS;
-- 테이블명 변경 (원본)MEMBER => (변경)MEMBERTBL
RENAME MEMBER TO MEMBERTBL;
-- 컬럼명 변경 ID => USERID
ALTER TABLE MEMBERTBL RENAME COLUMN ID TO USERID;
-- 컬럼명 변경 PASSWORD => USERPW로 변경하기
ALTER TABLE MEMBERTBL RENAME COLUMN PASSWORD TO USERPW;
-- 컬럼 추가 : TABLE에 이미 DB가 있는데 추가할 항목이 있는 경우 컬럼추가 한다
ALTER TABLE MEMBERTBL ADD ADDRESS VARCHAR2(100);
-- 컬럼의 타입변경 : 위 추가한 컬럼의 글자수 변경 100->150
ALTER TABLE MEMBERTBL MODIFY ADDRESS VARCHAR2(150);
-- 컬럼 삭제
ALTER TABLE MEMBERTBL DROP COLUMN ADDRESS;
게시판 테이블 생성 (BOARD)
테이블 생성시 기본키 제약조건을 주지 않으면 임의의 값이 들어간다
➡️ 임의의 제약조건명SYS_...
가 생성됨
➡️ 테이블 생성시 NO NUMBER PRIMARY KEY로 생성해주면 좋다
➡️ 또는 테이블 생성 후 제약조건을 생성해준다PK_BOARD_NO
ALTER TABLE BOARDTBL ADD CONSTRAINT PK_BOARD_NO PRIMARY KEY(NO);
CREATE TABLE BOARD(
NO NUMBER PRIMARY KEY,
TITLE VARCHAR2(100),
WRITER VARCHAR2(50),
HIT NUMBER,
REGDATE TIMESTAMP,
CONSTRAINT PK_BOARD_NO PRIMARY KEY(NO)
);
-- 테이블명을 BOARDTBL로 변경
RENAME BOARD TO BOARDTBL;
-- 내용 컬럼(CONTENT) 추가
ALTER TABLE BOARDTBL ADD CONTENT VARCHAR2(150);
-- 내용 컬럼을 VARCHAR2(1000) 타입으로 변경
ALTER TABLE BOARDTBL MODIFY CONTENT VARCHAR2(1000);
게시판 테이블 생성 (BOARD)
ITEMTBL 생성 제약조건 없이 생성하기 생성시 이름을 소문자로 작성해도 대문자로 생성된다
물품번호:NO, 물품내용 CONTENT CLOB, 가격 NUMBER, 수량 NUMBER, 등록일 REGDATECREATE TABLE ITEMTBL( NO NUMBER, NAME VARCHAR2(100), CONTENT CLOB, PRICE NUMBER, QUANTITY NUMBER, REGDATE TIMESTAMP );
기본키 제약조건 미설정하고 테이블 생성시 제약조건은 비어있다
제약 조건은
1. 테이블 생성시 제약조건 지정
2. 테이블 생성 후 추가로 제약조건 지정
제약조건 생성시 이름을 지정하지 않고 생성하는 경우 임의로 제약조건의 이름이 지정된다SYS_C0027572
제약조건명을 변경하고 싶은 경우 삭제 후 제약조건을 다시 생성해줘야한다
ALTER TABLE ITEMTBL ADD PRIMARY KEY(NO); -- 제약조건명을 지정하지 않고 제약조건 생성하는 경우 (임의의 제약조건명이 부여됨)
ALTER TABLE ITEMTBL DROP CONSTRAINT SYS_C0027572 CASCADE; -- 제약조건 삭제하는 경우
ALTER TABLE ITEMTBL ADD CONSTRAINT PK_ITEM_NO PRIMARY KEY(NO); -- 제약조건명 PK_ITEM_NO로 지정하여 생성
ALTER TABLE ITEMTBL MODIFY NAME NOT NULL;
NO 주문번호 CNT 주문수량 ITEMNO 물품번호 USERID 주문자 REGDATE 등록일
주문 테이블 제약조건도 같이 생성
CREATE TABLE ORDERTBL(
NO NUMBER,
CNT NUMBER,
ITEMNO NUMBER, --ITEMTBL 의 기본키 타입과 일치
USERID VARCHAR2(30), --MEMBERTBL의 기본키 타입과 일치(VARCHAR2 숫자도 같아야 함)
REGDATE TIMESTAMP,
);
CONSTRAINT PK_ORDER_NO PRIMARY KEY(NO),
CONSTRAINT FK_ITEM_NO FOREIGN KEY (ITEMNO) REFERENCES ITEMTBL(NO),
CONSTRAINT FK_MEMBER_ID FOREIGN KEY (USERID) REFERENCES MEMBERTBL(USERID)
);
부서 테이블 생성(dept)
-- 부서 번호 : DEPTNO 숫자, 부서이름 : NAME 문자(7), 등록일 : REGDATE
CREATE TABLE DEPT(
DEPTNO NUMBER,
NAME VARCHAR2(7),
REGDATE TIMESTAMP
);
부서테이블의 지역을 가변길이 VERCHAR2 20자로 컬럼 추가
ALTER TABLE DEPT ADD AREA VARCHAR2(20);
지역에 서울, 부산, 대구만 가능하게 CHECK 제약조건 설정 *안됨ㅠ
ALTER TABLE DEPT ADD CONSTRAINT DEPT_AREA_CK CHECK (AREA IN ('서울', '부산', '대구'));
--제약 조건 지우기
--ALTER TABLE DEPT DROP CONSTARINT DEPT_AREA_CK
부서번호를 기본키 설정 PK_DEPT_NO
ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT_NO PRIMARY KEY(DEPTNO);
부서이름을 문자 30자로 변경
ALTER TABLE DEPT MODIFY NAME VARCHAR2(30);
ALTER TABLE DEPT MODIFY NAME NOT NULL;
부서이름 UNIQUE 제약조건 추가
UK_DEPT_NAME
ALTER TABLE DEPT ADD CONSTRAINT UK_DEPT_NAME UNIQUE(NAME);
부서 테이블의 UNIQUE 제약조건 삭제
ALTER TABLE DEPT DROP CONSTRAINT UK_DEPT_NAME CASCADE;
제약조건 추가하여 생성
직원 테이블(employee) empno : 직원코드 숫자, 기본키, name : 직원이름 문자(20),deptno : 부서번호 not null,
--pay : 급여 숫자 ,regdate 등록일, position 직급 check제약조건 ('사원','대리','과장')
CREATE TABLE EMPLOYEE(
EMPNO NUMBER,
NAME VARCHAR2(20),
DEPTNO NUMBER,
PAY NUMBER,
REGDATE TIMESTAMP,
POSITION VARCHAR2(20),
CONSTRAINT PK_EMP_NO PRIMARY KEY(EMPNO),
CONSTRAINT EMP_POSITION_CK CHECK (POSITION IN('사원','대리','과장'))
);
부서테이블의
deptno
를 직원테이블의 외래키 제약조건 설정 FK_DEPT_DEPTNO
ALTER TABLE EMPLOYEE ADD CONSTRAINT FK_DEPT_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPT;
--ALTER TABLE EMPLOYEE ADD CONSTRAINT FK_DEPT_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO);
-- 이렇게 하면 안되나용,, 주문테이블 생성시 CONSTRAINT FK_MEMBER_ID FOREIGN KEY (USERID) REFERENCES MEMBERTBL(USERID) 이렇게 제약조건 지정해줫었는데여
DML이란 데이터 베이스에 저장된 데이터나 SELECT문으로 조회한 테이블의 데이터를 추가, 변경, 삭제시 사용하는 명령어를 말한다
- 추가 : INSERT
- 삭제 : DELETE
- 수정 : UPDATE
- 조회 : SELECT
INSERT INTO 테이블명(컬럼명들=생략가능) VALUES(추가할값)
- 컬럼명 생략시 테이블의 순서대로 데이터가 입력된다! VALUES도 순서대로 입력해주어야 한다
INSERT INTO MEMBERTBL VALUES('a','b',12,'010-0000-0000', 'M', CURRENT_DATE);
INSERT
했다고 DB에 등록된게 아니다
➡️COMMIT;
적용 해주어야 DB에 저장된다! COMMIT까지 해줘야 완전히 DB에 등록된 것
➡️ROLLBACK
되돌리기- 데이터에 존재하는
USERID
를 입력하려 하는경우 데이터에 중복되는 기본키가 존재할 수 없으므로,
무결성 제약조건 위배
에 해당하며 기본키가 중복인 데이터는 입력되지 않는다아래의 데이터는 기본키 중복이므로 무결성 제약조건 위배에 해당하기 때문에 아래 데이터는 입력되지 않는다
INSERT INTO MEMBERTBL VALUES('a','b',12,'010-0000-0000', 'M', CURRENT_DATE); INSERT INTO MEMBERTBL VALUES('a','A',20,'010-0000-2222', 'F', CURRENT_DATE);
- 체크 제약조건에 존재하는 조건이 아닌 다른 조건을 입력하려 하는 경우 정해놓은 조건 외의 조건은 입력할 수 없기 때문에
체크 제약조건 위배
에 해당하며 해당 데이터는 입력되지 않는다체크 제약조건 내에 존재한 조건(M,F)가 아닌 다른조건(A)을 입력하려 하므로, 체크 제약조건 위배에 해당하기 때문에 아래 데이터는 입력되지 않는다
INSERT INTO MEMBERTBL VALUES('b','c',12,'010-0000-0001', 'F', CURRENT_DATE); COMMIT;
INSERT ALL
= 일괄추가시 사용INSERT ALL INTO MEMBERTBL VALUES('r','dc',23,'010-0100-1201', 'F', CURRENT_DATE) INTO MEMBERTBL VALUES('d','dfe',17,'010-0100-1101', 'F', CURRENT_DATE) INTO MEMBERTBL VALUES('e','de',24,'010-0100-0131', 'M', CURRENT_DATE) INTO MEMBERTBL VALUES('f','ff',29,'010-0100-0541', 'M', CURRENT_DATE) SELECT * FROM DUAL;
- 컬럼명 순서 바꾸어 입력해도 된다! VALUES에 지정한 컬럼명과 일치하는 순서 입력해주면 된다
➡️ 컬럼명 입력 안하면 테이블 순서대로 입력된다
SELECT * FROM BOARDTBL;
INSERT INTO BOARDTBL(NO, TITLE, WRITER, HIT, REGDATE, CONTENT) VALUES( SEQ_BOARDTBL_NO.NEXTVAL , '제목8', 'BBB', 1, CURRENT_DATE, '내용');
INSERT INTO BOARDTBL(NO, TITLE, WRITER, HIT, REGDATE, CONTENT) VALUES( SEQ_BOARDTBL_NO.NEXTVAL , '제목9', 'GGG', 1, CURRENT_DATE, '내용');
INSERT INTO BOARDTBL(NO, TITLE, WRITER, HIT, REGDATE, CONTENT) VALUES( SEQ_BOARDTBL_NO.NEXTVAL , '제목10', 'EE', 1, CURRENT_DATE, '내용');
INSERT INTO BOARDTBL(NO, TITLE, WRITER, HIT, REGDATE, CONTENT) VALUES( SEQ_BOARDTBL_NO.NEXTVAL , '제목11', 'DDD', 1, CURRENT_DATE, '내용');
INSERT INTO BOARDTBL(NO, TITLE, WRITER, HIT, REGDATE, CONTENT) VALUES( SEQ_BOARDTBL_NO.NEXTVAL , '제목12', 'AAA', 1, CURRENT_DATE, '내용');
COMMIT;
NO
에 들어갈 시퀀스 생성
- CREATE SEQUENCE SEQ_BOARDTBL_NO START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCACHE;
- 시퀀스 명
SEQ_BOARDTBL_NO
- 1부터 시작
START WITH 1
- 1씩 증가
INCREMENT BY 1
- 끝번호 없음(최대값 지정X)
NOMAXVALUE
- 캐시사용안함
NOCACHE
🌎참고 ➡️ 캐시 사용하면 속도는 빠르나 데이터가 많아지는 경우 과부하가 걸릴 수 있다
💡
INSERT ALL
에서는 시퀀스 사용이 불가하다
INSERT ALL
은 하나의 쿼리문으로 인식되어 nextval이 같은 값으로 들어간다
PK의 값을 시퀀스의nextval
을 사용해서 생성할 경우에는INSERT ALL
을 사용 할 수 없다
➡️ 🌎참고 함수를 만들어서 처리하는 방법이 있긴하다!
DROP SEQUENCE [시퀀스 명]
UPDATE 테이블명 SET 컬럼명 = 바꿀 변경값들.. WHERE = 조건
- 수정시 바꿀 조건은 반드시 존재해야 한다! 조건 없이 수정하는 경우 모든 데이터를 다 바꿔버릴수도 있다 😱
- 데이터 수정 후
ROLLBACK
사용하면 수정 전 데이터로 돌아간다
- 글번호 2번의 제목과 작성자 수정
+ 변경 ⇒ 조회 ⇒ 롤백 ⇒ 변경 ➡️ 원래의 데이터
UPDATE BOARDTBL SET TITLE='변경제목', WRITER='변경작성자' WHERE NO=2;
SELECT * FROM BOARDTBL;
ROLLBACK;
SELECT * FROM BOARDTBL;
- 글번호 6번의 제목,내용,작성자 수정
UPDATE BOARDTBL SET TITLE='제목변경', CONTENT='내용변경' , WRITER='작성자변경' WHERE NO=6;
SELECT * FROM BOARDTBL;
- 조회수 증가 ➡️ 기존의 HIT 에서 1을 더하여 다시 넣어준다
UPDATE BOARDTBL SET HIT=HIT+1 WHERE NO=3;
SELECT * FROM BOARDTBL;
UPDATE 테이블명 SET 컬럼명(WHEN 조건 THEN 조건만족시 리턴값), ... WHERE 조건
일괄적으로 여러줄의 항목 변경
- 글 번호가 3,4,5 인 데이터의 제목과 작성자를 일괄 수정하기
WHERE NO IN(3,4,5);
은WHERE NO=3 OR NO=4 OR NO=5
와 같은 뜻이다
UPDATE BOARDTBL SET
TITLE=(CASE
WHEN NO=3 THEN '제목333'
WHEN NO=4 THEN '제목444'
WHEN NO=5 THEN '제목555'
END),
WRITER = (CASE
WHEN NO=3 THEN '작성자3'
WHEN NO=4 THEN '작성자4'
WHEN NO=5 THEN '작성자5'
END)
WHERE NO IN(3,4,5);
COMMIT;
SELECT * FROM BOARDTBL;
DELETE FROM 테이블명 WHERE 조건;
- 삭제시 바꿀 조건은 반드시 존재해야 한다! 조건 없이 삭제하는 경우 모든 데이터가 삭제될수도 있다 😱
DELETE
했다고 DB에 등록된게 아니다!DELETE
실행 후COMMIT
나ROLLBACK
이용해줘야 한다
➡️COMMIT;
적용 해주어야 DB에서 완전히 삭제된다!
➡️ROLLBACK
으로 삭제된 데이터를 되돌릴 수 있다
BOARDTBL
에서NO
가 5인 데이터를 삭제
DELETE FROM BOARDTBL WHERE NO=5;
조회수가 2보다 큰것만 삭제
➡️ DELETE 는 조건이 없으면 모든 데이터가 지워지기 때문에 조건을 잘 확인해야 한다!
DELETE FROM BOARDTBL WHERE HIT >= 2;
COMMIT;
- 아이템 시퀀스 생성(SEQ_ITEM_NO) 시작값은 1001
CREATE SEQUENCE SEQ_ITEM_NO START WITH 1001 INCREMENT BY 1 NOMAXVALUE NOCACHE;
- 생성된 시퀀스 이용하여 물품 5개 추가
- 한줄씩 바꾸며 등록해도 되지만 한번에 다 쓰고 등록해도 된다
- 같은 데이터를 입력해도 시퀀스를 이용해 주어지는
no
가 다르기 때문에 같은 내용의 데이터가 입력가능
➡️ PK(기본키)만 중복되지 않으면 됨
INSERT INTO ITEMTBL(NO, NAME, CONTENT, PRICE, QUANTITY, REGDATE)
VALUES(SEQ_ITEM_NO.NEXTVAL, 'a','a',111,222, CURRENT_DATE);
INSERT INTO ITEMTBL(NO, NAME, CONTENT, PRICE, QUANTITY, REGDATE)
VALUES(SEQ_ITEM_NO.NEXTVAL, 'a','a',111,222, CURRENT_DATE);
INSERT INTO ITEMTBL(NO, NAME, CONTENT, PRICE, QUANTITY, REGDATE)
VALUES(SEQ_ITEM_NO.NEXTVAL, 'a','a',111,222, CURRENT_DATE);
-- 등록 완료후 커밋
SELECT * FROM ITEMTBL;
COMMIT;
- 물품번호가 1002번인것의 수량을 10000, 가격을 9999로 변경
UPDATE ITEMTBL SET QUANTITY=10000, PRICE=9999 WHERE NO = 1002;
-- 등록 완료후 커밋
SELECT * FROM ITEMTBL;
COMMIT;
- 수량이 100 미만인 것만 삭제
DELETE FROM ITEMTBL WHERE QUANTITY < 100;
-- 등록 완료후 커밋
SELECT * FROM ITEMTBL;
COMMIT;
SELECT 컬럼명 FROM 테이블명 조건 정렬;
SELECT * FROM ITEMTBL;
➡️ 원래는*
자리에 컬럼명이 들어가야 한다
➡️*
이 들어가면 전체조회 가능! 하지만 보통*
을 잘 안쓴다
SELECT NO, TITLE, WRITER FROM BOARDTBL;
정렬 ORDER BY 컬럼명 ASC | DESC
➡️ASC
오름차순,DESC
내림차순
SELECT NO, TITLE FROM BOARDTBL ORDER BY NO DESC;
SELECT NO, TITLE FROM BOARDTBL WHERE NO > 5 ORDER BY NO DESC;
- 정확히 A인것만 조회
SELECT * FROM BOARDTBL WHERE TITLE = 'A';
- 제목에 1이 포함된 것만 내림차순으로 조회
정렬은 제일 마지막에 한다! 조건에 해당하는 데이터 가져오고 나서 정렬해야 한다
🌎참고 Like 사용하여 전체 검색 및 특정 조건 검색SELECT * FROM BOARDTBL WHERE TITLE LIKE '%' || '1' || '%' ORDER BY NO DESC;
- 전체 게시물의 숫자 세기
SELECT COUNT(*) FROM BOARDTBL;
- 전체 게시물 수 중 조회수가 5이상인 게시물만 조회
SELECT COUNT(*) FROM BOARDTBL WHERE HIT > 5;
SELECT FROM 구문으로 출력될 결과에 ALIAS(AS)를 사용하여, 변수(컬럼)를 알아보기 쉽도록 적당한 별칭을 붙여 준다
이때 테이블 원본 데이터베이스의 내용은 변경되지 않는다!
* 오라클에서는 그냥 한칸 띄어써도 별칭이 지정된다! 굳이 Alias 사용하지 않아도 지정되니 그냥 한칸 띄어 사용해도 무방함
🌎참고 Alias, AS : 검색 결과의 컬럼에 별칭을 붙여 테이블 조회
아래와 같이 조회하는 경우 검색 결과의 컬럼에 별칭이 붙어 조회되는것을 확인 할 수 있다
SELECT NO, TITLE 제목 , WRITER 작성자 FROM BOARDTBL;
- 물품의 물품번호, 이름, 가격,수량 만 조회
SELECT NO, NAME, PRICE, QUANTITY FROM ITEMTBL;
- ITEMTBL 에서 QUANTITY를 내림차순 기준으로 NO, NAME, PRICE, QUANTITY 조회
SELECT NO, NAME, PRICE, QUANTITY FROM ITEMTBL ORDER BY QUANTITY DESC;
- 가격이 10000 ~ 19900인 것만 조회 (WHERE 조건 AND 조건 사용)
SELECT NO, NAME, PRICE, QUANTITY FROM ITEMTBL WHERE PRICE >=10000 AND PRICE <=19900;
- 재고수량이 100이상이면서 가격이 20000이상 인것을 날짜 내림차순 기준으로 조회(OR)
SELECT NO, NAME, PRICE, QUANTITY, REGDATE FROM ITEMTBL WHERE QUANTITY >=100 OR PRICE >=20000 ORDER BY REGDATE DESC;
🌎참고 Pagination/Paging 의 여러가지 처리 방법
- SELECT 된 결과에서 순번을 매겨야 하는 경우 오라클에서
ROWNUM
을 사용한다
➡️SQL은 LIMIT이 있는데 오라클은 없기 때문에 ROWNUM을 이용하여 Pagination을 구현한다BOARDTBL B = B.*;
사용하면 BOARDTBL을 B로 축약하여 사용할 수 있다
➡️B.*;
의 형태로 사용하는 이유는 컬럼명을 간략화 하여 전체적으로 쿼리문이 축약되기도 하고다른 컬럼과 같이 사용하기 위해 간략화가 필요하다
- 번호매기기
ROW_NUMBER()
=ROWN
변수명 지정SELECT B.*, ROW_NUMBER () OVER (ORDER BY NO DESC) ROWN FROM BOARDTBL B;
- 번호를 매긴 조회결과
ROWN
를 가상의 테이블이라 생각하고 SELECT의 테이블 위치에 넣기
+ 조건지정HERE ROWN BETWEEN 11 AND 20;
= ROWN이 11과 20사이에 존재하는 데이터 조회
SELECT B.*, ROW_NUMBER () OVER (ORDER BY NO DESC) ROWN FROM BOARDTBL B;
를 하나의 가상의 테이블로 본다
➡️ 가상의 테이블 안에 존재하는ROWN
은 BOARD에는 없는 데이터이다! 데이터에는 없는 부여된 번호이다
SELECT * FROM (
SELECT B.*, ROW_NUMBER () OVER (ORDER BY NO DESC) ROWN FROM BOARDTBL B
) WHERE ROWN BETWEEN 11 AND 20;
💡 위 처럼 여러개의 테이블에서 가상의 테이블 만들고 자유자재로 연결할 수 있어야 한다