은은하게 코드 뿌시기

서브쿼리? 본문

Database -Mysql,Oracle

서브쿼리?

은은하게미친자 2022. 7. 26. 16:08
728x90

서브쿼리?

: SQL문을 실행하는 데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT문

 

특징

- 특수한 몇몇 경우를 제외한 대부분의 서브쿼리에서는 ORDER BY절을 사용할 수 없습니다.

- 서브쿼리에 있는 SELECT 문의 결과 행 수는 함께 사용하는 메인쿼리의 연산자 종류와 호환 가능 해야합니다.

예를 들어 메인쿼리에 사용한 연산자가 단하나의 데이터로만 연산이 가능한 연산자라면 서브쿼리의 결과 행 수는 반드시 하나여야 합니다.

- 단일행 서브쿼리와 다중행쿼리로 나뉨


단일행 서브쿼리

:  실행결과가 단하나의 행으로 나오는 서브쿼리. 

 

* 단일행 서브쿼리에서 사용되는 단일행 연산자 : > , >= , = , <= , < , <> ,^= , !=

 

use scott;
SELECT e.empno, e.ename, e.job, e.sal , d.deptno, d.dname, d.loc 
FROM EMP as E, dept as D
WHERE E.DEPTNO=D.DEPTNO
and e.sal <= (select avg(sal) from emp)
and d.deptno = 20

다중행 서브쿼리

: 실행결과 행이 여러개 로 나오는 서브쿼리

다중행 연산자 설명
IN 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있으면 true
ANY, SOME 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나라도있으면  true
ALL 메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true
EXISTS 서브쿼리의 결과가 한나라도 존재하면 true, 존재하지않으면 모두false

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select * from scott.emp
where sal in (select max(sal) from emp group by deptno);
 
select * from emp
where sal = any(select max(sal) from emp group by deptno);
 
select * from emp
where sal = some(select max(sal) from emp group by deptno);
 
select * from emp
where sal > ALL(SELECT SAL FROM EMP WHERE DEPTNO =30);
 
select * from emp
where exists (select dname from dept where deptno=10);
 
cs

다중열 서브쿼리

 

: SELECT절에 비교할 데이터를 여러개 지정하는 방식.

1
2
3
4
SELECT * 
FROM EMP
WHERE(DEPTNO, SAL) IN (SELECT DEPTNO,MAX(SAL) FROM EMP GROUP BY DEPTNO);
 
cs

FROM 절에 사용하는 서브쿼리와 WITH절 : 인라인뷰(inlineview)

인라인뷰

1
2
3
4
SELECT  E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM (SELECT * FROM EMP WHERE DEPTNO=10) E10,
(SELECT * FROM DEPT) D
WHERE E10.DEPTNO=D.DEPTNO;
cs

 

: FROM절에 직접 테이블을 명시하여 사용하기에는 테이블 내 데이터 규모가 너무 크거나 현재 작업에 불필요한 열이 너무 많아 일부행과 열만 사용하고자 할때 유용합니다. 하지만 FROM절에 너무 많은 서브쿼리를 지정하면 가독성이나 성능이 떨어 질 수도이 있기떄문에 경우에따라 WITH를 사용하기도합니다

 

WITH절

1
2
3
4
5
6
WITH
E10 AS (SELECT * FROM EMP WHERE DEPTNO=10),
D   AS (SELECT * FROM DEPT)
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM E10,D
WHERE E10.DEPTNO=D.DEPTNO;
cs

 

 


SELECT 절에 사용하는 서브쿼리 : 스칼라 서브쿼리(scalar subquery)

: 반드시 하나의 결과만반환하도록 작성해야함.

1
2
3
4
5
6
7
8
9
select empno, ename, job, sal,
(select grade from salgrade
where e.sal between losal and hisal
) as salgrade,
(select dname
from dept
where e.deptno=dept.deptno) as dname
from emp e;
 
cs

 

 

 

 

 

728x90

'Database -Mysql,Oracle' 카테고리의 다른 글

[DB] 세션(session)  (0) 2022.07.26
[DB] 트랜잭션(transaction)/ROLLBACK/COMMIT  (0) 2022.07.26
[DB] JOIN 조인  (0) 2022.07.17
my sql AI , Auto_increment 값 초기화 하기  (0) 2022.07.01
오라클/MYSQL 함수 종류 비교  (0) 2022.06.29
Comments