마지막 서브쿼리인 스칼라 서브쿼리
여기서 스칼라 란 '하나의'라는 뜻이며, 스칼라 서브쿼리는 select절에 사용되는 서브쿼리이다(컬럼처럼 쓰기 위함).
스칼라 서브쿼리는 각 행마다 하나의 행이 리턴되어야 한다.
join의 대체 문법이기도 하다.
예시로 살펴보자.
예) 각 직원의 이름, 급여, 부서명을 출력하여라(단, 부서명은 스칼라 서브쿼리로 표현할 것).
이렇게 표현하면 ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다. 라는 ORA 메시지가 출력된다.
스칼라 서브쿼리만을 선택해서 실행하면 아래와 같이 보이듯이, 각 행마다 출력되는 서브쿼리 결과가 총 4개이기 때문이다.
이렇게 표현하면 ORA-00904: "D"."DEPTNO": 부적합한 식별자 라는 ORA 메시지가 뜬다.
앞으로 자주 보는 메시지가 될 건데 그 이유는 오타일 경우에 자주 보이기도 하고, 서브쿼리 절에 정의되지 않는 컬럼을 메인쿼리에 요구하는 경우에도 쓰이기 때문이다.
이렇게 where 조건을 서브쿼리 안에 넣어주면 제대로 코드가 작동한다.
바로 연습문제 두 문제를 풀어보자.
연습문제 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을 앞에 두고 풀었다.
여기까지 서브쿼리가 끝났다.
이제 조금 수월해질까?
'배우기 > 복습노트[oracle sql]' 카테고리의 다른 글
[복습] 2023. 11. 6.(월) 문제 풀이(5문제) (0) | 2023.11.07 |
---|---|
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DDL의 CREATE + 복습후기(20231106) (1) | 2023.11.07 |
[실습문제] 2023. 11. 3.(금) 문제 풀이(5문제) (0) | 2023.11.06 |
[실습문제] 2023. 10. 31.(화) 문제 풀이(5문제) (0) | 2023.11.05 |
[복습] SQL | Oracle join 넘어 또 산, 서브쿼리 (2) + 복습후기(20231103) (0) | 2023.11.04 |