SQL 서브쿼리

·2022년 11월 19일
0

Oracle/SQL

목록 보기
8/16
  • 정의

->하나의 SQL문장절에 또 다른 SELECT절을 삽입해서 두 질의를 하나의 질의로 해결 가능하게 하는 쿼리

  • 특징

-> WHERE절 연산자 오른쪽에 위치함

-> 괄호로 묶어야 함

-> TOP-N절 등을 제외하고는 서브쿼리 절에 ORDER BY절이 올 수 없다.

  • 종류

1) 단일행 서브쿼리 : 리턴값이 하나의 행

> 연산자 : =, >, >=, < ,<=, <>
> 예시) 사원번호가 7369인 사원과 같은 직업을 갖는 사원들의 사원번호,이름,직업을 출력하시오.

>>알고리즘
(1)사원번호, 이름, 직업을 조회.
(2)어떤 조건? 어떠한 직업을 갖는 조건
(3)어떤 직업? 사원번호가 7369인 사원과 같은 직업
>>서브쿼리로 만들어줄 부분: 사원번호가 7369인 사원의 직업

입력예시)
SELECT EMPNO, ENAME, JOB FROM EMP
WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7369);

2) 다중행 서브쿼리 : 리턴값이 2건 이상

> 연산자: IN, ANY, ALL, EXIST(단일행 연산자 사용x)

3) 다중컬럼 서브쿼리 : 서브쿼리의 결과가 여러 칼럼인 경우

> 서브쿼리에서 두 컬럼을 한번에 비교하고 메인쿼리로 넘긴다.
문법)
WHERE(컬럼1,컬럼2) [IN/ANY/ALL](SELECT 컬럼1,컬럼2...서브쿼리)



다중행 서브쿼리의 연산자

(1) IN : OR. 서브쿼리의 데이터중 하나라도 일치하면 출력

문법)
WHERE 비교컬럼 IN (서브쿼리)

(2) ANY: OR. IN과 비슷함. 다만 문법이 다르고 일치 이외의 조건도 걸 수 있음(예: 크고 작음)

문법)
WHERE 비교컬럼[=,<,>,<> 등]ANY(서브쿼리)

(3) ALL: AND. 모든 서브쿼리의 데이터들이 조건을 만족해야함

WHERE 비교컬럼[=,<,>,<> 등]ALL(서브쿼리)

(4) EXIST: IN과 같으나 일치하는 서브쿼리가 없어도 무조건 출력함

문법)
WHERE 비교컬럼 EXIST(서브쿼리)



ROWNUM을 이용한 특정 조건 출력

ROWNUM : 행의 인덱스 번호. 중간에 ROW를 삭제하면 변함.

cf)ROWID: 행의 고유번호 -- JAVA의 주소값이라고 보면 됨. 중간에 ROW를 삭제해도 변하지 않음


WHERE절에 걸어서 특정 순위까지 뽑아서 조회할때 사용.

이때 서브쿼리는 FROM절에 온다.

문법)
SELECT * FROM(서브쿼리: ORDER BY로 순위를 정렬해줄 수 있다.) WHERE ROWNUM[=,<,> 등] 인덱스숫자;
cf) FROM절에도 서브쿼리가 올 수 있다.

해석)
(1) 정렬을 한 서브쿼리 조건에서 전체를 조회함
(2) 무슨 조건으로? 인덱스 조건으로



스칼라 서브쿼리 : SELECT절에 오는 서브쿼리

=>다른 테이블의 컬럼을 조회할때 사용
=>JOIN과 비슷하지만 조회되는 데이터의 양이 적을 경우에만 효율적임
=>결과값이 행하나 열 하나인 경우에만 사용 가능
문법)
SELECT 테이블1.컬럼1, 테이블1.컬럼2,(서브쿼리) [ALIAS명] FROM 테이블1;
서브쿼리 내용)
SELECT 컬럼3 FROM 테이블2 WHERE 테이블1.컬럼3=테이블2.컬럼3
WHERE절을 써주어야 하는 이유: 써주지 않으면 서브쿼리 테이블에 있는 컬럼 종류만 딱 가져오기 때문에 행 개수 불일치 오류가 난다.

예시) 사원번호,사원이름,부서번호,부서이름을 조회하시오.
--테이블 EMP, DEPT에 있는 공통적인 컬럼=>DEPTNO. 즉 부서번호가 같으면 불러와라
SELECT EMPNO, ENAME, DEPTNO,
(SELECT DNAME FROM DEPT WHERE E.DEPTNO=D.DEPTNO) 부서명 -- 부서명: ALIAS
FROM EMP ;
출력예시>

     EMPNO ENAME          DEPTNO 부서명           
---------- ---------- ---------- --------------
      7369 SMITH              20 RESEARCH      
      7499 ALLEN              30 SALES         
      7521 WARD               30 SALES         
      7566 JONES              20 RESEARCH      
      7654 MARTIN             30 SALES         
      7698 BLAKE              30 SALES         
      7782 CLARK              10 ACCOUNTING    
      7839 KING               10 ACCOUNTING    
      7844 TURNER             30 SALES         
      7900 JAMES              30 SALES         
      7902 FORD               20 RESEARCH      

     EMPNO ENAME          DEPTNO 부서명           
---------- ---------- ---------- --------------
      7934 MILLER             10 ACCOUNTING  
profile
웹개발입문자

0개의 댓글