서버 툴 : MariaDB / 클라이언트 툴 : HeidiSQL 사용
이번 글을 조회하시는 분들께서는 예제 풀이 및 글의 전반적인 이해를 위해 아래의 'ERD'를 다운하여 참고하시면 도움이 될 것입니다.
서브쿼리 (Sub Query)
조건부 검색
· 서브쿼리를 사용하는 이유는 ?
서브쿼리는 SQL 문장 내에서 다른 SQL 문장을 실행하는 데 사용되는 쿼리이다.
서브쿼리를 사용하는 이유는 데이터를 좀 더 세밀하게 필터링하고, 복잡한 조건을 설정하여 원하는 결과를 얻기 위함이다.
· 서브쿼리의 사용 방식
서브쿼리는 메인 쿼리 내에서 Select, From, Where 등의 절에서 사용될 수 있으며, 다음의 두 가지 방식으로 사용된다.
- 단일 컬럼의 단일 행 방식 : 이 방식에서 서브쿼리는 단일 컬럼의 단일 값을 반환한다. 이는 주로 비교 연산자와 함께 사용된다.
- 단일 컬럼의 다중 행 방식 : 이 방식에서 서브쿼리는 단일 컬럼의 여러 값을 반환한다. 이는 주로 IN() 함수와 함께 사용된다.
· 예제
<예제_서브쿼리(1)> 회원ID가 'a001'인 회원이 보유한 마일리지 값 이상의 마일리지를 소유한 회원에 대한 정보를 조회하기
- 조회 컬럼 : 회원ID(mem_id), 마일리지(mem_mileage)
위는 단일 컬럼(mem_id)의 단일 행(a001) 방식의 서브쿼리를 사용한다.
SQL 쿼리는 이 방식의 서브쿼리를 사용하여 'a001' 회원이 보유한 마일리지를 반환하고, 이 값을 비교 연산자를 통해 각 회원들이 보유한 마일리지 값과 비교를 처리한다.
따라서 'a001' 회원이 보유한 마일리지 이상을 갖는 모든 회원들에 대한 25건의 정보를 찾을 수 있었다.
<예제_서브쿼리(2)> 한 번도 주문한 적 없는 회원 조회하기
- 조회 컬럼 : 회원ID, 회원이름
(cart 테이블은 단순히 장바구니의 개념이 아니라 '주문한 적이 있는' 회원에 대한 정보를 담고 있다.)
위는 단일 컬럼(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 테이블은 단순히 장바구니의 개념이 아니라 '주문한 적이 있는' 회원에 대한 정보를 담고 있다.)
위의 예제와 반대로 '주문한 적이 있는 회원'에 대한 정보를 조회하였다.
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 쿼리는 아래와 같은 순서로 처리된다.
- Select
- From 테이블
- Where 조건
- Group By절
- Having절
- Select문의 조회할 컬럼들
- Order By절
SQL 쿼리는 테이블의 조건에 따른 컬럼들을 조회한 이후에 정렬을 처리하기 때문에 정렬은 맨 아래에 위치한다.
서브쿼리는 복잡한 데이터의 요구사항을 처리하는데 매우 유용하다.
특히 기본 키와 외래 키의 관계를 이해하면,
두 테이블 사이의 관계를 더욱 명확히 이해하고 이를 서브쿼리에 활용할 수 있다.
기본 키는 테이블의 각 행을 고유하게 식별하는 데 사용되며,
외래키는 한 테이블의 행이 다른 테이블의 행과 어떻게 관련되어 있는지를 나타낸다.
이러한 관계를 이용하면 서브쿼리를 통해 두 테이블 사이의 복잡한 관계를 탐색하고,
필요한 정보를 효율적으로 추출할 수 있다.
그러나, 기본 키와 외래 키의 관계를 정확히 이해하지 못하면,
예상치 못한 결과를 얻거나 중요한 정보를 놓칠 수 있기에 사용하는 데 있어 주의가 필요하다.
'[파이썬] > 데이터베이스' 카테고리의 다른 글
[MariaDB] 그룹 함수(Group By, Having) + 컴파일 순서 (0) | 2023.11.24 |
---|---|
[MariaDB] Null, Null 체크(+nvl함수) (4) | 2023.11.24 |
[MariaDB] CRUD (0) | 2023.11.21 |
[MariaDB] 테이블 생성 (+HeidiSQL) (1) | 2023.11.21 |
[MariaDB] 테이블의 개념 및 특징 (+ERD) (0) | 2023.11.20 |