쌍용교육센터 - 19일

개발자가 되고 싶어요 ㅣ 2024. 3. 14. 19:47

2024.03.14

3가지 이상의 테이블을 조인하는 경우 표준 SQL보다 오라클에서만 사용 가능한 쿼리문이 더 직관적이고 작성하기 쉽다.

[표준 SQL]
SELECT E.DEPTNO, D.DNAME, E.ENAME, E.SAL, S.GRADE
FROM EMP E 
JOIN DEPT D ON E.DEPTNO = D.DEPTNO
JOIN SALGRADX`E S ON E.SAL BETWEEN S.LOSAL AND S.HISAL
WHERE E.DEPTNO=10;

[오라클 전용]
SELECT D.DEPTNO, D.DNAME, E.ENAME, E.SAL, S.GRADE
FROM EMP E, DEPT D, SALGRADE S
WHERE E.DEPTNO=D.DEPTNO
AND E.SAL BETWEEN S.LOSAL AND S.HISAL
AND E.DEPTNO=10;

집합연산자

Union : 합집합 중복값 제거

union은 두 테이블의 결합을 나타내며, 결합시키는 두 테이블의 중복되지 않는 값들을 반환한다.

select deptno from emp
union
select deptno from dept;

Union All : Union과 같으나 두 테이블의 중복되는 값까지 반환한다.

select deptno from emp
union all
select deptno from dept;

Intersect : 두 행의 집합 중 공통된 행을 반환한다.

select deptno from emp
intersect
select deptno from dept;

minus : 첫번째 Select문에 의해 반환되는 행 중에서 두번째 Select문에 의해 반환되는 행에 존재하지 않는 행들을 보여준다.

select deptno from dept
minus
select deptno from emp;

 

서브쿼리

다른 하나의 SQL문장 절에 nested(내장)된 Select 문장

 

단일 행 서브쿼리 : 오직 한 개의 행(값)을 반환한다.

select job from emp where empno=7369;
select empno, ename, job from emp where job='CLERK';
->위의 두개의 문장을 서브쿼리를 사용해서 작성

SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE JOB = (SELECT JOB FROM EMP WHERE EMPNO=7369);

 

다중 행 서브쿼리 : 하나 이상의 행을 반환하는 서브쿼리이다.

  • IN 연산자 사용
SELECT *
FROM EMP
WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);
  • ANY 연산자 사용: ANY연산자는 서브쿼리의 결과값 중 어느 하나의 값이라도 만족이 되면 결과값을 반환해준다.
SELECT SAL FROM EMP WHERE JOB='SALESMAN';
SELECT ENAME,SAL FROM EMP WHERE SAL>1250 OR SAL>1500 OR SAL>1600;
-> 위 문장을 서브쿼리로 작성
SELECT ENAME,SAL
FROM EMP
WHERE SAL>ANY(SELECT SAL FROM EMP WHERE JOB = 'SALESMAN');
  • ALL 연산자 사용: ALL연산자는 서브쿼리의 결과와 모든 값이 일치한다.
SELECT SAL FROM EMP WHERE DEPTNO=20;
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE SAL > 800 AND SAL>2975 AND SAL>3000;
-> 위 두 쿼리를 서브쿼리로 작성
SELECT EMPNO,ENAME,SAL,DEPTNO
FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO=20);

 

다중 열 서브쿼리 : 서브쿼리의 결과가 두 개 이상의 컬럼으로 반환되어 메인쿼리에 전달하는 쿼리이다.

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE (DEPTNO,SAL) IN (SELECT DEPTNO,SAL FROM EMP WHERE DEPTNO=30);

인라인뷰 : 메인 쿼리의 FROM 절을 서브 쿼리로 이용하는 방법이다.

SELECT E.EMPNO,E.DEPTNO,D.DNAME FROM (
    SELECT EMPNO,ENAME,DEPTNO
    FROM EMP WHERE SAL > (SELECT AVG(SAL)
                          FROM EMP WHERE DEPTNO=20)) E JOIN DEPT D
                          on E.DEPTNO=D.DEPTNO;

스칼라 서브쿼리 : 스칼라값은 단일 값을 의미한다. 결과값이 단일 행, 단일 열의 스칼라값으로 반환된다. 만약 결과값이 다중 행이거나 다중 열이라면 DBMS는 그 중 어떠한 행, 어떠한 열을 출력해야 하는지 알 수 없어 에러를 출력하게 된다.

SELECT DEPTNO,(SELECT DNAME FROM DEPT WHERE DEPTNO=E.DEPTNO),
SUM(SAL) FROM EMP E GROUP BY DEPTNO;

'IT 국비 교육' 카테고리의 다른 글

쌍용교육센터 - 21일  (3) 2024.03.18
쌍용교육센터 - 20일  (2) 2024.03.15
쌍용교육센터 - 18일  (0) 2024.03.13
쌍용교육센터 - 17일  (1) 2024.03.12
쌍용교육센터 - 16일  (0) 2024.03.11