영보의 SystemOut.log

[Oracle] Sub Query(서브쿼리) 종류와 예제(1) 본문

Database/Oracle

[Oracle] Sub Query(서브쿼리) 종류와 예제(1)

영보로그 2020. 11. 10. 13:49
반응형

 개념 정리

 

#  JOIN vs Sub Query


조인

서브쿼리
  - 여러개의 테이블에서 필요한 데이터 모아서 수집  
    => 단점  : SELECT
 
 - 여러개의 SQL문장을 한 개로 통합 
      => DML 전체에서 사용이 가능

 

 

# Sub Query (서브쿼리) : 하나의 쿼리 안에 또 다른 하나의 쿼리가 담겨 있는 것

 - 문법 & 종류

1

2

3

4

5

SELECT select_list

FROM TABLE 조건 또는 View

WHERE 조건 연산자 (SELECT select_list

                  FROM talble

                  WHERE 조건);

cs

종류

설명

단일행 서브쿼리

 서브쿼리의 결과값이 1개

다중행 서브쿼리

 서브쿼리의 결과가 여러개

인라인 뷰

 FROM (SELECT~)

스칼라 서브쿼리

  컬럼 대신 사용

  SELECT empno, ename, (SELECT~) as dname

 

 

# Sub Query 작성시 주의사항

- Sub Query 부분은 WHERE절에 연산자 오른쪽에 위치해야 하면 반드시 괄호로 묶어야 함

- 특별한 경우를 제외하고는 Sub Query절에 Oracle by 절이 올 수 없다

- 단일행 Sub Query와 다중행 Sub Query에 따라 연산자를 잘 선택해야함  

 

 

# PROCEDURE, FUNCTION, PACKAGE, TRIGGER를 제작할 때 사용하는 언어 
    - 함수 : 사용자 정의로 사용 => 목적 (재사용) 
    - PROCEDURE : 리턴형이 없는 => 자바스크립트 function func_name(){} 
    - FUNCTION : 리텅형이 있는 함수 
     = 함수       독립 
     = 메소드     클래스 종속 
    - PACKAGE : 관련된 PROCEDURE, FUNCTION을 모아서 둔 곳  
    - TRIGGER : 이미 지정된 이벤트가 발생시에 자동 처리  
                                  INSERT, UPDATE, DELETE 

 

# 단일행 Sub Query (Single ROW Sub Query)

 - 결과 값이 1개의 행만 출력되는 것

 - 가장 일반적으로 사용되는 유형

 - Sub Query를 수행한 결과가 1건만 나오고, 이 결과를 Main Query로 전달해서 Main Query를 수행하게 됨

 - Where 절에 사용 되는 연산자 : 비교연산자 =, !=(<>) , <=, >=, <, >

 

 

 

 

 

 예제

 

# 예제

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
29
30
31
32
33
34
35
36
37
38
39
-- emp테이블 => 사원의 평균 급여 => 평균보다 적게 받는 사원 정보를 출력
 
SELECT * FROM emp WHERE sal<AVG(sal);
 
 
SELECT * FROM emp WHERE sal < AVG(sal);
 
 
SELECT AVG(sal) FROM emp;
 
 
SELECT * FROM empWHERE sal<2073;
 
 
SELECT * FROM emp WHERE sal<(SELECT AVG(sal) FROM emp);
 
--서브쿼리는()
 
 
--SCOTT => scott가 근무하는 부서에 같이 근무하는 사원의 모든 정보 출력
SELECT deptno FROM emp WHERE ename='SCOTT';
 
 
 
SELECT * FROM emp WHERE deptno=20;
 
 
SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename='SCOTT');
 
 
SELECT * FROM emp WHERE deptno=(SELECT DISTINCT deptno FROM emp); -- 오류가 남 ===> 다중행 서브쿼리
 
 
SELECT DISTINCT deptno FROM emp;
 
 
--GROUP BY
--사원의 평균 급여 보다 높은 부서의 부서번호, 인원수를 출력
SELECT deptno, COUNT(*FROM emp GROUP BY deptno HAVING AVG(sal)<(SELECT AVG(sal) FROM emp);
cs
반응형