관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

SQL문 속의 또 다른 SQL문, 서브쿼리 1 - 단일행과 다중행 서브쿼리 본문

알고리즘 및 자료 관리/데이터베이스

SQL문 속의 또 다른 SQL문, 서브쿼리 1 - 단일행과 다중행 서브쿼리

huenuri 2024. 8. 21. 17:30

저녁에 운동을 갔다 와서 저녁을 먹고 나면 대부분 9시가 다 된다. 보통 1시간 가까이 운동을 하고 샤워하고 나면 8시가 다 되고 저녁을 먹고 치우고 정리를 하면 이 시간쯤 된다. 하지만 운동을 해야 삶이 건강하고 식사도 대충 때우면 좋지 않으니 꼭 필요한 과정이다. 이제 남은 3시간 반 정도 남은 시간 동안 저녁 공부를 시작해보려고 한다.

 

아쉬움은 뒤로 하고 지금 해야 할 일에 집중해보자. 오늘은 서브쿼리에 대해서 학습해 볼 예정이다. 가능하면 3시간 안에 모든 학습을 다 마치고(강의도 듣고), 나머지 시간에는 어제처럼 정처기 공부를 조금이라도 하려고 한다.
오늘은 많이 피곤한 날이라 쉬는 시간에도 잠을 잘 때가 많아 정처기 공부를 별로 하지 못했다. 그래도 잠잘 시간을 아끼면서 공부를 하고 싶다. 내일까지 요구명세서도 다 써야 해서 새벽에는 DB 공부를 할 시간이 없을 것 같다. 최대한 오늘 이 시간을 활용해 열심히 해볼 것이다!

 

학습 목표

  1. 서브쿼리 마지막 날 강의를 들으며 내용을 익혀보자!
  2. 시간을 잘 분배해서 최대한 빠르게 학습을 잘 마쳐보자.

학습 시간

저녁 9시 ~ 10시 반 <1시간 반 소요>


 

 

 

 

 

1. 서브쿼리

 

 

서브쿼리란?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

실습 문제 1

 

 

 

 

 

실습 문제 2

 

Jack의 급여보다 낮은 직원을 찾기 위해 2개의 SELECT문을 작성했다. 서브쿼리를 사용하면 이 두 개의 SELECT문을 하나로 합쳐서 사용할 수 있다. 이 두 개의 SELECT문 중 WHERE절의 조건식에 들어갈 SALARY가 SELECT문의 서브쿼리가 된다.

 

 

 

 

8400보다 낮은 급여를 받는 직원들이 출력되었다.


 

 

 

 

실습 9-3

 

 

 

 

 

 

실습 문제 3

 

일반 조건식으로 출력을 하면 잘 출력이 되지만, 서브쿼리로 하면 오류가 난다. 그 이유는 무엇일까?

 

제임스가 2명이기 때문이다.


 

 

 

서브쿼리의 특징

조금 전에 서브쿼리 조건에서 출력이 안 되었던 이유는 이 특징 2번째에 해당된다. SELECT절에서 명시한 컬럼의 개수가 달랐기 때문이다.


 

 

 

 

 

2. 실행 결과가 하나인 단일행 서브쿼리

 

 

 

실습 문제 1번

 

입사 날짜를 조회해보면 2002년 8월 17일이므로 이 날짜보다 작아야 한다.

 

 

 

이렇게 입사날짜보다 빠른 직원이 출력되었다.

 

 

 

 

실습 문제 2번

평균 급여를 출력하면 다음과 같다.

 

평균 급여보다 높아야 하므로 쿼리문을 이와 같이 작성한다.

 

 

 


 

 

 

 

단일행 서브쿼리와 날짜형 데이터

단일행 서브쿼리는 결과값이 날짜 자료형 일 때도 사용할 수 있다.

 

서브쿼리 결과값이 날짜형인 경우

 

근데 책과 달리 결과값이 하나도 출력이 되지 않았다. 그래도 한번 코드를 작성해 보았다.

 

 

 

 

단일행 서브쿼리 함수

서브쿼리에서 특정 함수를 사용한 결과 값이 하나일 때 단일행 서브쿼리를 사용할 수 있다.

 

서브쿼리 안에서 함수를 사용한 경우

 

이 예제는 두 개의 테이블을 조인했다. 그런 다음 서브쿼리를 사용해 DEPTNO가 20이고 평균 급여 이상인 사원들을 출력했다.
조인과 서브쿼리를 함께 사용하는 SQL문이 실무에서 자주 사용된다고 한다. 오늘 새벽에 조인을 배웠더니 이제 이 구문이 보였다. 완전히 이해하지는 못했지만 다음 과정을 공부하면 이전에 학습했던 내용이 더 잘 이해가 되는 경우가 있다.


 

 

 

 

3. 실행 결과가 여러 개인 다중행 서브쿼리

 

 

IN 연산자

 

실습 문제 1번

이전에 학습했던 내용을 복습하는 문제였다.

 

 

 

 

 

실습 문제 2번


 

 

 

 

ANY, SOME 연산자

 

ANY와 IN 연산자는 결국 같은 것이다. ANY 대신 SOME을 사용할 수도 있다.

 

 

 

 

 

크거나 작은 조건

 

 ANY 연산자는 서브쿼리의 결과값 중 급여의 최대값보다 작은 값은 모두 출력이 된다.


 

 

 

 

ALL 연산자

모든 결과가 조건식에 맞아떨어져야 조건식이 true가 되는 연산자이다.


 

 

 

 

EXISTS 연산자

서브 쿼리에 결과값이 하나 이상 존재하면 조건식이 모두 true, 존재하지 않으면 false가 되는 연산자이다.

 

존재하지 않는 경우에는 아무 행도 출력되지 않는다.


 

 

 

 

학습을 마치고

서브쿼리 수업을 들으면서 내용을 정리하며 학습을 진행했다. 조금 더 일찍 마칠 수도 있었는데 중간에 다른 일이 있어 집중력이 조금 흐려지는 시간도 있었다. 그래도 대체로 공부에 잘 집중했고 서브쿼리도 거의 이해했다.
문제를 풀면 적용이 잘 안 될 때도 있지만 지금은 이렇게 이해하는 것으로 충분한 것 같다. 이제 다음 포스트에서 수업에서 다루지 않은 서브쿼리의 다른 이야기를 해볼 것이다.