서브쿼리(Sub Query) 란?

두 개 이상의 SQL 명령문을 하나의 SQL명령문으로 연결하여 처리하는 방법

 

서브 쿼리 종류

단일행 서브쿼리

- 단하나의 행만 검색하여 반환

- 단일행 비교 연산:  =, >, >=, <, <>, <=

 

다중행 서브쿼리

- 서브쿼리에서 반환되는 결과행이 하나 이상일 때 사용하는 서브쿼리

 

  • IN: 하나라도 일치하면 참
  • ANY, SOME: 하나이상 일치하면 참
  • ALL: 모든값이 일치하면 참, max와 같은 뜻
  • EXISTS: 하나라도 존재하면 참 -> 성능개선할 수 있음. 한행이라도 존재하면 나타나고, 아니면 안나타줌.
  • NOT EXISTS: EXISTS의 상반되는 연산자
-- IN
SELECT name, grade, deptno
FROM   student
WHERE  deptno IN ( SELECT deptno
                   FROM   department
                   WHERE  college = 100);
-- ANY            
SELECT studno, name, height, grade
FROM   student
WHERE  height > ANY (SELECT height 
                     FROM   student
                     WHERE  grade = '4');

-- ALL: max와 같은 의미,
SELECT studno, name, height, grade
FROM   student
WHERE  height > ALL (SELECT height 
                     FROM   student
                     WHERE  grade = '4');
-- EXISTS
SELECT profno, name, sal, comm, position
FROM   professor
WHERE  EXISTS (SELECT position
               FROM   professor
               WHERE  sal > 450);

 

PAIRWISE 다중 컬럼 SubQuery

SELECT name, grade, weight
FROM   student
WHERE  (grade, weight) IN (SELECT grade, MIN(weight)
                           FROM   student
                           GROUP BY grade);

 

UNPAIRWISE 다중 컬럼 SubQuery

칼럼을 쌍으로 묶어서 동시에 비교하는 방식

SELECT name, grade, weight
FROM   student
WHERE  grade IN (SELECT grade
                 FROM   student
                 GROUP BY grade)
AND   weight IN (SELECT MIN(weight)
                 FROM student
                 GROUP BY grade);

 

상호연관 SubQuery

칼럼별로 나누어서 비교한 후, AND 연산을 하는 방식

SELECT name, deptno, height
FROM   student s1
WHERE  height > ( SELECT AVG(height)
                  FROM   student s2
                  WHERE  s2.deptno = s1.deptno)
ORDER BY deptno;

 

+ Recent posts