실습문제 1. emp 테이블에서 각 직원의 이름, 사번, 급여와 함께 각 직원의 같은 부서에 있는 선배(입사일이 빠른) 수를 출력하여라. 단, 선배가 없더라도 출력이 되어야 한다.
먼저 나는 아래와 같은 방법으로 풀었다.
입사일자끼리 비교를 해야하는데, 먼저 들어온 사람 입사일자가 작기 때문에 사원 입사일에서 선배 입사일을 빼면 양수가나오는 것으로 접근하여 해결하였다.
결론적으로는 답은 맞게 나왔는데 선생님은 그냥 바로 날짜 비교를 하셨다. 사원보다 사수 날짜가 더 오래되었기 때문에 사원 날짜가 클 때 카운트를 하도록 하였다.
그리고 여기서 포인트는 outer join에 있다.
동명이인이 없다는 가정 하에 group by를 하면 직원별이라는 그룹이 성립된다. 동명이인이 있을 수 있기 때문에 사원번호로 넣어주는 것이 제일 베스트이다. 사원번호가 유니크하기 때문에 가장 강력한 group by 컬럼이 된다.
선배가 없는 사람도 출력이 되어야 하므로 e2쪽에 모두 (+)을 붙여주었다. 하나라도 안 붙이면 제대로 출력이 되지 않는다.
여기서 또한 e2쪽을 count해야 함을 유의하여야 한다.
이 문제는 self join, outer join, count, group by를 이해해야 풀 수 있는 문제이다.
아래는 선생님 해설이다.
실습문제 2. emp2, dept2 테이블을 사용하여 각 직원의 이름, 출생연도, 직급(position), 부서명을 출력하여라. 단, 직급이 없는 직원은 수습으로 출력한다.
이건 선생님 해설과 일치하고 문제도 간단하여 풀이없이 바로 넘어가겠다. 그냥 join만 하면 해결되는 문제이다.
실습문제 3. student, exam_01, department 테이블을 사용하여 학과별, 성별 시험성적의 평균을 출력하여라(학과는 제1전공으로 할 것)
선생님 풀이와 내 풀이가 크게 다르지 않지만, 일단 참고용으로 둘 다 올려야겠다.
내 풀이
선생님 풀이
여기서 자료는 d - s - e 이런 구조임을 파악할 줄 알면 되는 문제이다.
실습문제 4. professor, department 테이블을 사용하여 각 교수의 소속학과별로 소속교수의 pay의 평균을 구하되, 소속학과명, 소속학과번호, 소속학과 위치와 함께 출력하여라.
이것도 선생님 풀이와 일치하고 금방 해결할 수 있는 문제여서 내 풀이만 첨부하고 넘어가겠다.
실습문제 5. 아래와 같은 정보를 출력하여라(각 평균값의 반올림)
남 여
기계공학과 88 81
멀티미디어공학과 79 87
문헌정보학과 87 79
소프트웨어공학과 84
전자공학과 80 95
컴퓨터공학과 93 92
처음으로 선생님이 내 주신 문제를 전부 풀어가는가 했는데 여기서 막혔다.
물론 아예 손을 못 댄것은 아니다. 그래서 더 아쉬웠다.
왜냐하면 아래와 같이 출력하였기 때문이다.
소프트웨어공학과만 없다. 근데 내가 짠 코드에서 하나만 고치면,
소프트웨어 공학과가 보인다.
먼저 맨 위 결과를 도출한 내 코드이다.
아래는 having 절의 and 를 or로 고치니까 그렇게 나왔다.
둘을 어떻게 잘 처리하거나, 코드에서 한 줄만 추가한다거나, (+)를 어딘가에 하나 붙이기만 하면 해결이 될 것 같아서 혼자 계속 아쉬워했다.
그런데 결론은 아쉬워하지 않아도 된다는 것이다. 그냥 접근 자체를 잘못했다.
오늘 수업을 듣고 다시 코드를 짜보았다.
이렇게 간단하게 해결될 문제를 나는 왜 저렇게 복잡하게 접근했는지도 모를 일이다.
그래도 내가 스스로 고민한 시간이 아깝지 않고 저기서 배운 부분도 많아서 뿌듯했다.
선생님께서는 코드를 짤 때 불필요한 테이블이 많게 설정을 했거나, 생략된 join이 있거나, 그래서 카티시안 프로덕트가 발생했을 수도 있다고 하셨다. 나는 불필요한 테이블을 엄청 생성했다. 불필요한 access를 하는 순간 데이터를 불러올 때부터 튜닝에 난리가 날 수도 있어서 굉장히 불필요한 커리가 된다고 하셨다.
이 문제는 결국 d - s - e의 구조였다.
내 코드 다시 보기 싫네.. 나는 남학생 조인 따로, 여학생 조인 따로 하여 접근을 하려고 했다. 간단한 코드를 보는 순간 내 코드도 다시 해석이 불가한 상태가 되었다.
여기서 마치고 이제 이론 복습해야지.
'배우기 > 복습노트[oracle sql]' 카테고리의 다른 글
[복습] SQL | Oracle join 넘어 또 산, 서브쿼리(1) + 복습후기(20231102) (0) | 2023.11.03 |
---|---|
[복습] SQL | Oracle 첫 번째 마주한 큰 산, join (3) - join 복습 (0) | 2023.11.02 |
[복습] SQL | Oracle 첫 번째 마주한 큰 산, join (2) + 복습후기(20231101) (0) | 2023.11.01 |
[복습] SQL | Oracle 첫 번째 마주한 큰 산, join (1) (0) | 2023.11.01 |
[복습] SQL | Oracle 두 테이블의 결합, 집합연산자(합집합 union, union all, 교집합 intersect, 차집합 minus) (0) | 2023.11.01 |