본문 바로가기
[파이썬]/데이터베이스

[MariaDB] 서브쿼리(Sub Query) + SQL 컴파일 순서

by sung min_Kim 2023. 11. 23.

 서버 툴 : MariaDB / 클라이언트 툴 : HeidiSQL 사용
 이번 글을 조회하시는 분들께서는 예제 풀이 및 글의 전반적인 이해를 위해 아래의 'ERD'를 다운하여 참고하시면 도움이 될 것입니다.

ERD
ERD.jpg
0.25MB


서브쿼리 (Sub Query)


조건부 검색

 


· 서브쿼리를 사용하는 이유는 ?


 서브쿼리는 SQL 문장 내에서 다른 SQL 문장을 실행하는 데 사용되는 쿼리이다.  

 서브쿼리를 사용하는 이유는 데이터를 좀 더 세밀하게 필터링하고, 복잡한 조건을 설정하여 원하는 결과를 얻기 위함이다.

 


· 서브쿼리의 사용 방식


서브쿼리는 메인 쿼리 내에서 Select, From, Where 등의 절에서 사용될 수 있으며, 다음의 두 가지 방식으로 사용된다.


  • 단일 컬럼의 단일 행 방식 : 이 방식에서 서브쿼리는 단일 컬럼의 단일 값을 반환한다. 이는 주로 비교 연산자와 함께 사용된다. 

  • 단일 컬럼의 다중 행 방식 : 이 방식에서 서브쿼리는 단일 컬럼의 여러 값을 반환한다. 이는 주로 IN() 함수와 함께 사용된다.



· 예제

 

<예제_서브쿼리(1)> 회원ID가 'a001'인 회원이 보유한 마일리지 값 이상의 마일리지를 소유한 회원에 대한 정보를 조회하기

- 조회 컬럼 : 회원ID(mem_id), 마일리지(mem_mileage)

예제_서브쿼리(1)

 위는 단일 컬럼(mem_id)의 단일 행(a001) 방식의 서브쿼리를 사용한다.
 SQL 쿼리는 이 방식의 서브쿼리를 사용하여 'a001' 회원이 보유한 마일리지를 반환하고, 이 값을 비교 연산자를 통해 각 회원들이 보유한 마일리지 값과 비교를 처리한다.
 따라서 'a001' 회원이 보유한 마일리지 이상을 갖는 모든 회원들에 대한 25건의 정보를 찾을 수 있었다.


<예제_서브쿼리(2)> 한 번도 주문한 적 없는 회원 조회하기

- 조회 컬럼 : 회원ID, 회원이름
(cart 테이블은 단순히 장바구니의 개념이 아니라 '주문한 적이 있는' 회원에 대한 정보를 담고 있다.)

예제_서브쿼리(2)

 위는 단일 컬럼(cart_member)의 다중 행(cart) 방식의 서브쿼리를 사용한다.
 SQL 쿼리는 이 방식의 서브쿼리를 사용하여 회원(Member) 테이블의 회원(mem_id)이 장바구니(Cart) 테이블의 주문회원ID(cart_member)에 속하지 않는지 'Not In()' 함수를 사용하여 '주문한 적이 없는 회원'인지를 확인한다. 
 따라서 위 서브쿼리를 통해 한 번도 주문한 적이 없는 회원들에 대한 정보를 9건 찾을 수 있었다.


< * 예제_서브쿼리(3)> 주문한 적 있는 회원의 정보들을 조회하기

- 조회 컬럼 : 주문번호(cart_no), 주문회원ID(cart_member), 회원이름(mem_name), 상품코드(cart_prod), 주문수량(cart_qty)
(cart 테이블은 단순히 장바구니의 개념이 아니라 '주문한 적이 있는' 회원에 대한 정보를 담고 있다.)

예제_서브쿼리(3)

 위의 예제와 반대로 '주문한 적이 있는 회원'에 대한 정보를 조회하였다.

 Select 문에 서브쿼리가 사용된 것을 볼 수 있는데, 이는 Member 테이블의 기본 키(PK)와 Cart 테이블의 참조 키(FK)가 일치하다는 일반 조건 하에 회원이름(mem_name)을 조회하는 단일 컬럼(mem_name)의 단일 행(mem_id = cart_member) 방식의 서브쿼리를 사용한다.

 회원(Member) 테이블과 장바구니(Cart) 테이블은 부모와 자식 간의 '일대 다' 관계로 형성되어 있다.
 '일'(부모)은 Member 테이블을 가리키고, '다'(자식)는 Cart 테이블을 가리킨다.

 따라서 자식 테이블의 주문회원ID(cart_member) 컬럼은 부모 테이블의 회원ID(mem_id) 컬럼을 참조하고 있으므로, 위와 같은 제한 조건을 통해 부모 테이블에 있는 정보를 가져와 출력하는 동작이 가능하다.

· SQL 컴파일(해석) 순서


 SQL 쿼리는 아래와 같은 순서로 처리된다.

 

  1. Select

  2. From 테이블

  3. Where 조건

  4. Group By절

  5. Having절

  6. Select문의 조회할 컬럼들

  7. Order By절


 SQL 쿼리는 테이블의 조건에 따른 컬럼들을 조회한 이후에 정렬을 처리하기 때문에 정렬은 맨 아래에 위치한다.

 


서브쿼리는 복잡한 데이터의 요구사항을 처리하는데 매우 유용하다.

특히 기본 키와 외래 키의 관계를 이해하면,
두 테이블 사이의 관계를 더욱 명확히 이해하고 이를 서브쿼리에 활용할 수 있다.


기본 키는 테이블의 각 행을 고유하게 식별하는 데 사용되며,
외래키는 한 테이블의 행이 다른 테이블의 행과 어떻게 관련되어 있는지를 나타낸다.

이러한 관계를 이용하면 서브쿼리를 통해 두 테이블 사이의 복잡한 관계를 탐색하고,
필요한 정보를 효율적으로 추출할 수 있다.

그러나, 기본 키와 외래 키의 관계를 정확히 이해하지 못하면,
예상치 못한 결과를 얻거나 중요한 정보를 놓칠 수 있기에 사용하는 데 있어 주의가 필요하다.