스퐁지송 개발노트

데이터베이스 연습하기 예제--집합연산자(UNION ,INTERSECT,MINUS ),JOIN,서브쿼리 본문

DATABASE

데이터베이스 연습하기 예제--집합연산자(UNION ,INTERSECT,MINUS ),JOIN,서브쿼리

강준석 2023. 1. 12. 16:46
728x90

ANY

 

EX)

직책이 SALESMAN인 급여보다 큰사람들을 조회

SELECT *
    FROM EMP
WHERE SAL > ANY( SELECT SAL FROM EMP WHERE JOB = 'SALESMAN' );

 

EX) 부서번호가 30번 인 사람들의 급여보다 작은 급여를 받는 사람들을 조회

정렬은 급여와 사원번호를 기준으로 오름차순 정렬

SELECT *
    FROM EMP
WHERE SAL < ( SELECT SAL FROM EMP WHERE DEPTNO = 30 );

ALL

모두 만족하는 경우만 TRUE

 

EXISTS

서브쿼리의 결과 값이 하나라도 있으면 TRUE(서브쿼리가  TURE가 되면서 모든 레코드데이터가 나온다)

서브쿼리의 결과 값이 하나도 없으면 FALSE

SELECT *
    FROM EMP
WHERE EXISTS(SELECT ENAME FROM EMP WHERE DEPTNO = 10);
서브쿼리에 조건에 맞는 데이터가 있으므로 모든 레코드데이터가 나온다

 

다중 열 서브 쿼리

SELECT
    * FROM EMP
WHERE (DEPTNO, SAL) IN(SELECT DEPTNO, SAL --컬럼은 같지 않아도 되지만 형식은 같아야한다
                                FROM EMP
                            WHERE DEPTNO = 30);
                            
SELECT DEPTNO, SAL
      FROM EMP
 WHERE DEPTNO = 30
 (서브쿼리가 열이2개이다)

 

다중 쿼리 위치를 다른 곳에 넣어보기

SELECT * 
    FROM (SELECT * FROM EMP WHERE DEPTNO=10) E,
--부서번호가 10인 데이터들 중에서 검색을 시작
         (SELECT * FROM DEPT) D
--여러개의 서브쿼리작성가능(두개이상을 사용하면 합쳐져서 하나의 테이블로 만들어진다 하나하나 조건비교아님)
WHERE SAL >= 2000 AND E.DEPTNO = D.DEPTNO;

예제

 

EX) (EMP,DEPT테이블)사원중에 ALLEN과 같은 직책인 사람들의

직책, 사원번호, 이름, 급여, 부서번호, 부서이름을 출력

SELECT JOB, EMPNO, ENAME, SAL, DEPTNO, DEPTNO
    FROM EMP
WHERE JOB = (SELECT  JOB FROM EMP WHERE ENAME = 'ALLEN');--'ALLEN'의 직책데이터 뽑아내기


--INNER JOIN으로 

SELECT JOB, EMPNO, ENAME, SAL, EMP.DEPTNO, DEPT.DEPTNO, DNAME
    FROM EMP INNER JOIN DEPT
        ON EMP.DEPTNO = DEPT.DEPTNO
WHERE JOB = (SELECT  JOB FROM EMP WHERE ENAME = 'ALLEN');

 

EX) EMP,SALGRADE테이블 사원번호, 이름, 급여, 급여등급 출력

SELECT EMPNO, ENAME, SAL, GRADE, LOSAL, HISAL
    FROM EMP, SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL 
-- 모든 경우의수가 나오기때문에 맞는 데이터를 뽑기위해 조건추가
    ORDER BY ENAME, GRADE;
    
   --INNER JOIN 사용
   
SELECT EMPNO, ENAME, SAL, GRADE
    FROM EMP INNER JOIN SALGRADE
        ON SAL BETWEEN LOSAL AND HISAL

 

EX) 부서번호가 10번인 사람들 중에서 부서번호가 30번인 부서에 없는 직책을 가진 사람들의

사원번호, 이름, 직책, 부서번호, 부서명, 부서위치를 출력

SELECT EMP.EMPNO,ENAME,JOB,EMP.DEPTNO,DNAME,LOC
    FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
    AND EMP.DEPTNO = 10
    AND JOB NOT IN(SELECT DISTINCT JOB --부서번호가 30번인 직책들(중복제거)
                        FROM EMP WHERE DEPTNO=30);

--SELECT DISTINCT JOB FROM EMP WHERE DEPTNO=30;
--부서번호가 30번인 직책들(중복제거)

 

EX) 직책이 SALESMAN인 사람들의 최고급여보다 큰  급여를 받는 사람들의 이름,직책,급여,급여등급을 출력

급여를 기준으로 내림차순 정렬

SELECT ENAME, JOB, SAL, SALGRADE.GRADE
    FROM EMP INNER JOIN SALGRADE
        ON SAL BETWEEN LOSAL AND HISAL
WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE JOB = 'SALESMAN')
ORDER BY SAL DESC;

--SALESMAN중 최고급여를 불러오기
SELECT MAX(SAL) FROM EMP WHERE JOB = 'SALESMAN';

 

728x90
Comments