20220906 [Oracle]

Yeoonnii·2022년 9월 6일
0

TIL

목록 보기
21/52
post-thumbnail

💻 오라클 환경설정

  1. 자바 설치 완료 후
  2. sqldeveloper 다운로드
    공식 홈페이지에서 로그인 후 다운로드
  3. 실행 후 새 접속 생성

📠 오라클 접속하기

서버주소, 포트번호, 데이터베이스명, 사용자아이디, 암호 입력 후 테스트 클릭
➡️ 상태:성공인 경우 접속 클릭하면 접속완료

📌 DDL (데이터 정의어)

🌎참고 링크

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);

📙 회원 테이블 컬럼 type변경

-- 컬럼의 타입변경 : 위 추가한 컬럼의 글자수 변경 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);

📙 게시판 테이블 컬럼 type변경

-- 내용 컬럼을 VARCHAR2(1000) 타입으로 변경
ALTER TABLE BOARDTBL MODIFY CONTENT VARCHAR2(1000);

📃 물품 테이블

📙 물품 테이블 생성

게시판 테이블 생성 (BOARD)
ITEMTBL 생성 제약조건 없이 생성하기 생성시 이름을 소문자로 작성해도 대문자로 생성된다
물품번호:NO, 물품내용 CONTENT CLOB, 가격 NUMBER, 수량 NUMBER, 등록일 REGDATE

CREATE 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로 지정하여 생성

📙 물품 테이블 NAME컬럼 NOT NULL로 설정

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);

📙 부서 테이블 NAME컬럼 변경

부서이름을 문자 30자로 변경

ALTER TABLE DEPT MODIFY NAME VARCHAR2(30);

📙 부서 테이블 NAME컬럼 NOT NULL로 설정

ALTER TABLE DEPT MODIFY NAME NOT NULL;

📙 부서 테이블 고유값(UNIQUE) 제약조건 추가

부서이름 UNIQUE 제약조건 추가 UK_DEPT_NAME

ALTER TABLE DEPT ADD CONSTRAINT UK_DEPT_NAME UNIQUE(NAME);

📙 부서 테이블 고유값(UNIQUE) 제약조건 삭제

부서 테이블의 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 (데이터 조작어)

🌎참고 링크

DML이란 데이터 베이스에 저장된 데이터나 SELECT문으로 조회한 테이블의 데이터를 추가, 변경, 삭제시 사용하는 명령어를 말한다

  • 추가 : INSERT
  • 삭제 : DELETE
  • 수정 : UPDATE
  • 조회 : SELECT

DB 추가/삭제/수정/조회

📃 INSERT(추가)

  • 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;

📕 여러데이터를 한번에 추가 - 1

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;

📕 여러데이터를 한번에 추가 - 2

  • 컬럼명 순서 바꾸어 입력해도 된다! 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(수정)

  • 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(삭제)

  • DELETE FROM 테이블명 WHERE 조건;
  • 삭제시 바꿀 조건은 반드시 존재해야 한다! 조건 없이 삭제하는 경우 모든 데이터가 삭제될수도 있다 😱
  • DELETE 했다고 DB에 등록된게 아니다! DELETE실행 후 COMMITROLLBACK 이용해줘야 한다
    ➡️ COMMIT; 적용 해주어야 DB에서 완전히 삭제된다!
    ➡️ ROLLBACK 으로 삭제된 데이터를 되돌릴 수 있다

📕 데이터 삭제

BOARDTBL에서 NO가 5인 데이터를 삭제

DELETE FROM BOARDTBL WHERE NO=5;   

📕 조건범위가 있는 데이터 삭제

조회수가 2보다 큰것만 삭제
➡️ DELETE 는 조건이 없으면 모든 데이터가 지워지기 때문에 조건을 잘 확인해야 한다!

DELETE FROM BOARDTBL WHERE HIT >= 2;
COMMIT;

📋 실습문제

[문제1] 시퀀스 생성

  • 아이템 시퀀스 생성(SEQ_ITEM_NO) 시작값은 1001
CREATE SEQUENCE SEQ_ITEM_NO START WITH 1001 INCREMENT BY 1 NOMAXVALUE NOCACHE;

[문제2] 시퀀스 이용하여 데이터 추가

  • 생성된 시퀀스 이용하여 물품 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;

[문제3] 조건을 이용한 데이터 수정

  • 물품번호가 1002번인것의 수량을 10000, 가격을 9999로 변경
UPDATE ITEMTBL SET QUANTITY=10000, PRICE=9999 WHERE NO = 1002;

-- 등록 완료후 커밋
SELECT * FROM ITEMTBL;
COMMIT;

[문제4] 조건을 이용한 데이터 삭제

  • 수량이 100 미만인 것만 삭제
DELETE FROM ITEMTBL WHERE QUANTITY < 100;

-- 등록 완료후 커밋
SELECT * FROM ITEMTBL;
COMMIT;

📃 SELECT(조회)

  • SELECT 컬럼명 FROM 테이블명 조건 정렬;
  • SELECT * FROM ITEMTBL;
    ➡️ 원래는 * 자리에 컬럼명이 들어가야 한다
    ➡️ * 이 들어가면 전체조회 가능! 하지만 보통 *을 잘 안쓴다
BOARDTBL에서 NO, TITLE만 조회하기
SELECT NO, TITLE, WRITER FROM BOARDTBL;

📕 정렬하여 조회

  • 정렬 ORDER BY 컬럼명 ASC | DESC
    ➡️ ASC 오름차순, DESC 내림차순
BOARDTBL에서 NO, TITLE만 내림차순 조회
SELECT NO, TITLE FROM BOARDTBL ORDER BY NO DESC;
BOARDTBL에서 NO가 5보다 큰 NO, TITLE만 내림차순 조회
SELECT NO, TITLE FROM BOARDTBL WHERE NO > 5 ORDER BY NO DESC;

📕 조건이 있는 조회

  1. 정확히 A인것만 조회
SELECT * FROM BOARDTBL WHERE TITLE = 'A'; 
  1. 제목에 1이 포함된 것만 내림차순으로 조회
    정렬은 제일 마지막에 한다! 조건에 해당하는 데이터 가져오고 나서 정렬해야 한다
    🌎참고 Like 사용하여 전체 검색 및 특정 조건 검색
SELECT * FROM BOARDTBL WHERE TITLE LIKE '%' || '1' || '%' ORDER BY NO DESC;

📕 전체 게시물 수 조회

  1. 전체 게시물의 숫자 세기
SELECT COUNT(*) FROM BOARDTBL;
  1. 전체 게시물 수 중 조회수가 5이상인 게시물만 조회
 SELECT COUNT(*) FROM BOARDTBL WHERE HIT > 5;

📕 검색 결과의 컬럼에 별칭을 붙여 테이블 조회

SELECT FROM 구문으로 출력될 결과에 ALIAS(AS)를 사용하여, 변수(컬럼)를 알아보기 쉽도록 적당한 별칭을 붙여 준다
이때 테이블 원본 데이터베이스의 내용은 변경되지 않는다!
* 오라클에서는 그냥 한칸 띄어써도 별칭이 지정된다! 굳이 Alias 사용하지 않아도 지정되니 그냥 한칸 띄어 사용해도 무방함
🌎참고 Alias, AS : 검색 결과의 컬럼에 별칭을 붙여 테이블 조회

아래와 같이 조회하는 경우 검색 결과의 컬럼에 별칭이 붙어 조회되는것을 확인 할 수 있다

SELECT NO, TITLE 제목 , WRITER 작성자 FROM BOARDTBL;

📋 실습문제

[문제1] 원하는 컬럼만 조회

  • 물품의 물품번호, 이름, 가격,수량 만 조회
SELECT NO, NAME, PRICE, QUANTITY FROM ITEMTBL;

[문제2] 조건이 있는 조회

  • ITEMTBL 에서 QUANTITY를 내림차순 기준으로 NO, NAME, PRICE, QUANTITY 조회
SELECT NO, NAME, PRICE, QUANTITY FROM ITEMTBL ORDER BY QUANTITY DESC;

[문제3] 조건이 있는 조회(WHERE, AND)

  • 가격이 10000 ~ 19900인 것만 조회 (WHERE 조건 AND 조건 사용)
SELECT NO, NAME, PRICE, QUANTITY FROM ITEMTBL WHERE PRICE >=10000 AND PRICE <=19900;

[문제4] 조건이 있는 조회(OR)

  • 재고수량이 100이상이면서 가격이 20000이상 인것을 날짜 내림차순 기준으로 조회(OR)
SELECT NO, NAME, PRICE, QUANTITY, REGDATE FROM ITEMTBL WHERE QUANTITY >=100 OR PRICE >=20000 ORDER BY REGDATE DESC;

📃 Pagination/Paging 처리

🌎참고 Pagination/Paging 의 여러가지 처리 방법

  • SELECT 된 결과에서 순번을 매겨야 하는 경우 오라클에서 ROWNUM을 사용한다
    ➡️SQL은 LIMIT이 있는데 오라클은 없기 때문에 ROWNUM을 이용하여 Pagination을 구현한다
  • BOARDTBL B = B.*; 사용하면 BOARDTBL을 B로 축약하여 사용할 수 있다
    ➡️ B.*;의 형태로 사용하는 이유는 컬럼명을 간략화 하여 전체적으로 쿼리문이 축약되기도 하고다른 컬럼과 같이 사용하기 위해 간략화가 필요하다
  1. 번호매기기
  • ROW_NUMBER() = ROWN 변수명 지정
SELECT B.*, ROW_NUMBER () OVER (ORDER BY NO DESC) ROWN FROM BOARDTBL B;
  1. 번호를 매긴 조회결과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;

💡 위 처럼 여러개의 테이블에서 가상의 테이블 만들고 자유자재로 연결할 수 있어야 한다

0개의 댓글