빅데이터 Java 개발자 교육 - 24일차 [Oracle 9번째 시간 (평가 전 최종복습, 데이터 부분 수정 및 조회)]

Jun_Gyu·2023년 3월 3일
0
post-thumbnail

금일부로 Oracle의 진도가 끝이나고, 다음주 월요일에 그동안 학습했던 내용들을 바탕으로 평가를 진행하게 된다. 월요일에 칠 평가문제들의 난이도는 아래와 같이 평이한 난이도로 출제가 된다고 하니, 복습을 하는 시간을 가져보도록 하겠다.

Oracle 복습

1. 강의실 테이블 생성

-- 1. 강의실 테이블 생성 CLASSROOM1
-- CODE CHAR1(1)PK, ROOM VARCHAR2(20)
CREATE TABLE clssroom1
(
code        CHAR(1)     NOT NULL,
room        VARCHAR2(20),
 CONSTRAINT PK_classroom1 PRIMARY KEY (code)
);

PK ( Personal Key ) 로는 강의실명 CODE를 지정했다.


2. 테이블에 자료 추가하기

-- 2. 테이블에 자료추가
-- CODE A,B,C,D     ROOM 301호, 302호, 303호, 304호
INSERT INTO clssroom1 (CODE, ROOM)
VALUES('D', '3O4호');
COMMIT;

데이터를 추가할땐 COMMIT;, ROLLBACK; 둘중 하나를 무조건 실행해줘야 한다! (감점요인)


3. 학생 테이블 생성

-- 3. 학생 테이블 생성 STUDENT1
-- NO NUMBER PK
-- NAME VARCHAR2(20) NO NULL
-- CODE CHAR(1)
-- KOR, ENG, MATH NUMBER(3)
-- GRADE VARCHAR2(10) 1학년 ~ 4학년까지만 가능

CREATE TABLE STUDENT1
(
NO          NUMBER,
NAME        VARCHAR2(20)     NOT NULL,
KOR         NUMBER(3),
ENG         NUMBER(3),
MATH        NUMBER(3),
GRADE       VARCHAR2(20),
CODE        CHAR(1),
 CONSTRAINT PK_STUDENT1 PRIMARY KEY (NO)
);

4. 외래키 지정하기

-- 4. 학생 테이블의 CODE는 강의실 CODE의 외래키 제약조건 (제약조건명 : fk_student1_code)
ALTER TABLE STUDENT1 ADD CONSTRAINT fk_student1_code
    FOREIGN KEY (CODE) -- CLASSROOM1
     REFERENCES clssroom1 (CODE); -- STUDENT1

5. 시퀀스 생성하기

-- 5. 시퀀스 생성 seq_student1_no (시작값101, 증가값1)
CREATE SEQUENCE seq_student1_no INCREMENT BY 1 START WITH 101;

6. 시퀀스 활용하여 데이터 추가하기

-- 6. 시퀀스를 이용한 학생 5명 추가
INSERT INTO STUDENT1 (NO, NAME, KOR, ENG, MATH, GRADE, CODE)
VALUES(seq_student1_no.NEXTVAL,'강0', 60, 59, 82, '1학년', 'A');
COMMIT;

7. 조건문으로 데이터 분류하기

--  7. 학생들의 정보 조회. 각 학생의 총합이 250~300 A, 200~249 B, 나머지는 C (학번, 이름, 국어, 영어, 수학, 총합)
SELECT 
    S.NO 학번, S.NAME 이름, 
    S.KOR 국어, S.ENG 영어, S.MATH 수학, 
    CASE
        WHEN( (S.KOR + S.ENG + S.MATH) <=300  AND (S.KOR + S.ENG + S.MATH) >= 250 ) THEN 'A'
        WHEN( (S.KOR + S.ENG + S.MATH) <=249  AND (S.KOR + S.ENG + S.MATH) >= 200 ) THEN 'B' 
        ELSE 'C'
    END 총합
FROM STUDENT1 S;

데이터를 컬럼으로 나타내기 위해서는 IF가 아닌 CASE를 사용해야 한다!


8. GROUP BY로 데이터 분류하기

SELECT 
SUM(S.MATH), -- 수학점수 총합
 S.GRADE -- N학년
FROM STUDENT1 S
GROUP BY S.GRADE ORDER BY S.GRADE ASC; -- 학년을 기준으로 분류

9. 함수 생성하기

-- 9. 함수생성, 시퀀스번호를 반환하는 함수 생성하기 (func_nextval)
CREATE OR REPLACE FUNCTION func_nextval(STUDENT_CODE NUMBER) RETURN NUMBER IS
    TMP_TOTAL NUMBER := 0;
BEGIN
    SELECT S.NO INTO TMP_TOTAL FROM STUDENT1 S WHERE S.NO = STUDENT_CODE
    GROUP BY S.NO;
    RETURN TMP_TOTAL;
EXCEPTION WHEN OTHERS THEN
    RETURN NULL;
END;
/

오늘의 진도

다음으로는 Mybatis를 활용하여 조건에 부합할 시, 데이터의 일부(컬럼 하나하나)를 수정하거나,

검색하고자 하는 내용의 항목을 표현 할 수 있도록 쿼리문을 구성해보았다.

먼저 데이터의 부분수정이다.

1. 데이터 부분수정 (컬럼별로)

	@Update({
		" <script> ",
		" UPDATE MEMBERTB SET MEM_NAME=#{obj.MEM_NAME} ",
		
			" <if test = 'obj.MEM_PHONE != null'> ",
			" , MEM_PHONE =#{obj.MEM_PHONE}  ",
			" </if> ",
			
			" <if test = 'obj.MEM_ADDRESS != null'> ",
			" , MEM_ADDRESS =#{obj.MEM_ADDRESS} ",
			" </if> ",
		" WHERE MEM_ID =#{obj.MEM_ID} ",
		" </script> "
	})
	public int memberUpdateOne(@Param("obj") MemberTB obj);

기본적으로 정보수정의 기준이 되어 줄 'WHERE' 값과 'SET' 바로뒤에 붙어 줄 값이 두개가 필요하며, 위와같은 경우 나는memberTB의 ID값과 NAME값을 기준으로 잡았다. 그 외의 정보들은 입력된 값이 존재할 시 새로운 데이터가 업데이트 되도록 if문을 사용하여 쿼리문을 구성해주었다.


2. 데이터 검색 (부분검색 기능)

SELECT m.* FROM memberTB WHERE MEM_ID LIKE '%' || 'A' || '%' ;
SELECT m.* FROM memberTB WHERE MEM_NAME LIKE '%' || 'A' || '%' ;
SELECT m.* FROM memberTB WHERE MEM_PHONE LIKE '%' || 'A' || '%' ;

Oracle에서는 위와같이 SQL문을 구성하여 해당 값이 포함된 데이터를 조회할 수 있었다.

@Select({
		" SELECT m.* FROM MEMBERTB m WHERE ${map.column} ", // value 값 이외에는 모두 괄호 앞에 $를 붙여주어야 함!!
		" LIKE '%'|| #{map.txt} || '%' "
	})
	public List<MemberTB> MemberLikeList(@Param ("map") Map<String, Object> map);

java에 이어서 Oracle까지 벌써 진도가 끝이났다..

이제 다음주 4일동안 진행될 미니 프로젝트를 위해서 더욱더 증진해야한다.

처음 시도하는 프로젝트인만큼 어느때보다도 긴장되지만, 개발자로서의 커리어를 위한 위대한 발걸음을 한걸음 내딛는것 같아 감회가 새롭다.

이번 기회를 통해 내가 미처 발견하지 못한 내 부족했던 점들을 보완하여 앞으로의 새로운 학습에 있어서 좋은 밑거름이 되었으면 하는 바램이다.

profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글