DB/SQL

[SQL] 서브쿼리(SUBQUERY)

씩씩한 IT블로그 2020. 7. 11. 16:01
반응형

1. 서브쿼리

SELECT *
 FROM EMP
 WHERE DEPTNO = 
  (SELECT DEPTNO FROM DEPT WHERE DEPTNO=10);
--서브쿼리를 이용한 테이블 (인라인 뷰)
SELECT *
 FROM (SELECT ROWNUM NUM, ENAME FROM EMP) A
 WHERE NUM<5;

 

2. IN

SELECT ENAME, DNAME, SAL
 FROM EMP, DEPT
WHERE EMP.DEPTNO=DEPT.DEPTNO
 AND EMP.EMPNO IN (SELECT EMPNO FROM EMP WHERE SAL>2000);

 

3. ALL

--EMP의 DEPTNO가 20보다도 작고, 30보다도 작은것
SELECT * FROM EMP
WHERE DEPTNO <= ALL(20,30);

 

4. 스칼라 서브쿼리

--SELECT AVG(SAL) FROM EMP가 스칼라쿼리. 스칼라쿼리는 반드시 한행과 한열만 반환, 아닐시 오류발생
SELECT ENAME AS "이름", SAL AS "급여", (SELECT AVG(SAL) FROM EMP) AS "평균급여" FROM EMP
WHERE EMPNO=1000;

 

5. GROUP BY

GROUP BY의 칼럼에 대한 SUBTOTAL을 만들어 준다.

(1) ROLLUP 한개

SELECT DECODE(DEPTNO, NULL, '전체합계', DEPTNO),
       SUM(SAL)
  FROM EMP
  GROUP BY ROLLUP(DEPTNO);

DECODE

SUM(SAL)

10

3750

20

10875

30

14400

전체합계

29025

 

(2) ROLLUP 여러개

SELECT DEPTNO, JOB, SUM(SAL)
  FROM EMP
 GROUP BY ROLLUP(DEPTNO, JOB);

DEPTNO

JOB

SUM(SAL)

10

CLERK

1300

10

MANAGER

2450

10

3750

20

CLERK

1900

20

ANALYST

6000

20

MANAGER

2975

30

10875

 

(3) GROUPING (SELECT문에서 설정)

:요소별 합계, 해당 컬럼의 합을 나타낼 때 1, 그렇지 않을 때 0

SELECT DNAME,   GROUPING(DNAME),
       JOB,     GROUPING(JOB),
       COUNT(*) "Total Empl",
       SUM(SAL) "Total Sal"
FROM   EMP, DEPT
WHERE  DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP(DNAME, JOB);

DNAME

GROUPING(DNAME)

JOB

GROUPING(JOB)

Total Empl

Total Sal

SALES

0

CLERK

0

1

950

SALES

0

MANAGER

0

1

2850

SALES

0

SALESMAN

0

4

5600

SALES

0

 

1

6

9400

RESEARCH

0

CLERK

0

2

1900

RESEARCH

0

ANALYST

0

2

6000

RESEARCH

0

MANAGER

0

1

2975

RESEARCH

0

 

1

5

10875

ACCOUNTING

0

CLERK

0

1

1300

ACCOUNTING

0

MANAGER

0

1

2450

ACCOUNTING

0

PRESIDENT

0

1

5000

ACCOUNTING

0

 

1

3

8750

 

1

 

1

14

29025

 

(4) GROUPING SET

각각 따로 합계를 계산

SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY GROUPING SETS(DEPTNO, JOB);

DEPTNO

JOB

SUM(SAL)

-

CLERK

4150

-

SALESMAN

5600

-

PRESIDENT

5000

-

MANAGER

8275

-

ANALYST

6000

30

-

1440

20

-

10875

10

-

3750

 

(5) CUBE

: 결합가능한 모든 집계를 계산

*만약 여기서 where로 조건이 있으면 조건에 맞는 행의 조합만 출력하고 나머지는 출력하지 않는다.

조합하지 않는 독립 속성의 합은 조건문과 상관없이 group by 되지만, 조합한 결합속성은 조건문의 영향을 받는다 (sqld p217 21번문제)

SELECT DEPTNO,JOB,SUM(SAL)
FROM EMP
GROUP BY CUBE(DEPTNO, JOB);

DEPTNO

JOB

SUM(SAL)

-

-

29025

-

CLERK

4150

-

ANALYST

6000

-

MANAGER

8275

-

SALESMAN

5600

-

PRESIDENT

5000

10

-

3750

10

CLERK

1300

10

MANAGER

2450

20

-

10875

20

CLERK

1900

20

ANALYST

6000

20

MANAGER

2975

30

-

14400

30

CLERK

950

30

MANAGER

2850

30

SALESMAN

5600

30

PRESIDENT

5000

반응형