본문 바로가기

배우기/복습노트[oracle sql]

[복습] SQL | Oracle join 넘어 또 산, 서브쿼리 (3)

728x90
반응형

마지막 서브쿼리인 스칼라 서브쿼리

여기서 스칼라 란 '하나의'라는 뜻이며, 스칼라 서브쿼리는 select절에 사용되는 서브쿼리이다(컬럼처럼 쓰기 위함).

스칼라 서브쿼리는 각 행마다 하나의 행이 리턴되어야 한다.

join의 대체 문법이기도 하다.

 

예시로 살펴보자.

예) 각 직원의 이름, 급여, 부서명을 출력하여라(단, 부서명은 스칼라 서브쿼리로 표현할 것).

이렇게 표현하면 ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다. 라는 ORA 메시지가 출력된다.

스칼라 서브쿼리만을 선택해서 실행하면 아래와 같이 보이듯이, 각 행마다 출력되는 서브쿼리 결과가 총 4개이기 때문이다.

 

 

이렇게 표현하면 ORA-00904: "D"."DEPTNO": 부적합한 식별자 라는 ORA 메시지가 뜬다.

앞으로 자주 보는 메시지가 될 건데 그 이유는 오타일 경우에 자주 보이기도 하고, 서브쿼리 절에 정의되지 않는 컬럼을 메인쿼리에 요구하는 경우에도 쓰이기 때문이다.

 

 

이렇게 where 조건을 서브쿼리 안에 넣어주면 제대로 코드가 작동한다.

 

728x90

 

 

바로 연습문제 두 문제를 풀어보자.

 

연습문제 1. 각 학생의 이름, 학년, 시험성적을 스칼라 서브쿼리를 사용하여 풀어보아라.

 

여기서 student가 아니라 exam_01 테이블을 메인 쿼리에 두지 않는 이유는 무엇일까.

exam_01 테이블 기준으로 하게 됨되면 아래와 같이 작성을 해야하는데 이는 성능 문제를 유발시킨다.

 

 

연습문제 2. 각 학생의 이름, 학년, 지도교수 이름을 출력하여라. 지도교수가 없는 경우도 출력하여라.

 

outer join 조건이 없는데 왜 지도교수가 없는 학생들도 다 출력이 될까.

그 이유는 메인쿼리에 where절이 없어 조건을 검색하지 않기 때문이다.

 

위 코드를 join으로 풀어보면,

 

15명만 출력되는데 메인쿼리 where절에서 데이터를 제한하므로 조건에 맞지 않아 나머지 다섯 학생은 생략되었기 때문이다.

 

즉 두 쿼리는 언뜻보면 유사하지만 메인쿼리의 where절 유무로 출력 결과가 달라진다.

outer join의 (+)를 신경쓰고 싶지 않을 때 저렇게 쓰는 사람들이 많지만 매번 질의를 계속해야하는 것 때문에 성능에 좋지는 않다.

 

 

마지막으로 예제 하나를 더 풀어보자.

이 예제는 여러 테이블이 있을 경우 하나만 메인쿼리, 나머지 정보는 스칼라 서브쿼리로 표현하는 것인데, 어떤 테이블을 메인으로 둘 건지 고민을 하는 문제이다.

student, hakjum, exam_01 테이블을 사용하여 각 학생의 이름, 성적, 학점을 출력하여라.

 

이 테이블은 student - exam_01 - hakjum 관계이므로 메인쿼리에 exam_01을 앞에 두고 풀었다.

 

 

여기까지 서브쿼리가 끝났다.

이제 조금 수월해질까?

728x90
반응형