실습문제 1. emp2, p_grade 테이블을 사용하여 각 직원의 나이를 기준으로 직원의 이름, 사번, 생년월일, 나이, 현재 직급(position), 예상 직급(나이로 계산한 직급), 예상 직급에 맞는 최저연봉과 최고연봉 기준을 모두 출력하여라.
내 풀이 먼저 작성하자면,
스칼라 서브쿼리로 작성하였다.
select 절에 컬럼을 하나하나 넣어야 한다는 압박감(?)이 있어서 저렇게 생각해냈는데 선생님 해설은 달랐다.
조건절에서 그냥 바로 필터링하여 select절로 올려버리셨는데, 저 방법이 더 간단한 것을 왜 나는 복잡하게 접근했을까.
실습문제 2. emp 테이블을 사용하여 각 직원의 이름과 상위관리자 이름을 출력하여라. 단, 상위관리자가 없을 경우 본인의 이름을 출력하여라(스칼라서브쿼리 활용할 것)
실습문제 3. emp2, dept2 테이블에서 각 직원과 나이가 같으면서 취미가 같은 직원의 수를 직원의 이름, 부서이름, 취미, pay와 함께 출력하여라(본인 제외, 취미가 같은 동료가 없는 직원도 출력)
이건 선생님 해설과 동일하게 쉽게 접근하여 풀었다.
실습문제 4. student, exam_01 테이블을 사용하여 각 학생의 이름, 학년, 학과명과 함께 같은 학년 내 각 학생보다 시험을 잘 본 학생 수를 출력하여라.
이 문제는 선생님이 자주 경고하셨는데 접근하지 말라는 방식으로 접근하여 틀린 문제이다.
우선 어디서 딜레마에 빠졌냐면,
내가 짠 코드인데, 여기서 학생 20명 중 4명이 빠져있다.
시험을 가장 잘 본 학생 4명이 빠졌는데, 학생수를 0명 처리하여 20명이 다 출력되도록 하고 싶다는 생각이 들었는데, outer join을 하기 위해 (+)를 달다가 알아챈 것이다. 순환구조를 끊지 못했기 때문에 발생한 문제이다.
순환구조를 갖는 4개 테이블은 outer join을 완성할 수 없다. 진행방향대로 outer join을 수행하다보면 결국 시작테이블까지 outer join을 수행하면서 full join이 되기 때문이다.
ansi로 풀어도 정확한 count를 해줄 수 없다.
애초에 시작할 때부터 저 순환 자체를 깨야 한다는 생각을 가져야 한다.
순환구조를 깨기 위해서는 인라인뷰를 사용하여야 한다.
이 코드가 outer join을 달았을 때의 문제이다.
1:다의 관계를 확인해야하는데, 우선
s1.studno는 e1.studno의 정보를 필요로 한다.
그래서 s1 - e1 연결이 된다.
같은 의미로 s2.studno는 e2.studno가 연결이 된다.
s2 - e2
그러면
s1 - e1
s2 - e2
관계가 되어있는데,
s1.grade = s2.grade(+) 의 outer join이 발생한다. 여기서부터 시작으로 치자(시작 위치에 따라 (+)의 기준도 달라지므로 일단 기준부터 잡자).
그러면 위에서 s2는 e2의 정보를 가져오므로, s1과 s2를 이어주는 과정에서 s1-s2(+)-e2(+) 라는 연결이 발생한다.
그러면 s2.studno = e2.studno(+) 이렇게 붙게 되겠다.
그런데 e2는 e1.total < e2.total 비교에서 e1의 데이터를 가져와 비교하므로 e1.total(+) < e2.total 이라는 outer join이 발생한다. 그렇게 되면 e1의 정보는 s1과 연결이 되므로 s1.studno = e1.studno에서 s1.studno(+) = e1.studno outer join이 발생하여 s1-s2(+)-e2(+)-e1(+)-s1(+) 이 되는 순환 구조가 발생하게 되는 것이다.
이거 선생님께 다섯 번 가까이 여쭤보면서 간신히 이해했다.
해결방법은 위에 말했듯이 s1-e1 을 하나의 테이블로, s2 - e2를 하나의 테이블로 치는 인라인뷰를 사용하면 될 것이다.
인라인뷰를 사용하여 풀어보면 아래와 같다.
이 문제 하나 이해하는데 한 시간은 더 걸린 것 같다.
실습문제 5. 학생과 관련된 테이블을 사용하여 아래 형태와 같이 학점별 학생 수를 출력하여라,
학점 학생수
A
B
C
D
나는 A,B,C,D가 들어간 학점 테이블을 만들고 거기에 insert하여 학점 기준을 넣고 hakjum2 테이블로 카운트했다. 코테에서는 이렇게 하면 안된다고 했는데 오늘 4번포함하여 하지 말라고 한 코드대로 다 푼 것 같다. ㅋㅋ
이렇게 하지 말자는 의미로 내가 풀이한 코드도 아래 첨부하고 복습은 여기서 마치겠다.
'배우기 > 복습노트[oracle sql]' 카테고리의 다른 글
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DDL의 ALTER (0) | 2023.11.08 |
---|---|
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DDL의 DROP (0) | 2023.11.07 |
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DDL의 CREATE + 복습후기(20231106) (1) | 2023.11.07 |
[복습] SQL | Oracle join 넘어 또 산, 서브쿼리 (3) (0) | 2023.11.06 |
[실습문제] 2023. 11. 3.(금) 문제 풀이(5문제) (0) | 2023.11.06 |