개발자 항해
서브쿼리(subquery) - 1. 단일행 서브쿼리 본문
- 서브쿼리(subquery)란?
쿼리구문 안에 또다시 쿼리 구문이 포함되어 있는 형태이다.
메인쿼리실행전 먼저 한번 실행되고
group by 절을 제외한 쿼리구문 어디에도 작성이 가능하다.
특히, where절 또는 having절에 많이 사용된다.
조건절에 사용될때 연산자의 오른쪽에 위치를 시키고 괄호로 묶어서 사용된다.
서브쿼리 유형으로는
단일행 서브쿼리, 다중행서브쿼리가 있다.
1. 단일행 서브쿼리
서브쿼리로부터 하나의 결과값(한 행)이 반환되는 경우
단일행 서브쿼리인 경우에는 메인쿼리에 단일행비교연산자를 준비하면 된다.
* 단일행비교연산자 :
= : 같음
> : 보다큼
>= :보다 크거나 같음
< : 보다 작음
<= : 보다 작거나 같음
<> : 같지않음
1) 기본형
저 위 쿼리의 뜻은
(서브쿼리) employees테이블에 속한 employee_id가 141인 사원의 job_id와
(메인쿼리) 같은 job_id를 가진 employees테이블에 속한 사원의 last_name,job_id를 선택해오라는 뜻이다.
이 쿼리는 어떤 값을 가져올까?
서브쿼리 부터 하나하나 살펴보자
1번 서브쿼리는 last_name이 lee인 사원의 job_id인 SA_REP값을 출력했고
2번 서브쿼리는 last_name이 lee인 사원의 salary값인 6800을 출력했다.
위 서브 쿼리 값들을 합쳐서 보면 쉽게 알수있다. 이처럼 헷갈릴땐 서브쿼리를 직접실행시켜보면
값을 예상하기가 수월해진다.
2) 서브쿼리 에러
그렇다면 이 구문은 어떻까?
부서별 최소 급여(서브쿼리)를 구해 그 최소급여와 같은 사원 아이디와 last_name을 구하고 싶었다.
언뜻 보면 말이되지만 출력해보면 아래와 같이 에러가 뜬다.
서브쿼리만 따로 실행시켜보았다. 반환되는 값이 아주 많다.
이처럼 서브쿼리에서 여러개의 값이 반환되어 ' = ' 연산자로는 실행할수 없다는것.
' = ' 연산자는 하나의 값만 비교할수있다. (그래서 단일행 비교연산자다)
그렇다면 어떻게 변경해야 할까?
아래와 같이 ' = ' 연산자 대신 여러개를 비교할수 있는 ' in '연산자를 쓰면 된다.
( 'in'은 다중행비교연산자로 다음편에서 자세히 보도록한다. )
3) 서브쿼리에 null값이 넘어간다면?
이처럼 DB에는 'Haas'라는 이름을 가진 사원이 없다.
위 쿼리를 서브쿼리로 이용하여 쿼리를 짜보자
'Haas'와 같은 job_id를 가진 사원을 출력해달라는 구문.
'Haas'라는 직원이 존재하지 않아 null값이 넘어가므로 메인쿼리 결과도 null이 된다.
'DB > MySQL' 카테고리의 다른 글
그룹함수 (0) | 2022.07.25 |
---|---|
서브쿼리(subquery) - 2. 다중행 서브쿼리 (0) | 2022.07.22 |
트랜잭션 ( Transaction ) (0) | 2022.07.20 |
DML ( 데이터조작어 ) - 3. delete (0) | 2022.07.20 |
DML ( 데이터조작어 ) - 2. update (0) | 2022.07.05 |