커리큘럼(12-30/변경)
01. Java
02. git
03. Database (v)
04. Jsp [Server]
05. 미니프로젝트 (3W)
06. HTML,CSS
07. JS
08. SpringFramework , SrpingBoot
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)
SQL
서브쿼리(Sub Query)
- 다른 SELECT 문장의 절에 내장된 SELECT 문장
- 테이블 자체의 데이터에 의존하는 조건으로 테이블의 행을 검색할 필요가 있을 때 유용
서브쿼리 작성 가능한 SQL절
- SELECT 절(스칼라 서브쿼리)
- FROM 절(인라인 뷰)
- WHERE절
- HAVING절
- ORDER BY 절
- INSER 문의 VALUES 절
- UPDATE 문의 SET 절
- CREATE TABLE 문의 AS 절
서브 쿼리 사용시 지켜야할 사항
- 서브쿼리는 괄호로 둘러싸야 함
- 서브쿼리는 비교 연산자의 오른쪽에 있어야 함
- 서브쿼리는 ORDER BY 절을 포함할 수 없음
단일 행 서브쿼리
- SELECT한 결과가 1행인 서브쿼리
- 단일행 서브쿼리는 반드시 하나의 행을 리턴해야 함
SELECT *
FROM EMPLOYEES
WHERE SALARY >= (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME= 'Nancy');
다중 행 서브쿼리
- 서브쿼리가 반환하는 행이 여러행이라면, 다중행 연산자를 쓰면됨
연산자 |
설명 |
IN |
목록의 어떤 값과 같은지 확인 |
ANY, SOME |
값을 서브쿼리에 의해 리턴된 각각의 값과 비교해 하나라도 만족하면 됨 |
ALL |
값을 서브쿼리에 의해 리턴된 모든 값과 비교해 만족해야 함 |
EXISTS |
결과를 만족하는 값이 존재하는지 여부 확인 |
ALL과 ANY의 차이점 |
< ANY : 가장 큰 값보다 작으면 됨 > ANY : 가장 작은 값보다 크면 됨 < ALL : 가장 작은 값보다 작아야 함 > ALL : 가장 큰 값보다 커야 됨 = ANY : IN과 같은 역할 |
-- > ANY: 최소값 4800 보다 큰 데이터
SELECT *
FROM EMPLOYEES
WHERE SALARY > ANY (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME='David');
-- < ANY : 최대값 9500 보다 작은 데이터
SELECT *
FROM EMPLOYEES
WHERE SALARY < ANY (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME='David');
-- > ALL : 최대값 9500보다 큰 데이터
SELECT *
FROM EMPLOYEES
WHERE SALARY > ALL (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME='David');
-- < ALL : 최소값 4800보다 작은 데이터
SELECT *
FROM EMPLOYEES
WHERE SALARY < ALL (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME='David');
-- IN : 정확히 일치하는 데이터가 나옴
SELECT *
FROM EMPLOYEES
WHERE SALARY IN (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME='David');
스칼라 서브쿼리
- SELECT절에 사용하는 서브쿼리로 조인을 수행할 시 조인할 행의 수를 줄여줌
- 한번에 하나의 컬럼을 가지고 오며 많은 열을 가지고 올때는 가독성이 떨어질 수 있음
- 다른 테이블의 1개의 컬럼만 가지고 올때 조인보다 유리할 수 있음
SELECT FIRST_NAME,
(SELECT DEPARTMENT_NAME FROM DEPARTMENTS D WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID) DEPARTMENT_NAME,
(SELECT JOB_TITLE FROM JOBS J WHERE JOB_ID = E.JOB_ID) JOB_TITLE
FROM EMPLOYEES E;
인라인 뷰(Inline View)
- FROM절 하위에 서브쿼리 사용
- SELECT절에서 만든 가상 컬럼에 대해서 조회를 해 나갈때 사용
SELECT ROWNUM,FIRST_NAME,SALARY
FROM (SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC)
WHERE ROWNUM BETWEEN 1 AND 10;