실습문제 1. professor_1을 professor와 동일하게 만들고 홈페이지가 없는 직원들은 email_id를 사용하여 다음과 같이 변경하여라.
양선희의 경우 => http://www.test.com/lamb1
먼저 내 코드 결과이다.
내 결과 16번 짤림ㅎ
선생님이 이 방법은 안좋은 예라고 하셨다.
한번의 테이블 스캔으로 가능한 쿼리를 서브쿼리를 사용하여 테이블을 두 번 스캔하는 방식이기 때문이다.
아래는 선생님 해설이다.
실습문제 2. student_1의 테이블을 student과 동일하게 만들고 제1의 전공번호가 301인 학생들과 출생년도와 동일한 학생들을 삭제하여라(제1의 전공번호가 301인 학생 포함)
선생님은 extract 안 쓰시고 to_char로 사용하였다.
실습문제 3. student_3을 student 테이블과 동일하게 만든 후 모든 학생의 주민번호를 아래와 같은 형태로 수정하여라(그에 필요한 조치까지). 7510231901813 → 751023-1901813
이 문제를 풀면서 주의해야 할 점이 있는데
update student_3
set jumin = substr(jumin,1, 6)||'-'||substr(jumin, 7);
하면 에러가 발생한다.
컬럼 사이즈가 문제인가 싶어
alter table student_3 modify jumin char(14);
이렇게 변경한 후에 다시
update student_3
set jumin = substr(jumin,1, 6)||'-'||substr(jumin, 7);
시도하면 또 컬럼사이즈 부족 에러가 난다.
왜냐하면 - 로 인하여 문자열이 하나씩 늘어나는데 글자 개수를 명확히 지정하지 않으면 char 타입의 경우에는 기존 데이터가 있다고 해도 공백을 하나씩 만들어낸다.
고정형이므로 자리수를 바꿀때마다 공백이 생긴다. 이걸 substr로 들고 오면 공백도 같이 오게 되는 것이다.
계속 한 자리씩 올리다보면 어느 순간 되는 구간이 있는데 그건 max 구간이기 때문이다.
해결방법은 update를 할 때 varchar2로 하거나 또는 substr(jumin,7,7)로 작성하면 된다.
즉 char 타입으로 사이즈를 끝까지 늘리면 데이터 뒤에 공백들이 추가적으로 붙기 때문에 substr으로 마지막까지 추출 시 공백까지 추출되어 원하는 문자의 길이보다 긴 문자열이 추출될 수 있다.
실습문제 4. 계좌 정보가 0보다 큰 경우는 입금 정보이고 0보다 작은 경우는 신용카드 사용 내역이다.
매 월 신용카드 사용 횟수가 3회 미만이거나 총 사용금액이 100 이하인 경우는 패널티를 매달 5 부여한다(-5).
총 12개월 마다의 패널티가 계산된 계좌 총 합을 구하여라.
이 문제에 접근할 때에는 반대로 패널티를 부여하지 않은 쪽에 집중하면 해결할 수 있다.
즉 매월 신용카드 사용횟수가 3회 이상이고 총 사용금액이 100 초과인 경우 패널티를 부여하지 않겠다고 접근해보자.
나는 이 문제에 처음 손을 댔을 때의 코드가 각 월마다의 사용횟수와 사용합을 도출해냈고 그 이후로 진행을 못했다.
나중에 나 혼자 다시 풀어봐야겠다.