Notice
Recent Posts
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 오라클
- java
- EL태그
- Oracle
- 이클립스
- MySQL
- jsp 내부객체
- jquery
- jstl
- SESSION
- 필터체인
- 제이쿼리
- 알고리즘
- 깃허브 간단요약
- 셋업
- 폼태그
- 버튼
- 면접
- springboot
- jsp
- 깃허브
- 자바스크립트
- 설치
- 스프링
- 자바
- Eclipse
- 마이바티스
- Spring
- 설정
- html
Archives
- Today
- Total
은은하게 코드 뿌시기
서브쿼리? 본문
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