DATABASE(oracleDB 11g)/SQL

[SQL]서브쿼리(SUBQUERY)의 추가내용_01

SEUNGSAMI 2019. 2. 8. 12:14

서브쿼리(SUBQUERY)의 추가내용_01


1편 기초 : https://seungsami.tistory.com/62



1
2
3
4
5
6
7
8
9
10
11
--아래 두개의 쿼리문은 같은 결과를 가져온다.
SELECT * 
FROM EMP 
WHERE SAL >ALL (SELECT AVG(SAL)
                FROM EMP 
                GROUP BY DEPTNO) ; 
SELECT * 
FROM EMP 
WHERE SAL > (SELECT MAX(AVG(SAL))
             FROM EMP 
             GROUP BY DEPTNO) ;
cs


두개이상의 컬럼을 비교할 수 있는 서브쿼리의 예는 다음과 같다.

1
2
3
4
5
SELECT * 
FROM EMP 
WHERE (DEPTNO,SAL) IN (SELECT DEPTNO, MIN(SAL)
                        FROM EMP 
                        GROUP BY DEPTNO) ; 
cs

이와 같이 할 경우 두개의 행을 비교 가능하다.

(MULTIPLE COLUMN SUBQUERY)


서브쿼리를 이용해서 JOIN을 할경우 다음의 예시를 보자

1
2
3
4
5
6
7
8
SELECT *
FROM EMP E,
     (SELECT DEPTNO, AVG(SAL) AS AVG
      FROM EMP
      GROUP BY DEPTNO) A
WHERE E.DEPTNO = A.DEPTNO
  AND E.SAL > A.AVG;
--A.AVG(SAL)을 쓰는 경우 에러가 발생하는데, 그 이유는 SAL이라는 것 자체는 서브쿼리에 정의되어있지 않기 때문
cs


아래 예시를 참고하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SELECT *
FROM EMP
WHERE SAL >2000;
 
SELECT *
FROM EMP E
WHERE SAL > (SELECT AVG(SAL)
             FROM EMP
             WHERE DEPTNO = E.DEPTNO);
--위의 경우 서브쿼리의 결과가 많을 경우 시간이 오래걸릴 수 있다.
--하지만 걸리는 시간은 처음 나올 50개의 행만 적용된다. 그러므로 시간이 오래 걸릴 필요는 없다
 
SELECT *
FROM SALES S
,(SELECT PROD_ID, AVG(AMOUNT_SOLD) AS AVG 
  FROM SALES
  GROUP BY PROD_ID) A
WHERE S.PROD_ID = A.PROD_ID
  AND S.AMOUNT_SOLD > A.AVG;
--FROM 처리시간이 조금더 길지라도 결과를 산출해내기만 할때 사용하는 방식이다.(평균값[AVG(AMOUNT_SOLD)]을 화면으로 가지고 나올 수가 있다..)
 
SELECT *
FROM SALES S
WHERE AMOUNT_SOLD > (SELECT AVG(AMOUNT_SOLD)
                     FROM SALES
                     WHERE PROD_ID = S.PROD_ID);
--결과를 보고 처리를 해야할때 사용하는 방식이다.(평균값[AVG(AMOUNT_SOLD)]을 화면으로 가지고 나올 수가 없다.)
--화면에 무엇을 표현하고 싶냐에 따라 사용하는 방법이 달라진다. 위의 방법 이외에도 여러가지 방법이 있다.
cs


다음 두개의 쿼리문의 결과는 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT *
FROM SALES S
,(SELECT PROD_ID, AVG(AMOUNT_SOLD) AS AVG 
  FROM SALES
  GROUP BY PROD_ID) A
WHERE S.PROD_ID = A.PROD_ID
  AND S.AMOUNT_SOLD > A.AVG;
 
SELECT *
FROM SALES S
WHERE AMOUNT_SOLD > (SELECT AVG(AMOUNT_SOLD)
                     FROM SALES
                     WHERE PROD_ID = S.PROD_ID);
cs




SQL을 배운지 얼마 되지 않아 잘못된 내용이 있을 수 있습니다. 틀린 내용이있다면, 댓글로 달아주세요.



'DATABASE(oracleDB 11g) > SQL' 카테고리의 다른 글

[SQL]서브쿼리(SUBQUERY)의 종류  (0) 2019.02.08
[SQL]이름 지정 규칙  (0) 2019.02.08
[SQL]계정 생성 및 삭제(oracle DB 11g)  (0) 2019.02.01
[SQL]VIEW 의 기초  (0) 2019.02.01
[SQL]제약 조건(Constraints)  (1) 2019.02.01