10.MySql(scott)-기본문법 - 서브쿼리(단일행, 다중)

JungSik Heo·2024년 12월 21일
0

MySQL

목록 보기
21/33

1. 서브 쿼리(Sub-Query)란?

  • 하나의 SQL 문장 절에 포함된 또 다른 SELECT 문장으로
    두 번 질의를 해야 얻을 수 있는 결과를 한 번의 질의로 해결이 가능하게 하는 쿼리

  • 용어 Main-Query 또는 Outer-Query
    Sub-Query 또는 Inner-Query 두 쌍이 같은 의미이다

  • 특징 - 괄호를 반드시 묶어야 한다

    • 서브쿼리는 메인쿼리의 다음 부분에 위치할 수 있다

<1> 단일행 서브쿼리

SQL> select job from emp where empno = 7900;


실행결과
job
----
CLERK

 
SQL> select empno,ename from emp where job = 'CLERK';
  • 합치면?
SQL> select empno,ename
from emp
where job = (select job from emp where empno = 7900);

사원들의 평균 급여보다 급여를 많이 받는 사원들의 사원번호,이름,급여를 출력해보세요

SQL> select empno,ename,sal
from emp
where sal > (select avg(sal) from emp) ;

사원번호가 7369인 사원과 같은 부서인 사원들의 부서번호, 이름, 급여를 출력해보세요

SQL> select deptno, ename, sal
from emp
where deptno = (select deptno from emp where empno = 7369);

사원번호가 7900인 사원과 같은 부서이고, 사원번호가 7369번인 사원보다 많은 급여를 받는
사원의 이름,부서번호,급여를 출력해보세요

SQL> select ename,deptno,sal
from emp
where deptno = (select deptno from emp where empno = 7900)
and sal > (select sal from emp where empno = 7369);

각 부서의 최소 급여가 부서번호가 30번인 부서의 최소 급여보다
많은 급여를 받는 부서의 부서번호, 최소 급여를 출력해보세요

SQL> select deptno,min(sal)
from emp
group by deptno
having min(sal) > (select min(sal) from emp where deptno = 30);

<2> 다중행 서브쿼리

-쿼리의 실행 결과가 여러 개의 칼럼이거나 여러 행을 리턴해주는 쿼리
-반드시 다중행 연산자와 함께 써야 한다

  • IN : 하나라도 일치하면
  • ANY : 하나이상 일치하면 (비교연산자와 함께 사용)
  • ALL : 모두 다 만족하면
  • EXISTS : 하나라도 존재한다면

1. IN 연산자 (OR 연산자와 비슷한 역할)

부서번호가 10번이거나 20번인 사원번호와 이름, 부서번호를 출력하세요

SQL> select empno,ename,deptno
from emp
where deptno=10 or deptno=20;

IN 연산자를 사용한다면?

SQL> select empno,ename,deptno
from emp
where deptno in(10,20)

다중행 쿼리 사용하기

부서번호가 30번인 사원들의 급여와 커미션이 같은 사원의 이름과 커미션을 출력해보세요

SQL> select ename,comm,deptno
from emp
where (sal,comm) in (select sal,comm from emp where deptno=30);

사원 테이블에서 적어도 한 명의 사원으로부터 보고를 받을 수 있는
사원의 사원번호, 이름, 직업, 입사일을 출력해보세요

SQL> select empno,ename,job,hiredate
from emp e1
where exists (select * from emp e2 where e2.mgr = e1.empno);

SQL> select empno,ename,job,hiredate
from emp
where empno in (select mgr from emp group by mgr);

SQL> select empno,ename,job,hiredate
from emp
where empno in (select distinct(mgr)from emp);

SQL> select e1.empno,e1.ename,e1.job,e1.hiredate
from emp e1,emp e2
where e1.empno = e2.mgr;

any 연산자 예제

활용 예제 1) sal > 300 OR sal > 400 OR sal > 500 이므로 sal이 300보다 크면 조건을 만족한다.

SELECT ename, salFROM emp WHERE sal > ANY(300, 400, 500);

all 연산자 예제

활용 예제 1) sal > 300 AND sal > 400 AND sal > 500 이므로 sal이 500보다 크면 조건을 만족한다.

SELECT ename, salFROM emp WHERE sal > ALL(300, 400, 500);

EXISTS 조건식은 행의 존재 여부를 확인하여 true 값을 반환합니다. 반환값 타입 boolean

활용 예제) 서브쿼리에서 반환하는 행이 1개라도 있으면 true를 반환합니다.

SELECT ename, sal FROM emp WHERE EXISTS( SELECT * FROM emp WHERE sal = 300 );

SELECT ename, sal FROM emp WHERE NOT EXISTS( SELECT * FROM emp WHERE sal = 300 );

https://byul91oh.tistory.com/364

profile
쿵스보이(얼짱뮤지션)

0개의 댓글