๐ ๋ถ์ ์ง์(subquery)
๐ ์์น์ ๋ฐ๋ฅธ ๋ถ์ ์ง์์ ์ข ๋ฅ
์์น์ ๋ฐ๋ผ ๋ถ์ ์ง์์ ํํ๊ฐ ๋ค๋ฅด๋ค.
๋ช ์นญ | ์์น | ์๋ฌธ ๋ฐ ๋์์ด |
์ค์นผ๋ผ ๋ถ์ ์ง์ | SELECT | scalar subquery |
์ธ๋ผ์ธ ๋ทฐ | FROM | inline view / table subquery |
์ค์ฒฉ ์ง์ | WHERE | nested subquery / predicate subquery |
๐ ์ฃผ ์ง์(main query)์ ๋ถ์ ์ง์(sub query) ๊ฐ์ ์๊ด๊ด๊ณ
๐ ์๊ด ๋ถ์ ์ง์
์ฃผ ์ง์์ ๋ด์ฉ์ ์ฐธ์กฐํด์ ๋ถ์ ์ง์์ ์ ์ฉํ ๋ ์๊ด ๋ถ์ ์ง์์ด๋ค.
์ฃผ ์ง์์์ ๋จผ์ ์ํ๋์ด์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ๋ถ์ ์ง์์ ๋ด์ฉ์ ์ ์ฉํ๋ ๊ฒ์ด๋ค.
์ ์ด๋ ๊ฒ ํ๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ๋น์๊ด ๋ถ์ ์ง์
์๋ก ๋ ๋ฆฝ์ ์ธ ๊ฒฝ์ฐ, ๋ถ์ ์ง์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์ฃผ ์ง์๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ์ด๋ค.
๐ ์ค์นผ๋ผ ๋ถ์ ์ง์ (SELECT)
๋ถ์์ง์์ ๊ฒฐ๊ณผ ๊ฐ์ ๋จ์ผ ํ(์ค์นผ๋ผ), ๋จ์ผ ์ด์ ๋ฒกํฐ ๊ฐ์ผ๋ก ๋ฐํํ๋ค. ๋จ์ผํ(์ค์นผ๋ผ, ๋จ์ผ ๊ฐ)์ด๊ฑฐ๋ ๋จ์ผ ์ด(์ฌ๋ฌ ํ)๋ก ๊ฒฐ๊ณผ๊ฐ ๋์์ผํ๋ค.
์๊ด๊ด๊ณ: ์๊ด/๋น์๊ด ๋ชจ๋ ๊ฐ๋ฅํ๋ค.
์์ : ๋ง๋น์์ ์ ๊ณ ๊ฐ๋ณ ํ๋งค์ก์ ๋ณด์ด์์ค. (๊ฒฐ๊ณผ๋ ๊ณ ๊ฐ์ด๋ฆ๊ณผ ๊ณ ๊ฐ๋ณ ํ๋งค์ก์ ์ถ๋ ฅ) = ์๊ด ์ง์ ํํ
1๋ฒ๊ณผ ๊ฐ์ด ๋ถ์ ์ง์๋ฅผ ์ด์ฉํ๊ฑฐ๋ 2๋ฒ๊ณผ ๊ฐ์ด ์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ์ ๋ต์ ์ถ๋ ฅํ ์ ์๋ค.ํ์ง๋ง 1๋ฒ์ฒ๋ผ ๋ถ์ ์ง์๋ฅผ ์ด์ฉํ๋ฉด 2๋ฒ๋ณด๋ค ์๋๊ฐ ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
-- 1.
SELECT (SELECT NAME
FROM CUSTOMER CS
WHERE CS.CUSTID = OD.CUSTID) "NAME", SUM(SALEPRICE) "TOTAL"
FROM ORDERS OD
GROUP BY OD.CUSTID;
-- 2.
SELECT NAME, SUM(SALEPRICE)
FROM ORDERS OD, CUSTOMER CS
WHERE OD.CUSTID = CS.CUSTID
GROUP BY NAME;
๐ ์ธ๋ผ์ธ ๋ทฐ (FROM)
FROM์ ์๋ ํ ์ด๋ธ๋ง ์์ฑํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ ๋ค์ค ํ, ๋ค์ค ์ด์ด์ด๋ ์๊ด์๋ค. 2์ฐจ์ ํ ์ด๋ธ์ด๋ฉด ๋๋ค. ๋จ์ผํ, ๋จ์ผ ์ด์ ๋ถ๊ฐ๋ฅํ๋ค. ๋ถ์ ์ง์์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํด ์ฃผ ์ง์๋ฅผ ์ํํ๋ค.
์๊ด๊ด๊ณ: ๋น์๊ด๋ง ๊ฐ๋ฅํ๋ค. ๊ฐ์์ ํ ์ด๋ธ์ธ ๋ทฐ ํํ๋ก ์ ๊ณต๋๋ ์๊ด ๋ถ์ ์ง์๋ ์ฌ์ฉํ ์ ์๋ค.
์์ : ๊ณ ๊ฐ๋ฒํธ๊ฐ 2 ์ดํ์ธ ๊ณ ๊ฐ์ ํ๋งค์ก์ ๋ณด์ด์์ค. (๊ฒฐ๊ณผ๋ ๊ณ ๊ฐ์ด๋ฆ๊ณผ ๊ณ ๊ฐ๋ณ ํ๋งค์ก ์ถ๋ ฅ)
SELECT CS.NAME, SUM(OD.SALEPRICE) "TOTAL"
FROM (SELECT CUSTID, NAME
FROM CUSTOMER
WHERE CUSTID <=2) CS, ORDERS OD
WHERE CS.CUSTID = OD.CUSTID
GROUP BY CS.NAME;
๋ณ์๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์์ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์ ์์ผ๋ ๋ถ์ ์ง์๋ฅผ ์ฌ์ฉํด ์์ฐจ์ ์คํ์ ์ํํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๐ ์ค์ฒฉ ์ง์ (WHERE)
WHERE์ ์ ์กฐ๊ฑด์ ๋ช ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ๋ณดํต ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ ์กฐ๊ฑด ์ ์ด์ ํจ๊ป ์ฌ์ฉ๋๋ค. ๊ทธ๋์ ์ ์ด ๋ถ์ ์ง์๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
์ ์ด | ์ฐ์ฐ์ | ๋ฐํ ํ | ๋ฐํ ์ด | ์๊ด |
๋น๊ต | =, ๏ผ, ๏ผ, ๏ผ=, ๏ผ=, ๏ผ๏ผ | ๋จ์ผ | ๋จ์ผ | ๊ฐ๋ฅ |
์งํฉ | IN, NOT IN | ๋ค์ค | ๋จ์ผ | ๊ฐ๋ฅ |
ํ์ | ALL, SOME(ANY) | ๋ค์ค | ๋จ์ผ | ๊ฐ๋ฅ |
์กด์ฌ | EXISTS, NOT EXISTS | ๋ค์ค | ๋ค์ค | ํ์ |
1) ๋น๊ต
๋ถ์ ์ง์๊ฐ ๋ฐ๋์ ๋จ์ผํ, ๋จ์ผ ์ด์ ๋ฐํํด์ผํ๋ค. ๊ทธ๋์ผ ๋น๊ต๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ : ํ๊ท ์ฃผ๋ฌธ๊ธ์ก ์ดํ์ ์ฃผ๋ฌธ์ ๋ํด์ ์ฃผ๋ฌธ๋ฒํธ์ ๊ธ์ก์ ๋ณด์ด์์ค.
์์ : ๊ฐ ๊ณ ๊ฐ์ ํ๊ท ์ฃผ๋ฌธ๊ธ์ก๋ณด๋ค ํฐ ๊ธ์ก์ ์ฃผ๋ฌธ ๋ด์ญ์ ๋ํด์ ์ฃผ๋ฌธ๋ฒํธ, ๊ณ ๊ฐ๋ฒํธ, ๊ธ์ก์ ๋ณด์ด์์ค.
-- 1. ๋น์๊ด ์๋ธ ์ง์
SELECT ORDERID, SALEPRICE
FROM ORDERS
WHERE SALEPRICE <= (SELECT AVG(SALEPRICE)
FROM ORDERS);
-- 2. ์๊ด ์๋ธ ์ง์
SELECT ORDERID, CUSTID, SALEPRICE
FROM ORDERS OD
WHERE SALEPRICE > (SELECT AVG(SALEPRICE)
FROM ORDERS SOD
WHERE OD.CUSTID = SOD.CUSTID);
2) ์งํฉ: IN, NOT IN
IN(OR์ฐ์ฐ)์ ๋ถ์ ์ง์์ ๊ฒฐ๊ณผ ์งํฉ์ ์ฃผ ์ง์ ๊ฐ์ด ์๋์ง ํ์ธํ๋ ์ญํ ์ด๋ค(์งํฉ์ฐ์ฐ). ๋ค์ค ํ์ ๊ฐ์ง ์ ์๋ค. NOT IN์ ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ฐธ์ด๋๋ค.
์์ : ๋ํ๋ฏผ๊ตญ์ ๊ฑฐ์ฃผํ๋ ๊ณ ๊ฐ์๊ฒ ํ๋งคํ ๋์์ ์ดํ๋งค์ก์ ๊ตฌํ์์ค.
SELECT SUM(SALEPRICE) "TOTAL"
FROM ORDERS
WHERE CUSTID IN (SELECT CUSTID
FROM CUSTOMER
WHERE ADDRESS LIKE '%๋ํ๋ฏผ๊ตญ%');
3) ํ์ : ALL, SOME(ANY)
ALL์ ๋ชจ๋(AND ์ฐ์ฐ์ ์ด์ด์ ์ธ ๋ ์ ์ฉํ๋ค.), SOME์ ํ๋๋ผ๋ ์ฐธ์ด๋ฉด ๋๋ค.
์์ : 3๋ฒ ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ ๋์์ ์ต๊ณ ๊ธ์ก๋ณด๋ค ๋ ๋น์ผ ๋์๋ฅผ ๊ตฌ์ ํ ์ฃผ๋ฌธ์ ์ฃผ๋ฌธ๋ฒํธ์ ๊ธ์ก์ ๋ณด์ด์์ค.
SELECT ORDERID, SALEPRICE
FROM ORDERS
WHERE SALEPRICE > ALL (SELECT SALEPRICE
FROM ORDERS
WHERE CUSTID = 3);
4) ์กด์ฌ: EXISTS, NOT EXISTS
๋ฐ์ดํฐ์ ์กด์ฌ ์ ๋ฌด ํ์ธํ๋ค. IN๊ณผ ํท๊ฐ๋ฆด ์ ์์ง๋ง EXISTS๋ ์์ ๋ณ๋, ๋์์๊ฐ ์๋ค(๋ฌธ๋ฒ์ ์ผ๋ก). ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ํ์ธํ์ง์๊ณ ์กด์ฌ ์ ๋ฌด๋ง ํ์ธํ๋ค. FROM์ ์ ์ ์ฒด ๋์์๊ฐ ๋ถ์ ์ง์์ ๋น๊ตํด์ ์กด์ฌํ๋์ง ํ์ธํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ 100% ์๊ด ์ง์๋ง ๊ฐ๋ฅํ๋ค.
์์ : EXISTS ์ฐ์ฐ์๋ก ๋ํ๋ฏผ๊ตญ์ ๊ฑฐ์ฃผํ๋ ๊ณ ๊ฐ์๊ฒ ํ๋งคํ ๋์์ ์ด ํ๋งค์ก์ ๊ตฌํ์์ค.
SELECT SUM(SALEPRICE) "TOTAL"
FROM ORDERS OD
WHERE EXISTS (SELECT *
FROM CUSTOMER CS
WHERE ADDRESS LIKE '%๋ํ๋ฏผ๊ตญ%' AND CS.CUSTID = OD.CUSTID);
'๐.๋์ธํ๋ > ๐.์นด์นด์คํด๋ผ์ฐ๋์ค์ฟจ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DB] ์ ๊ทํ (0) | 2024.01.02 |
---|---|
[DB] ๋ถ์ ์ง์(sub query) ์ฐ์ต๋ฌธ์ (0) | 2023.12.29 |
[DB] DML ์ฐ์ต๋ฌธ์ (1) | 2023.12.28 |
[JAVA] ์์ธ Exception (0) | 2023.12.20 |
[JAVA] Singleton Pattern (0) | 2023.12.18 |