Programming/SQL

[SQL] 중첩질의문 - 단일행 서브쿼리 / 다중행 서브쿼리 / 비교연산자

reeme 2020. 12. 17. 19:18

sql example.xlsx
0.01MB

중첩질의문

중첩 질의문

: 하나의 SQL 문의 결과를 다른 SQL 문에 전달함

: 두 개의 SQL 문을 하나의 SQL 처리함

 

조인 질의문과 중첩 질의문

: 이론적으로 중첩 질의문은 조인 구문과 표현능력이 동일함

 

중첩질의문의 표현

: SQL 문 안에 SQL 문이 포함되어 있음

예)

select dname from department 
where department.dno = (select dno from employee where employee.eno=103);

 

단일행 서브 쿼리

: 서브 쿼리의 결과로 하나의 튜플만이 반환

서브 쿼리의 검색 조건이 후보키에 연관되어 있을 경우가 많음

예) 사원 번호 110 번과 같은 부서에 근무 하는 사원들의 사원 번호 와 부서번호 검색

사원번호가 기본키 임으로 사원번호 110 번은 1 명 밖에 없음

select eno, dno from employee 
where employee.dno=(select dno from employee where employee.eno=110);

point) =, <, <=, >, >=, != 등을 사용할 수 있음

 

다중행 서브 쿼리

: 서브 쿼리의 결과로 여러 개의 튜플들이 반환

  단일행(결과로 하나의 튜플만이 반환되는) 비교 연산자 사용 시 오류

 

 

다중행 비교 연산자

IN  속성값이 여러 값들 중 하나이기만 하면 참 
“= OR”의 의미 
ANY 또는 SOME  메인 쿼리 비교 조건에서 서브 쿼리의 결과와 하나라도 일치하면 참 
IN 과의 차이점은 >, >=, <=, < 과 같은 범위 비교와도 같이 사용이 가능함 
= ANY 와 = SOME 은 IN 과 같은 의미임 
ALL  메인 쿼리 비교 조건에서 서브 쿼리의 결과와 모두 일치하면 참(true)
EXISTS 서브 쿼리의 결과가 하나라도 존재하면 참이 되는 연산자
NOT  EXISTS EXISTS  상반되는 연산자


in / any or some / all / exists 활용

다중행 서브쿼리 : IN 
예) 봉급이 500이상인 사원과 같은 부서에 근무하는 사원들의 이름, 봉급, 부서번호 구하기 

select ename, salary, dno from employee 
where dno in (select dno from employee where salary>=500);

다중행 서브 쿼리 : ANY
예) 부서번호 20에 근무하는 한 직우너의 봉급 보다 많은 봉급을 받는 직원들의 이름 , 봉급, 부서번호를 출력

select ename, salary, dno from employee 
where salary > any(select salary from employee where dno=20);


다중행 서브쿼리 : ALL
예) 부서번호 10에 근무하는 모든 직원들의 봉급 보다 많은 봉급을 받는 직원들의 이름 , 봉급, 부서번호 출력

select ename, salary dno from employee 
where salary> all ( select salary from employee where dno=10);

다중행 서브쿼리 : exists

예) 봉급과 커미션의 합이 500 이 넘는 사원 이 존재하면 모든 사원의 이름 출력

select ename from employee 
where exists(select * from employee where salary+commission>500);

 

tip) 다중행 서브쿼리 - 잘 실수하는 오류

예) 봉급이 500 이상인 사원과 같은 부서에 근무 하는 사원들의 이름 , 봉급 ,부서번호 구하기

select ename, salary, dno from employee
where dno=(select dno from employee where salary >=500);

=> 오류 이유 : = 연산자 사용

select ename, salary, dno from employee 
where dno in (select dno from employee where saalary>=500);

=> =연산자 대신 in 을 쓰면 해결됨.