본문 바로가기
Today I learned

[SQL] 서브쿼리 정리

by soheemon 2020. 1. 23.
오라클DATABASE 11g와 함께하는 SQL과 PL/SQL책을 참고로 학습 한 내용입니다.

최근에는 REST-API로 받은 JSON 데이터를 뿌려주는 작업을 주로 해와서, SQL 작성하는 방법을 잊어가고 있다..

그러다 이번 프로젝트에서 SQL문을 작성하거나 기작성된 SQL문을 해석할 일이 많아질것 같으므로.. 근 1년만에 SQL복습을 시작한다.

사실, 학원에서는 과정을 따라가기 급급해서, 실제 내부동작에는 관심갖을 시간이 없었다.

이번에는 '결과'보다는 '과정'에 중점을 두어 학습하려고 한다.

서브쿼리

SQL 명령문내에 서브 쿼리가 사용되면 서브 쿼리를 먼저 실행하여 그 결과 값을 메인쿼리로 반환하고, 반환된 값을 메인 쿼리에서 사용한다.

+ FROM에서 subquery를 사용하는것을 inlineView라고 한다.

서브쿼리 사용시 주의사항

  • 서브 쿼리가 반환하는 행의 수는 expr또는 연산자가 기대하는 행의 개수와 일치해야 한다. 마찬가지로 서브쿼리가 반환하는 열의 수는 expr또는 연산자가 기대하는 열의 개수와 일치해야 한다.
  • 서브쿼리는 ORDER BY 절을 사용하지 않는다.
  • 메인 쿼리의 FROM절에 있는 테이블의 컬럼은 서브쿼리 내에서 사용 할 수 있으나, 서브쿼리의 FROM절에 있는 테이블의 컬럼은 메인쿼리에서 사용할 수 없다.

1) 단일행 서브쿼리

서브쿼리의 결과값이 단일 행이며, 단일 컬럼이나 다중 컬럼으로 반환된다.

단일행 서브쿼리

의도에 따라 다르겠지만, 메인쿼리의 expr에 따라 서브쿼리가 반환해야 하는 컬럼, 행의 개수를 일치 시켜야 함을 기억하자.

 

2) 다중행 서브쿼리

다중 행 연산자와 함께 사용해야 한다. 다중 행 연산자로 IN, ANY, SOME, ALL, EXISTS 연산자가 있다.

다중행 연산자는 단일 연산자와는 다르게 레코드가 여러개일때도 연산이 가능한 연산자이다.

 

  • IN 연산자

메인쿼리의 비교 조건이 서브 쿼리의 결과와 비교하여 '하나라도'일치하면 참이 되는 연산자이다.

 

 

 

 

 

 

 

 

 

 

 

mainQuery의 record를 훑어 내려가면서.. subQuery의 항목들과 하나하나 대조를 한다. 그래서 점수와 과목명이 일치하는것이 있으면 반환한다.

 

 

 

 

 

 

 

 

 

 

 

IN연산자는 OR로 변경이 가능하다.

결국 서브쿼리의 내용이

과목명 = '수학' AND 점수 = '70' AND

과목명 = '과학' AND 점수 = '15' AND..

이렇게 펼쳐진다고 보면 된다.

 

 

 

  • ANY 연산자

 

main query의 비교조건이 subQuery의 결과 중에서 하나이상 일치하면 참이 되는 연산자이다.

비교조건으로 >=, 등 단일연산자와 함께 사용이 가능하다.

옆의 예제를 예로 들면, mainQuery의 Score가 subQuery의 Score중 하나 이상이라도 크다면 출력하게 된다.

 

 

 

 

 

 

 

 

 

  • ALL 연산자

 

ANY연산자와 마찬가지로, 단일연산자와 사용 가능하지만, ANY와 다르게 mainQuery가 subQuery의 모든 레코드에 대해서 조건을 만족해야 출력한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3) 상호관련 부속질의어

  • 서브쿼리에서 메인쿼리의 값을 참조하고, 서브쿼리의 결과값을 다시 메인쿼리가 참조하는 부속 질의어를 말한다.
  • 상호관련 부속 질의어는 WHERE절에 EXISTS, ANY, ALL 연산자를 이용하며, 서브쿼리의 결과 행에 따라 TRUE가 되거나 FALSE가 된다.
  • 서브쿼리에서 메인쿼리의 컬럼을 참조 할 수 있다, 그러나 서브쿼리의 컬럼은 메인쿼리에서 참조하지 못한다.

 

4) 서브 쿼리를 이용한 테이블 생성

댓글