티스토리 뷰

문법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT select_list
FROM   table
WHERE  expr operator
                     ( SELECT select_list
                       FROM   table );
 
-- ( ) 부분 먼저 실행 후 바깥 부분 실행
-- 1. SELECT select_list
--  FROM table 실행
-- 2. SELECT select_list
--  FROM table
--  WHERE expr operator 실행
 
-- Subquery == Inner Query
-- 기존 바깥 쿼리 구문 == Main Query == Outer Query
-- 쿼리 구문안에 쿼리 구문이 또 들어가 있는 상태
-- 나도 모르는 부분을 필요로 할 때 서브쿼리를 작성
-- 우리에게 보이는 건 메인 쿼리구문이다.
 
-- 서브 쿼리는 연산자 오른쪽에 위치하여야 한다.
-- 좌변 서브쿼리 작성 X
-- 반드시 ()로 묶어야 한다.
-- WHERE, FROM, SELECT, HAVING, ORDER BY 절에서 사용가능
-- (GROUP BY 절 제외한 모든 절에서 작성 가능함)
cs






1. Subquery란?


Who has a salary greater than Abel's?


Main Query : Which employees have salaries greater than Abel's salary?

Subquery : What is Abel's salary?


1
2
3
4
5
6
7
8
SELECT last_name, salary
FROM employees
WHERE salary > 
               ( SELECT salary
                 FROM employees
                 WHERE last_name = 'Abel');
 
-- 서브 쿼리부분이 11000 대신에 들어감
cs



 




1
2
3
4
5
6
7
8
9
SELECT last_name, job_id, salary
FROM employees
WHERE salary = 
               ( SELECT MIN(salary)
                 FROM   employees );
 
-- 서브 쿼리부분이 2500 대신에 들어감
-- 최소 급여 선택
-- 한 명이 오거나 여러 명이 올 수 있다.
cs

 

 





1
2
3
4
5
6
7
8
9
10
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > 
                     ( SELECT MIN(salary)
                       FROM employees 
                       WHERE department_id = 50 );
 
-- 서브 쿼리 부분이 2500 대신에 들어감
-- HAVING : 행 그룹 제한 조건문
cs



 


2. Inline View - From절에 Subquery가 작성된 경우


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
-- FROM : 테이블명 쓰던 곳
-- 서브쿼리를 먼저 실행한다
 
SELECT a.last_name,
       a.salary,
       a.department_id,
       b.salavg
FROM employees a JOIN
                      ( SELECT department_id,
                        AVG(salary) salavg
                        FROM employees
                        GROUP BY department_id) b
ON a.department_id = b.department_id
WHERE a.salary > b.salavg;
 
-- () 서브 쿼리 부분
-- 가상의 테이블 뷰 = Inline View
-- FROM 절에 서브 쿼리가 작성된 경우
 
-- 부서별 평균 값을 가진 테이블
-- a 테이블과 가상의 b 테이블을 JOIN 함
 
-- 기존에 WHERE 대신에 AND가 적용되어있었지만
-- AND 대신에 WHERE로 변경
-- AND 쓸 수 있지만 오라클에선 권장하진않는다.
cs



연습 문제


1. employees 테이블로부터 평균 이상의 급여를 받는 모든 사원의 employees_id, last_name, salary를 출력하되 salary를 기준으로 오름차순 정렬하여 출력하시오.


1
2
3
4
5
6
SELECT employee_id, last_name, salary
FROM employees
WHERE salary >=
                ( SELECT avg(salary)
                  FROM employees )
ORDER BY salary;
cs



 

공지사항
최근에 올라온 글
Total
Today
Yesterday