ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서브쿼리 (subquery): WHERE, FROM, SELECT 위치한 서브쿼리
    SQL/sql 문법(mysql, mariaDB) 2024. 5. 10. 13:52

     

    ▤ 목차

       

       

      ✔SUBQUERY는 무엇인가?

      서브 쿼리는 쿼리 안에 또 다른 쿼리가 들어간 것을 말한다.

      메인 쿼리를 OUTER QUERY라고 말하고 안쪽 QUERY를 서브 쿼리 혹은 내부쿼리라 부른다. 

      서브 쿼리의 위치는 메인 쿼리의 WHERE, FROM, SELECT로 나눌 수 있다.

      서브 쿼리의 단일 값을 반환(스칼라 서브쿼리)할 수도 여러 행, 열의 값을 반환할 수 있다.

       

      서브 쿼리는 단일 쿼리가 있을 수있고 상관관계가 있는 서브 쿼리가 있을 수 있다.

       

      ✔ subquery를 사용: SELECT 절 (스칼라 쿼리)

      메인 쿼리의 SELECT절에서 마치 칼럼이나 표현식처럼 사용된다.

      SELECT절에서 하나의 컬럼이나 표현식만 사용할 수 있다. 물론 표현식들을 + 혹은 || 연산자로 연결해 최종 반환값이 한 개라면 여러 개를 사용할 수 있다. 반환값은 1개여야한다.

      SELECT jikwon_no, jikwon_name,
      	(SELECT buser_name FROM buser WHERE buser_no = buser_num) as 부서이름
      FROM jikwon;

       

       

      ✔ subquery를 사용: WHERE절

      가장 직관적인 서브쿼리이다. 메인 쿼리의 결과를 필터링하고자 WHERE 절에 자주 사용된다.

      (WHERE절은 테이블의 COLUMN을 필터링한다.)

       

      박별나 직원과 직급이 같은 직원 출력해 보자.

      💻 코드로 보기

      SELECT jikwon_jik FROM jikwon WHERE jikwon_name ='박별나'; 
      #결과 문1: 과장
      
      SELECT * FROM jikwon WHERE jikwon_jik='과장'; 
      #결과 문2: 조건에 맞는 결과 출력

       

      요청을 두번 하게 된다.  DB서버는 요청 횟수는 줄어들수록 좋다.

      위의 2개의 쿼리문을 서브쿼리를 이용해 같은 결과를 출력해 보자.

      SELECT * FROM jikwon WHERE jikwon_jik=(SELECT jikwon_jik FROM jikwon WHERE jikwon_name ='박별나');

      👏 틀리기 쉬운 문제

      직급이 대리 중 가장 먼저 입사한 직원은?

      SELECT MIN(jikwon_ibsail) FROM jikwon WHERE jikwon_jik='대리';
      SELECT * FROM jikwon WHERE jikwon_ibsail='2013-02-05';

      이렇게 2개의 쿼리를 요청할 수도 있지만 위에서 말했듯 요청은 한 번에 다녀오는 게 좋다.

       

      SELECT * FROM jikwon WHERE kwon_ibsail=(
      	SELECT MIN(jikwon_ibsail) FROM jikwon WHERE jikwon_jik='대리');

      위에서 배웠던 것처럼 이렇게 쿼리를 짜면 될까?

      정답은 아니다. 위의 구문은 직원 중에 2013-02-05에 입사한 사람을 찾아달라는 쿼리일 뿐이다.

       

      질문을 다시 확인해 보자.

       

      직급이 대리 중 가장 먼저 입사한 직원은?

      SELECT * FROM jikwon WHERE jikwon_jik='대리' AND jikwon_ibsail=(
      	SELECT MIN(jikwon_ibsail) FROM jikwon WHERE jikwon_jik='대리');

       

      이와 같은 쿼리가 되어야 한다. 대리 이면서 (대리이면서 먼저 입사한  날짜)의 조건에 맞는 사람을 찾게 된다.

      쿼리를 진행하다가 서브쿼리를 진행하고 서브쿼리를 값을 가져와 나머지 쿼리문 연산을 진행한다.

       

      ✔ subquery를 사용: FROM절 (인라인뷰 쿼리)

      from절에 위치하는 서브쿼리로 결과는 반드시 하나의 테이블로 리턴되어야 한다.

      SQL문이 실행될 때 임시적으로 생성되는 동적인 뷰이다. Dynamic View라고 부른다.

      SQL을 빠른 속도로 사용하기 위해 인라인뷰를 사용한다. 하지만 SQL을 잘못 구성하게 되면 오히려 액세스 속도를 저하시키는 경우가 발생할 수 있다.

       

      부서가 영업부인 직원들만 조회

      SELECT jikwon_name, buser_name
      FROM (SELECT jikwon.jikwon_name, buser.buser_name
      		FROM jikwon, buser
              WHERE jikwon.buser_num = buser.buser_no
              AND buser.buser_name = '영업부'));

       

      😊정리

      위의 경우처럼 서브 쿼리의 값을 그냥 가져온다고 생각하면 문제를 잘 풀 수 있다.

      메인쿼리가 진행하다 서브 쿼리를 만나면 서브쿼리의 반환값이 가져와서 메인 쿼리가 진행된다.

       

      sql은 문제를 많이 풀어보는 게 좋다. 개념을 조금 잡고 내장함수는 그때그때 찾아보다가 자주 보는 것들은 자연스럽게 암기할 것이니 문제를 많이 풀어보자!! 

      https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit

       

      프로그래머스

      코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

      programmers.co.kr

      프로그래머스에 문제들이 나와있다. 한 번씩 풀어보면서 감을 잡고 또 실력이 될 때까지 연습해 보자 :-)

    Designed by Tistory.