본문 바로가기
Database/mysql

[MYSQL /Database] 서브쿼리

by JINJINC 2023. 4. 18.
728x90
반응형

서브쿼리 (Subquery)

- 서브쿼리(subquery)란 다른 쿼리 내부에 포함되어 있는 SELETE 문을 의미한다.
- 서브쿼리를 포함하고 있는 쿼리를 외부쿼리(outer query)라고 부르며, 서브쿼리는 내부쿼리(inner query)라고도 부른다.
- 서브쿼리는 다음과 같이 괄호() 로 감싸져서 표현 된다.

 

서브 쿼리 실행 순서 : 서브 쿼리 실행 -> 메인(부모) 쿼리 실행

select * from t1 
where target_id in (select id from sub_t2 where id < 100);

- 서브쿼리는 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL문을 말한다.
- (select id from sub_t2 where id < 100) 같이 괄호()안에 있는 쿼리를 서브 쿼리라 말한다
- 서브쿼리(=자식쿼리, 내부쿼리) : 메인쿼리 컬럼 사용 가능
- 메인쿼리(=부모쿼리, 외부쿼리) : 서브쿼리 컬럼 사용 불가

 

 

서브쿼리의 위치에 따른 명칭

SELECT col1, (SELECT ...)  -- 스칼라 서브쿼리(Scalar Sub Query): 하나의 컬럼처럼 사용 (표현 용도)
FROM (SELECT ...)                -- 인라인 뷰(Inline View): 하나의 테이블처럼 사용 (테이블 대체 용도)
WHERE col = (SELECT ...)   -- 일반 서브쿼리: 하나의 변수(상수)처럼 사용 (서브쿼리의 결과에 따라 달라지는 조건절)

 

 

 

일반 서브쿼리

- WHERE 문에 나타나는 서브쿼리

 

//조건값을 select로 특정할때 (단 결과가 값이 하나여야됨)

select name, height
	from usertbl
    where height > (select height from usertbl where name in ('김경호'));

 

//조건에 값이 여러개 들어올땐 any, any는 in과 동일한 의미, or를 의미한다.

 

select name, height 
from usertbl
where height = any(select height from usertbl where addr in ('경남'));

//all은 도출된 모든 조건값에 대해 만족할 때, and를 의미한다. 

select name, height 
from usertbl
where height > all(select height from usertbl where addr in ('경남'));

all 서브쿼리 사용결과

 

인라인 뷰 ( Inline view)

- FROM 문에 나타나는 서브쿼리
- 참고로 서브 쿼리가 FROM 절에 사용되 경우 무조건 AS 별칭을 지정해 주어야 한다.

 

SELECT ex1.userID,ex1.name
FROM (
  SELECT *
  FROM usertbl AS ex2
  WHERE ex2.addr='서울'
) ex1; -- 서브쿼리 별칭

 

 실습

[기본구성]

CREATE TABLE employee (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(64),
  salary INT,
  office_worker VARCHAR(64)
)

INSERT INTO employee VALUES(1,'허사장',20000000,'사장');
INSERT INTO employee (name,salary,office_worker) VALUES('유부장',10000000,'부장');
INSERT INTO employee (name,salary,office_worker) VALUES('박차장',5000000,'차장');
INSERT INTO employee (name,salary,office_worker) VALUES('정과장',4000000,'과장');
INSERT INTO employee (name,salary,office_worker) VALUES('정대리',3895000,'대리');
INSERT INTO employee (name,salary,office_worker) VALUES('노사원',2500000,'사원');
INSERT INTO employee (name,salary,office_worker) VALUES('하사원',2000000,'사원');
INSERT INTO employee (name,salary,office_worker) VALUES('길인턴',1000000,'인턴');

문제 1 . //정대리라는 사람의 직급을 구하시오.

select name as '이름',office_worker as '직급'
	from employee
	where office_worker =(
			select office_worker 
			from employee 
            where name='정대리');
            
select name as '이름',office_worker as '직급'
	from employee    
    where name = '정대리';

문제 2. 정대리보다 급여가 높은 사람들을 구하시오

SELECT *
FROM employee
WHERE salary > (
  SELECT salary
  FROM employee
  WHERE NAME = '정대리'
)

문제3.직급이 사원인 사람들을 구하시오.

SELECT *
FROM employee
WHERE office_worker IN (
  SELECT office_worker
  FROM employee
  WHERE office_worker = '사원');

문제4. 직급이 사원인 사람들의 이름과 급여를 구하시오.

SELECT EX1.name,EX1.salary
FROM (
  SELECT *
  FROM employee AS Ii
  WHERE Ii.office_worker='사원') EX1;

문제5. 정대리 급여와 테이블 전체 평균 급여를 구하시오.

SELECT name, salary, (
  SELECT ROUND(AVG(salary),-1)
  FROM employee) AS '평균급여'
FROM employee
WHERE name = '정대리'

728x90
반응형

댓글