일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- swing
- DB
- where
- set
- array
- Oracle
- 조회
- InputStream
- Serializable
- Transaction
- stream
- transient
- 난수
- java
- 다이얼로그
- 8bit
- Annotaion
- 오라클
- 예외처리
- Reader
- 자바
- Connection
- 상속
- DB연동
- statement
- select
- Join
- 16bit
- driver
- JDBC
- Today
- Total
오버플로
[Oracle] subquery / Scalar subquery / inline view 본문
subquery
- 쿼리문 안에 (select) 쿼리문을 정의하는 쿼리문
- create, insert, update, delete, select에서 사용할 수 있음
- 안쪽 쿼리문이 한 행을 조회하는 단수행 서브쿼리(single row subquery)와
안쪽 쿼리문이 여러 행을 조회하는 복수행 서브쿼리(multi row subquery)를 사용할 수 있음
=> subquery 문이 1행만 조회하는 거면 단수행 서브쿼리(single row subquery)
여러 행을 조회하는 거면 복수행 서브쿼리(multiple row subquery)
1) create subquery
- 조회된 결과로 테이블을 복사할 때, 조회된 결과로 비어있는 테이블을 생성할 때
- 제약사항은 복사되지 않으나, not null 조건은 복사됨
- 복수행 subquery
- 비어있는 테이블(구조만)을 생성하기 위해서는 where절에 1=0(항상 거짓)로 기입하면 된당
> where절에 해당하는 레코드만 검색되는 것이므로!
(1=1은 항상 참으로 모든 레코드를 조회하고 1= 0은 항상 거짓으로 모든 레코드를 조회 X)
> 1=1은 dynamic query문을 만들 때 동적 조건을 편하게 붙이기 위해 사용
- 문법) create table 테이블명 as (select ,,,) ; --> 원천 데이터가 조회된 결과로 테이블 만들쟈~
- 설정된 constraints(제약사항)은 user_constraints 테이블에서 확인할 수 있음
**user_constraints 도 data dictionary의 일종, dic objects
> 전체 제약사항 조회 : select * from user_constraints
2) insert subquery
- 다른 테이블에 존재하는 (또는 같은 테이블의 다른 컬럼) 값으로 insert 작업을 할 때
- 단수행 subquery와 복수행 subquery 사용 가능
> 복수행 subquery는 정산작업할 때 많이 사용함
- select로 조회하는 컬럼명과 insert하는 컬럼명이 동일해야 함!
- 단수행 문법) insert into 테이블명 (컬럼명,,,) values ( (select,,,) ,,, )
> 컬럼 하나에 레코드 하나 나와야 함 // Ex) select sal from emp where empno=7788
- 복수행 문법) insert into 테이블명 (컬럼명,,,) (select,,,)
> 컬럼 여러 개에 레코드 여러 개 나올수있음
3) update subquery
- 다른 테이블의 컬럼 값으로 현재 테이블의 값을 변경해야 할 때
- 단수행 서브쿼리만 가능 (복수행 서브쿼리 사용하려면 in 씀)
> =은 하나의 값만 비교할 수 있으므로 in 써야 함
- 문법) update 테이블명 set 컬럼명 = (select,,,) where 컬럼명 = (select,,,)
- update subquery에서 복수행 subquery를 사용하려면 in을 사용하면 됨
> where empno in (select empno from emp where ename = 'ADAMS' or ename = 'SCOTT');
또는 where empno in (select empno from emp where ename in ('ADAMS', 'SCOTT'));
4) delete subquery
- 단수행 서브쿼리만 가능 (복수행 서브쿼리 사용하려면 in 씀)
- 다른 테이블의 컬럼 값으로 현재 테이블의 레코드를 삭제해야 할 때
- 문법) delete from 테이블명 where 컬럼명 = (select,,,)
5) select subquery
- 단수행 서브쿼리와 복수행 서브쿼리 모두 사용 가능
- 단수행 서브쿼리 : 다른 테이블의 컬럼 값으로 조회, Scalar subquery 사용하여 조회
** Scalar subquery
- 조회되는 컬럼의 subquery를 사용하는 것
- 조회된 컬럼의 값으로 다른 테이블에서 조회하는 서브쿼리
- 서브쿼리만 별도로 실행될 수 없음
- 복수행 서브쿼리 : inline view를 사용한 조회 (조회된 결과를 가지고 재조회하는 것)
- 단수행 문법) select 컬럼명 from 테이블명 where 컬럼명 = (select)
- Scalar subquery 문법)
select 컬럼명, (select 컬럼명 from 테이블명 where 테이블명.컬럼명 = 테이블명.컬럼명) from 테이블명
>> Scalar 서브쿼리 안에서는 from에 있는 테이블명.컬럼명 먼저 써주고 나중에 전체 테이블명
- 복수행 문법)
- where절 in : 여러 개의 값에 해당하는 레코드를 조회할 때
> 문법) where in ( select … ) - inline view를 사용한 조회 : 조회된 결과를 가지고 재조회할 때 사용
> 문법) select 컬럼명 from (select ,,, ) where group by ~ 주고싶은거 다 주면 됨
> 실제 테이블이 아닌 서브쿼리의 검색 결과(inline view)를 사용한 조회
> 바깥 컬럼명은 실제 컬럼이 아닌 inline view에 의해 조회된 컬럼명을 사용해야 함 (또는 alias)
* inline view : select 쿼리에 의해 조회된 결과로 생성된 테이블
- 바깥 쿼리문은 inline view를 사용한 검색을 수행하므로 사용할 수 있는 컬럼은
inline view에 나오는 컬럼만 사용할 수 있음 (컬럼명 동일해야 함, alias면 alias로 조회)
- inline view를 통해 재조회할 때, 안쪽 서브 쿼리에서 조회한 컬럼을 모두 사용할 필요는 없음
- inline view는 같은 쿼리 안에서 inline view를 중복하여 사용할 수 있음
# 오늘의 코딩 #
- select subquery를 해보자!
#단수행 subquery
-- 부서의 지역이 'DALLAS'인 부서에 근무하는 사원정보 조회
-- 조회컬럼 : 사원번호, 사원명, 부서번호, 연봉, 직무
select empno, ename, deptno, sal, job
from emp
where deptno = (select deptno from dept where LOC = 'DALLAS');
#출력결과#
-> where절의 select subquery의 연산결과로 추출된 deptno을 비교하여 필요한 정보가 출력된다!
#Scalar subquery
-- 사원테이블에서 사원번호, 사원명, 부서번호, 부서명 조회
select empno, ename, deptno,
(select dname from dept where dept.deptno=emp.deptno) dename
from emp;
#출력결과#
-> 사원 테이블에는 부서명이 없으나, 부서 테이블과 사원 테이블의 부서번호를 매칭하여
일치하는 부서번호에 해당하는 부서명을 부서테이블에서 가져온당
#복수행 subquery
-- 사원테이블에서 부서의 인원수가 4명 이상인 부서의 사원정보 조회
-- 조회컬럼 : 사원번호, 사원명, 부서번호, 부서명, 연봉, 입사일
select empno, ename, deptno,
(select dname from dept where dept.deptno=emp.deptno) dname
, sal, hiredate
from emp
where deptno in (select deptno
from emp
group by deptno
having count(empno) >= 4);
#출력결과#
-> where절에서 도출된 deptno은 복수이므로, in을 사용하여 복수행 subquery를 수행했다!
'Oracle' 카테고리의 다른 글
[Oracle] 제약사항 (Constraint) (0) | 2021.09.28 |
---|---|
[Oracle] union / join / driving table (0) | 2021.09.26 |
[Oracle] function(함수) (0) | 2021.09.20 |
[Oracle] select - where / group by ~ having / order by (0) | 2021.09.19 |
[Oracle] delete / truncate / drop (0) | 2021.09.18 |