728x90
SubQuery란
subquery란 query문 안에 있는 query문입니다.
sub query가 필요한 이유는 query문이 복잡해질 때 효과적으로 처리할 수 있기 때문입니다.
예를 들어 사용자가 내 친구목록중 아이디가 K로 시작하는 친구의 고등학교 이름을 찾는다면 해당 요청사항에 맞는 데이터를 DB에서 꺼내오기 위해 요청사항을 Query문으로 변환해야합니다. 그렇다면 친구목록 데이터가 저장된 Table을 friend라고 하고 고등학교 데이터 Table을 school이라고 할 때 friend Table에서 K로 시작하는 데이터의 school_id를 추출한뒤 다른 query문에 추출한 school_id를 직접 입력한다면 요청사항이 완료됩니다.
하지만 query문을 2번 쓰고 직접 추출 데이터를 입력해야 하므로 성능이 떨어집니다.
이때 query문안에 query문을 넣어서 1개의 query문으로 데이터를 추출할 수 있게 하는 것이 subquery입니다.
1. WHERE절의 SubQuery
subquery는 넣을 수 있는 위치는 Table참조를 표현하는 FROM절과 조건을 표현하는 WHERE절,
결과 형식을 표현하는 Attribute절입니다.
그 중 WHERE절에 subquery를 보겠습니다
위의 고등학교 이름을 알아내는 query문을 직접 작성해보겠습니다.
subquery를 사용하지 않은 경우)
SELECT f.school_id FROM friend(AS)f WHERE f.name = LIKE"K%";
결과) 1,5,7
SELECT s.name FROM school (AS)s WHERE s.id=1 OR s.id =5 OR s.id=7;
위의 두 query문은 올바른 결과를 내지만 query문을 2번 전송해야하고 query문의 결과를 사용해야 하기 때문에
결과가 나올때까지 기다려야 합니다.
subquery를 사용한 경우)
SELECT s.name
FROM school (AS)s,friend(AS)f
WHERE s.id IN(
SELECT f.school_id
FROM friend(AS)f
WHERE f.name = LIKE"K%";
);
subquery를 살펴보면 K로 시작하는 친구의 데이터의 school_id를 추출합니다.
즉 subquery가 실행되서 반환되는 결과를 밖에있는 query문(outer query)이 바로 사용할 수 있습니다.
2. FROM절의 SubQuery
From절에는 Table명이 들어가야하는데 subquery를 작성하면 table명을 반환하게 만들어야 하는건가
라고 생가하실 수 있겠지만 From절에 있는 SubQuery는 결과로 나온 속성값들로 임의의 Table을 생성합니다.
따라서 속성값만을 추출하게 작성해도 무관하게 사용가능합니다.
위의 subquery문을 From절로 수정한다면 아래의 query문이 됩니다
SELECT s.name
FROM school (AS)s,
(
SELECT f.school_id
FROM friend(AS)f
WHERE f.name = LIKE"K%";
) AS Kf
WHERE s.id = Kf.school_id
즉 subquery에서 생성되는 Table의 속성값은 school_id만 있게됩니다.
3. Attribute절의 SubQuery
Attiribute의 subquery가 쓰이는 경우는 추출한 속성 값들중 최대,최소등과 같이
속성값에 연산이 필요한경우입니다.
예를 들어 K로시작하는 친구의 학교 이름 중 L로 끝나는 학교를 추출한다면 query문은 다음과 같습니다.
SELECT (
SELECT end_l_name
FROM shool
WHERE s.name = LIKE"%L"
)
FROM school (AS)s,
(
SELECT f.school_id
FROM friend(AS)f
WHERE f.name = LIKE"K%";
) AS Kf
WHERE s.id = Kf.school_id
그런데 Attribute의 subquery에 shcol Table을 작성하고 WHERE문에 s라고 작성했습니다
그렇다면 s는 어떤 s일까요
바로 아래 조건들을 만족한 데이터만 있는 Table입니다. 이렇듯 같은 table을 여러 subquery에서 사용하기 때문에
subquery를 사용할 땐 어디까지 연산되 Table을 사용해야 하는지에 대해 주의 해야합니다.
'DataBase' 카테고리의 다른 글
Order By, Group By,Aggregation Function이란 (1) | 2024.01.04 |
---|---|
JOIN (1) | 2024.01.04 |
MySQL문법 (0) | 2024.01.02 |
관계형 데이터베이스 (1) | 2024.01.02 |
용어 정리 (2) | 2023.12.29 |