SQL/sql 문법(mysql, mariaDB)

서브쿼리 (subquery): WHERE, FROM, SELECT 위치한 서브쿼리

읽히는 블로그 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

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