10.1. ์๋ธ์ฟผ๋ฆฌ10.1.1. ์๋ธ์ฟผ๋ฆฌ ๊ฐ์10.1.2. ์ฌ์ฉ ๋ชฉ์ 10.1.3. ์๋ธ์ฟผ๋ฆฌ์ ํจ์จ์ฑ10.1.4. WITH10.2. ์๋ธ์ฟผ๋ฆฌ์ ์ข
๋ฅ10.2.1. ์ค์นผ๋ผ10.2.2 ์ธ๋ผ์ธ ๋ทฐ10.2.3. ์ค์ฒฉ10.2.4. IN10.2.5. EXISTS10.2.6. ์๊ด10.2.7. ARRAY
ย
10.1. ์๋ธ์ฟผ๋ฆฌ
10.1.1. ์๋ธ์ฟผ๋ฆฌ ๊ฐ์
์๋ธ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ ๋ด์ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ก ๋ฉ์ธ์ฟผ๋ฆฌ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋ง, ๋ณํ ๋๋ ์ง๊ณํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
1๊ฐ์ SQL๋ฌธ ๋ด์ ํฌํจ๋
SELECT
๋ฌธ์ ์๋ฏธํ๋ฉฐ, ์๋ธ์ฟผ๋ฆฌ ๋ฐ์ ์๋ SQL๋ฌธ์ ๋ฉ์ธ์ฟผ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ๋ ์๊ดํธ ์์ ์์ฑ๋๋ฉฐ, ๋ฉ์ธ์ฟผ๋ฆฌ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ๋ ๋จ๋
์ผ๋ก ์คํ๋ ์ ์์ผ๋ฉฐ, ํญ์ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์ฐ๊ณ๋์ด ์คํ๋ฉ๋๋ค.
ย
๋ณต์กํ ๋ฐ์ดํฐ ์๊ตฌ์ฌํญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจ๊ณผ์ ์ธ ๋๊ตฌ๋ก์, ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ ๋๋ ๋ณต์กํ SQL ๋ฌธ์ ์์ฑํ ํ์๊ฐ ์์ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.

JOIN
์ผ๋ก ์์ฑ๋ SQL ๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ SQL ๋ฌธ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
JOIN
๋ ์๋ธ์ฟผ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉํ์ง๋ง, 2๊ฐ์ ํ
์ด๋ธ์์ 1๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ ์ ํ ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ๊ณ 3๊ฐ ์ด์์ ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ป๊ณ ์ ํ๋ ๊ฒฝ์ฐ๋ JOIN
์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. 3๊ฐ ์ด์์ ํ
์ด๋ธ์์๋ ์๋ธ์ฟผ๋ฆฌ ๋์
JOIN
์ ์ฌ์ฉํ ์ ์ฟผ๋ฆฌ๊ฐ ๋ ๊ฐ๊ฒฐํด์ง๊ณ ๊ฐ๋
์ฑ์ด ๋์์ง ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.ย
์๋ธ์ฟผ๋ฆฌ๋
SELECT
, FROM
, WHERE
, HAVING
๋ฐ JOIN
์ ๋ฑ ๋ค์ํ SQL ์ ์์ ํ์ฉ๋ ์ ์์ผ๋ฉฐ, ๋ฉ์ธ์ฟผ๋ฆฌ๋ณด๋ค ๋จผ์ ์คํ๋๋ ์ข
์์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ธ์ฟผ๋ฆฌ๋ ์๊ดํธ ๋ด์ ์ ์๋๋ฉฐ, ๋จ์ผ ๊ฐ ๋๋ ์งํฉ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.
๋ํ, ๋ค์ํ ๋น๊ต ์ฐ์ฐ์(
=
, <
, >
, IN
, NOT IN
, EXIST
, NOT EXIST
๋ฑ)์ ๊ฒฐํฉํ์ฌ ๋ณต์กํ ์กฐ๊ฑด์ ํํํ๋ ๋ฐ ํ์ฉํ ์ ์์ต๋๋ค.์๋ธ์ฟผ๋ฆฌ์ ์ข
๋ฅ๋ ๋ชฉ์ ์ ๋ฐ๋ผ์
ORDER BY
์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์กฐ๊ฑด์ ์๋ธ์ฟผ๋ฆฌ(IN
, EXISTS
๋ฑ)๋ ๊ฒฐ๊ณผ ์งํฉ์ ์กด์ฌ๋ฅผ ํ์ธํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ๊ตฌ๋ฌธ ์์์๋ ORDER BY
์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ย
10.1.2. ์ฌ์ฉ ๋ชฉ์
์๋ธ์ฟผ๋ฆฌ๋ ์๋ ค์ง์ง ์์ ๊ธฐ์ค์ผ๋ก ๊ฒ์ํ ๋ ์ฉ์ดํฉ๋๋ค. ํ
์ด๋ธ ๋ด์์ ์กฐ๊ฑด์ ์ค์ ํ๊ธฐ ์ด๋ ค์ ๋ค๋ฅธ ํ
์ด๋ธ์์ ์กฐ๊ฑด์ ๊ฐ์ ธ์์ผ ํ ๊ฒฝ์ฐ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ๋ ํน์ ๊ธฐ์ค๊ฐ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฐ์ ๋ฐํ์ผ๋ก ๋ค๋ฅธ ์ฟผ๋ฆฌ์์ ํ์ฉํ๋ ์ํฉ์์ ํฐ ์ฅ์ ์ ๋ฐํํฉ๋๋ค. ๋ํ ์๋์ ๊ฐ์ด ์ด ๋ฐ์ดํฐ ์์ฑ, ์์ ํ
์ด๋ธ ์์ฑ, ์งํฉ ์ฐ์ฐ ์ํ, ๋ฐ์ดํฐ ๊ฒ์ฆ, ๋ณต์กํ ์ง์์ฒ๋ฆฌ ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
ย
์กฐ๊ฑด ์ ๊ณต: ์๋ธ์ฟผ๋ฆฌ๋
WHERE
๋ HAVING
์ ์์ ์กฐ๊ฑด๊ฐ์ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ํ๊ท ๊ฐ ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋, ๊ทธ ํ๊ท ๊ฐ์ ๊ตฌํ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ด ๋ฐ์ดํฐ ์์ฑ:
SELECT
์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ถ๋ ์ด ๊ฐ์ ์์ฑํ ์ ์์ต๋๋ค.์์ ํ
์ด๋ธ ์์ฑ:
FROM
์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ
์ด๋ธ์ ์์ฑํ๊ณ , ์ด ํ
์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์ธ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค.์งํฉ ์ฐ์ฐ ์ํ: ์ฌ๋ฌ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ
UNION
, INTERSECT
, EXCEPT
๋ฑ์ ์ฐ์ฐ์๋ก ๊ฒฐํฉํ ์ ์์ต๋๋ค.๋ฐ์ดํฐ ๊ฒ์ฆ: ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๊ฐ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธํ๊ฑฐ๋, ํน์ ๊ฐ์ ๊ฐ์ง๋์ง ๊ฒ์ฆํ ์ ์์ต๋๋ค.
๋ณต์กํ ์ง์ ์ฒ๋ฆฌ: ๋ณต์กํ ๋ฐ์ดํฐ ์๊ตฌ์ฌํญ์ ๋จ์ํํ์ฌ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ ๋จ๊ณ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ค์ฒฉํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ย
10.1.3. ์๋ธ์ฟผ๋ฆฌ์ ํจ์จ์ฑ
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฟผ๋ฆฌ์ ์คํ ์๊ฐ์ ๋งค์ฐ ์ค์ํ ์งํ์
๋๋ค. ํนํ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ, ์๋ธ์ฟผ๋ฆฌ์ ๋นํจ์จ์ ์ธ ์ฌ์ฉ์ ์คํ ์๊ฐ์ ํฐ ์ง์ฐ์ ์ด๋ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ ํญ์ ํจ์จ์ฑ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
ย
์๋ธ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฝ๋ ์ฌ์ฌ์ฉ: ๊ฐ์ ๋ก์ง์ด๋ ์กฐ๊ฑด์ ์ฌ๋ฌ ์ฟผ๋ฆฌ์์ ์ฌ์ฉํด์ผ ํ ๋, ๊ทธ ๋ก์ง์ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ง๋ค์ด ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ์ฝ๋์ ์ค๋ณต์ ์ค์ผ ์ ์์ต๋๋ค.
๋ช
์์ ์ธ ์์ : ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉ ์, ์ฐ์ฐ ์์๋ฅผ ๋ช
ํํ๊ฒ ์ง์ ํ ์ ์์ต๋๋ค.
์์ ๊ฒฐ๊ณผ ์์ฑ : ํน์ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์ค๊ฐ ๋ฐ์ดํฐ ์งํฉ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ฐ์ฐ์ ์ํ ์์๊ฒฐ๊ณผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ณ์ธต์ ์ง์ : ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด ๋ฐ์ดํฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ณ์ธต์ ์ผ๋ก ํํํ๊ณ ์ง์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์กฐ์ง ๋ด์ ์ํ ๊ด๊ณ๋ ๊ฐ๊ณ๋์ฒ๋ผ ๋ฐ์ดํฐ ์ฌ์ด์ ๊ณ์ธต์ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ํ์
ํ๊ณ ์กฐํํ ์ ์์ต๋๋ค.
๋ณต์ก์ฑ ๊ฐ์: ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฐ๋
์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
ํจ์จ์ฑ๊ณผ ๊ด๋ จ๋ ์ฃผ์ ์ฌํญ
- ๋๋ฌด ๋ง์ ์ค์ฒฉ๋ ์๋ธ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์กฐ์ธ์ ์ฌ์ฉํ์ฌ ์๋ธ์ฟผ๋ฆฌ์ ์๋ฅผ ์ต์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ถํ์ํ๊ฒ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ, ์ด๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์๋ธ์ฟผ๋ฆฌ์์ ๋ฐํ๋๋ ๋ฐ์ดํฐ์ ์์ ์ต์ํํ๋ ค๋ฉด ํํฐ๋ง ์กฐ๊ฑด์ ์ ์ ํ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์๋ธ์ฟผ๋ฆฌ์์ ์กฐํ๋๋ ์ด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
ย
์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉ ์ ์ฐ์ฐ ๋น์ฉ์ด ์ถ๊ฐ, ์ต์ ํ๋ฅผ ๋ฐ์ ์ ์์ด ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ SQL ๋ฌธ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉ ์, ๋ถํ์ํ
JOIN
์ฐ์ฐํ์ง๋ ์์๋์ง, ํ
์ด๋ธ ์ ๊ทผ์ ์ต์ํํ๋์ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋ณต์กํ ์ฟผ๋ฆฌ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋์ผํ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด, ๋์ผํ ์ฐ์ฐ์ด ์ฌ๋ฌ ๋ฒ ์คํ๋์ด ํจ์จ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ์ฌ๊ธฐ์
WITH
์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ์ฝ๋์ ๊ฐ๋
์ฑ์ ํฅ์์ํค๋ฉฐ, ๋์ผํ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ฑํ๋ ๊ฒ์ ํผํ์ฌ ํจ์จ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.ย
10.1.4. WITH
WITH
์ ์ ์ฟผ๋ฆฌ์ ์์ ๋ถ๋ถ์์ ์ ์๋๋ฉฐ, ์ดํ์ ์ฃผ ์ฟผ๋ฆฌ์์ ์ฌ๋ฌ ๋ฒ ์ฐธ์กฐ๋ ์ ์๋ ์ผ์์ ์ธ ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑํฉ๋๋ค. ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ๋์ ํ์ํ ์ปฌ๋ผ๋ง ์ถ์ถํด ์์ ํ
์ด๋ธ๋ช
์ ์ ์ํ์ฌ ๋ถํ์ํ ๊ณ์ฐ ๋๋ ๋ฆฌ์์ค๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.ย
WITH
์ ์ โ๊ฐ๋
์ฑโ, โ์ฌ์ฌ์ฉ์ฑโ, โ๋ก์ง์ ์์ฐจ์ ํํโ, โํจ์จ์ฑโ ์ด๋ผ๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋ถํดํ๊ณ , ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ฟผ๋ฆฌ์ ๊ฐ๋
์ฑ์ ํฅ์์ํค๊ณ ๊ตฌ์กฐํํ๋ ๋ฐ ๋์์ ์ค๋๋ค
- ๊ฐ๋ ์ฑ: ๋ณต์กํ ์ฟผ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ๊ฒ ํํํ ์ ์์ผ๋ฉฐ, ๊ฐ ๋ถ๋ถ์ ๋ถ๋ฆฌํ์ฌ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์ฌ์ฌ์ฉ์ฑ: ๋์ผํ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฌ์ฉํ ํ์ ์์ด ํ ๋ฒ๋ง ์ ์ํ๋ฉด ๋ฉ๋๋ค.
- ๋ก์ง์ ์์ฐจ์ ํํ:
WITH
์ ์ ์ฐ์์ ์ผ๋ก ์ ์ํ๋ฉด, ์ฟผ๋ฆฌ์ ์คํ ๋ก์ง์ ๋จ๊ณ๋ณ๋ก ํํํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ์์ฐจ์ ์ผ๋ก ํํํ ๋ ์ ์ฉํฉ๋๋ค.
- ํจ์จ์ฑ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ๋ผ,
WITH
์ ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ์ฌ ์ฃผ ์ฟผ๋ฆฌ์์์ ๋ฐ๋ณต๋ ์ฐธ์กฐ์ ๋ํ ์ฐ์ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
ย
์๋ ์ฝ๋์ ๊ฐ์ด
WITH
์ ์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์์ ํ
์ด๋ธ์ ์์ฑํฉ๋๋ค. ์ด๋, ํ๋์ ํ
์ด๋ธ๋ฟ๋ง ์๋๋ผ ์ฝค๋ง(,)๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์์ ์ฌ๋ฌ ๊ฐ์ ์์ ํ
์ด๋ธ์ ์์ฑํ ์ ์์ด CTE(Common Table Expressions)์ด๋ผ๊ณ ๋ ๋ถ๋ฆ
๋๋ค.WITH new_table1 AS ( SELECT column1 FROM Table1 ), new_table2 AS ( SELECT column1 FROM Table2 ) SELECT * FROM new_table1;
ย
์ด์ ์๋ ๋ณต์กํ ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ
FROM
์ ์์ SELECT
๊ฐ ๋ค์ด๊ฐ๋๋ก ์์ฑํ์์ต๋๋ค. SELECT column1 FROM ( SELECT * FROM Table1 );
ย
์ด๋,
WITH
์ ์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋
ผ๋ฆฌ์ ์ผ๋ก ์ธ๋ถํํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ํ
์ด๋ธ๋ก ์์ฑํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์กฐํํ ์ ์๊ณ ๊ฐ๋
์ฑ์ ๋์ผ ์ ์์ต๋๋ค. ์ด์ฒ๋ผ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋ ์์ ๋
ผ๋ฆฌ์ ๋ธ๋ก์ผ๋ก ๋๋์ด ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง ๋ณด์ํ ์ ์๊ฒ ๋ฉ๋๋ค.WITH
์ ์ ์ ์ ํ ์ฌ์ฉํ๋ฉด ๋ง์ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๋จ๋ฐํ๋ฉด ๋ณต์ก์ฑ๊ณผ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ WITH
์ ์ ์ฌ์ฉํ ๋๋ ํญ์ ์ฑ๋ฅ๊ณผ ๊ฐ๋
์ฑ์ ๊ท ํ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.ย
์์ 1
โemployeesโ์ โemployee_idโ ๊ฐ์ ์กฐํํ๋ โemployee_dataโ๋ผ๋ ์์ ํ
์ด๋ธ์ ์ ์ํ๊ณ โemployee_dataโ ํ
์ด๋ธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
WITH employee_data AS ( SELECT employee_id FROM `HR.employees` ) SELECT * FROM employee_data;

ย
์์ 2
์ง์
๋ณ ์ง์ ์์ด๋ ์๋ฅผ โemployee_job_countsโ๋ผ๋ ์์ ํ
์ด๋ธ๋ก ์ ์ํ๊ณ โemployee_job_countsโ ํ
์ด๋ธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
WITH employee_job_counts AS ( SELECT job_id , COUNT(employee_id) AS job_count FROM `HR.employees` GROUP BY job_id ) SELECT * FROM employee_job_counts ORDER BY job_count DESC;

ย
์์ 3
์ง์ข
๋ณ ์ง์ ์๊ฐ 20 ์ด์์ธ ์ง์ข
์ฝ๋(โjob_codeโ)์ ์ง์ ์๋ฅผ โemployee_countsโ๋ผ๋ ์์ ํ
์ด๋ธ์ ์ ์ํ๊ณ โemployee_countsโ ํ
์ด๋ธ๋ก๋ถํฐ ์ง์ข
๋ณ ์ง์ ์๋ฅผ ์กฐํํฉ๋๋ค.
WITH employee_counts AS ( SELECT LEFT(job_id,2) AS job_code , COUNT(LEFT(job_id,2)) AS employee_count FROM `HR.employees` GROUP BY job_code HAVING COUNT(job_code)>=20 ) SELECT * FROM employee_counts;

ย
์์ 4
๊ตญ๊ฐ ํ
์ด๋ธ๊ณผ ๋ถ์ ํ
์ด๋ธ, ์ง์ ํ
์ด๋ธ์ ์ด์ฉํ์ฌ ๊ตญ๊ฐ๋ณ ๋ถ์์ ๊ทผ๋ฌดํ๋ ์ง์ ์๋ฅผ ๊ตฌํฉ๋๋ค.
WITH dep_loc_join AS ( SELECT d.department_id , d.department_name , l.country_id FROM `HR.departments` AS d LEFT JOIN `HR.locations` AS l ON d.location_id = l.location_id ), dep_loc_emp_join AS ( SELECT e.employee_id , e.department_id , dl.department_name , dl.country_id FROM `HR.employees` AS e LEFT JOIN dep_loc_join AS dl ON e.department_id = dl.department_id ) SELECT country_id , department_name , COUNT(employee_id) AS employee_count FROM dep_loc_emp_join GROUP BY country_id, department_name;
ย
์์ 4-1
๊ตญ๊ฐ๋ณ ์ด๋ค ๋ถ์๋ค์ด ์๋์ง ์กฐํํ๊ธฐ ์ํ์ฌ โdepartmentsโ ํ
์ด๋ธ๊ณผ โlocationsโ ํ
์ด๋ธ์
LEFT JOIN
ํ์ฌ โdepartment_idโ, โdepartment_nameโ, โcountry_idโ๋ฅผ ์กฐํํ๊ณ โdep_loc_joinโ๋ผ๋ ์์ ํ
์ด๋ธ์ ์์ฑํฉ๋๋ค.WITH dep_loc_join AS ( SELECT d.department_id , d.department_name , l.country_id FROM `HR.departments` AS d LEFT JOIN `HR.locations` AS l ON d.location_id = l.location_id ) SELECT * FROM dep_loc_join;

ย
์์ 4-2
๊ตญ๊ฐ๋ณ ๋ถ์๋ณ ์ง์ ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด โemployeesโ ํ
์ด๋ธ๊ณผ ์์ 4-1์ โdep_loc_joinโ ํ
์ด๋ธ์
LEFT JOIN
ํ์ฌ โemployee_idโ, โdepartment_idโ, โdepartment_nameโ, โcountry_idโ๋ฅผ ์กฐํํ๊ณ โdep_loc_emp_joinโ ํ
์ด๋ธ๋ก ์์ฑํฉ๋๋ค.WITH dep_loc_join AS ( SELECT d.department_id , d.department_name , l.country_id FROM `HR.departments` AS d LEFT JOIN `HR.locations` AS l ON d.location_id = l.location_id ), dep_loc_emp_join AS ( SELECT e.employee_id , e.department_id , dl.department_name , dl.country_id FROM `HR.employees` AS e LEFT JOIN dep_loc_join AS dl ON e.department_id = dl.department_id ) SELECT * FROM dep_loc_emp_join;

ย
์์ 4-3
์์ 4-2์ โdep_loc_emp_joinโ ํ
์ด๋ธ์ ์ด์ฉํ์ฌ ๊ตญ๊ฐ๋ณ ๋ถ์๋ณ ์ง์ ์๋ฅผ ์กฐํํฉ๋๋ค. ์ด๋, โcountry_idโ, โdepartment_nameโ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ด์ค ํ ์ง์ ์(โemployee_countโ)๋ฅผ ๊ตฌํด์ค๋๋ค.
WITH dep_loc_join AS ( SELECT d.department_id , d.department_name , l.country_id FROM `HR.departments` AS d LEFT JOIN `HR.locations` AS l ON d.location_id = l.location_id ), dep_loc_emp_join AS ( SELECT e.employee_id , e.department_id , dl.department_name , dl.country_id FROM `HR.employees` AS e LEFT JOIN dep_loc_join AS dl ON e.department_id = dl.department_id ) SELECT country_id , department_name , COUNT(employee_id) AS employee_count FROM dep_loc_emp_join GROUP BY country_id, department_name;

ย
์์ 5
โemployeesโ ํ
์ด๋ธ์์ โdepartment_idโ ๋ณ๋ก โsalaryโ์ ๋ถ์ฐ์ ๊ณ์ฐํ๊ณ ์ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ถ์ฐ์ ๊ณ์ฐํ ๋๋
VARIANCE()
ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ํ, ๋ชจ์ง๋จ์ ๋ถ์ฐ์ ๊ตฌํ๋ ค๋ฉด VAR_POP()
ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.VARIANCE()
ํจ์๋ฅผ ์ด์ฉํ์ฌ โdepartment_idโ ๋ณ โsalaryโ์ ๋ถ์ฐ์ ๊ตฌํ๋ ์์
SELECT DISTINCT department_id , ROUND(VARIANCE(salary), 2) AS salary_variance FROM `HR.employees` GROUP BY department_id ORDER BY department_id;

ย
VAR_POP()
ํจ์๋ฅผ ์ด์ฉํ์ฌ โdepartment_idโ ๋ณ โsalaryโ์ ๋ถ์ฐ์ ๊ตฌํ๋ ์์
SELECT DISTINCT department_id , ROUND(VAR_POP(salary), 2) AS salary_variance FROM `HR.employees` GROUP BY department_id ORDER BY department_id;

ย
๊ทธ๋ฌ๋ ๋ถ์ฐ์ ๊ณ์ฐํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ, ์๋์ฐ ํจ์๋ฅผ ํ์ฉํ์ฌ ๋ถ์ฐ์ ๊ณ์ฐํ ์ ์์ต๋๋ค. ํธ์ฐจ์ ์ ๊ณฑ์ ํ๊ท ์ด ๋ถ์ฐ์์ ๊ณ ๋ คํ์ฌ, ์ฐ์ ํธ์ฐจ์ ํฉ์ด 0์์ ํ์ธํ ๋ค์, ํธ์ฐจ๋ฅผ ํ์ฉํ์ฌ ๋ถ์ฐ์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
WITH
๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.WITH
๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ- โdepartment_idโ ๋ณ โsalaryโ์ ํธ์ฐจ์ ํฉ์ ๊ตฌํ๋ ์์ ์ ๋๋ค.
WITH employee_salary_dev AS ( SELECT employee_id , salary - AVG(salary) OVER() AS deviation FROM `HR.employees` ) SELECT ROUND(SUM(deviation), 2) AS deviations_sum FROM employee_salary_dev;

WITH employee_salary_dev AS ( SELECT department_id , salary - AVG(salary) OVER(PARTITION BY department_id) AS deviation , COUNT(salary) OVER(PARTITION BY department_id) AS n FROM `HR.employees` ) SELECT department_id , ROUND(SUM(CASE WHEN n = 1 THEN 0 ELSE (deviation * deviation) / (n - 1) END), 2) AS variance FROM employee_salary_dev GROUP BY department_id ORDER BY department_id;

ย
WITH
๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ- โdepartment_idโ ๋ณ โsalaryโ์ ํธ์ฐจ์ ํฉ์ ๊ตฌํ๋ ์์ ์ ๋๋ค.
SELECT ROUND(SUM(dev), 2) AS deviations_sum FROM ( SELECT salary - AVG(salary) OVER() AS dev FROM `HR.employees` );

SELECT department_id , ROUND(SUM(CASE WHEN n = 1 THEN 0 ELSE (deviation * deviation) / (n - 1) END), 2) AS variance FROM ( SELECT department_id , salary - AVG(salary) OVER(PARTITION BY department_id) AS deviation , COUNT(salary) OVER(PARTITION BY department_id) AS n FROM `HR.employees` ) GROUP BY department_id ORDER BY department_id;

ย
10.2. ์๋ธ์ฟผ๋ฆฌ์ ์ข ๋ฅ
์๋ธ์ฟผ๋ฆฌ์ ์ข
๋ฅ๋ก๋ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ, ํ ์๋ธ์ฟผ๋ฆฌ, ์ด ์๋ธ์ฟผ๋ฆฌ, ํ
์ด๋ธ ์๋ธ์ฟผ๋ฆฌ ์ด 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ (Scalar Subquery):
๊ฒฐ๊ณผ๋ก ๋จ์ผ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก
SELECT
๋ฌธ์ ์ด ๊ฐ ๋๋ WHERE
์ ์ ์กฐ๊ฑด ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ๊ฐ ํ์ ๋ํ ๊ฐ์ ๊ณ์ฐํ๋๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.SELECT column1 , ( SELECT sub_column FROM sub_table WHERE condition ) AS alias FROM Table1;
ย
- ํ ์๋ธ์ฟผ๋ฆฌ (Row Subquery):
๊ฒฐ๊ณผ๋ก ํ๋์ ํ์ ๋ฐํํฉ๋๋ค. ์ฌ๋ฌ ์ด์ ๊ฐ์ ํฌํจํ๋ ๋จ์ผ ํ์ ๋ฐํํ๋ฉฐ ๋ค์ค ์ปฌ๋ผ์ ๋น๊ต๋ฅผ ์ํด
WHERE
์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.SELECT column1 , column2 FROM Table1 WHERE (column1, column2) = ( SELECT sub_column1 , sub_column2 FROM sub_table WHERE condition );
ย
- ์ด ์๋ธ์ฟผ๋ฆฌ (Column Subquery):
๊ฒฐ๊ณผ๋ก ์ฌ๋ฌ ๊ฐ์ ํฌํจํ๋ ๋จ์ผ ์ด์ ๋ฐํํฉ๋๋ค.
IN
, NOT IN
๋ฑ์ ์ฐ์ฐ์์ ํจ๊ป WHERE
์ ์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.SELECT column1 , column2 FROM Table1 WHERE column1 IN ( SELECT sub_column FROM sub_table WHERE condition );
ย
- ํ ์ด๋ธ ์๋ธ์ฟผ๋ฆฌ (Table Subquery):
๊ฒฐ๊ณผ๋ก ์ฌ๋ฌ ํ๊ณผ ์ด์ ๋ฐํํฉ๋๋ค. ์ฃผ๋ก
FROM
์ ์์ ์ฌ์ฉ๋๋ฉฐ, ์์ ํ
์ด๋ธ์ฒ๋ผ ์๋ํ์ฌ JOIN
์ฐ์ฐ์ด๋ ์ธ๋ผ์ธ ๋ทฐ๋ก ์ฌ์ฉํ ๋ ์ ์ฉํฉ๋๋ค.SELECT column1 , column2 FROM ( SELECT sub_column1 , sub_column2 FROM sub_table WHERE condition ) AS alias;
ย
10.2.1. ์ค์นผ๋ผ
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ ๋จ์ผ ๊ฐ์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ์๋ธ์ฟผ๋ฆฌ๋ ์ฃผ๋ก
SELECT
์ ์์ ์ฌ์ฉ๋๋ฉฐ, ๊ฒฐ๊ณผ์ ๊ฐ ํ์ ๋ํด ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๋จ์ผ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ํจ๊ป ์คํ๋๋ฉฐ, ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ํ์ด ์์ต๋๋ค. ๋์ฉ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ์คํ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ด ๋์์ผ๋ก JOIN
ํน์ WINDOW FUNCTION์ ํ์ฉํ ์ ์์ต๋๋ค.ย
๊ธฐ๋ณธ ๊ตฌ๋ฌธ
SELECT column1 , column2 , ( SELECT single_value FROM sub_table WHERE conditions ) AS scalar_sub_column FROM main_table WHERE main_table_conditions;
์ค๋ช
- main_table : ๋ฉ์ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ๋ ๋ฉ์ธํ ์ด๋ธ์ ๋๋ค.
- sub_table : ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ ํ ์ด๋ธ์ ๋๋ค.
- column1, column2 : ๋ฉ์ธ์ฟผ๋ฆฌ์์ ์ ํํ ์ด์ ๋๋ค.
- conditions : ๋ฉ์ธ์ฟผ๋ฆฌ ๋ฐ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ง์ ํ๋ ๋ถ๋ถ์ ๋๋ค.
- scalar_sub_column : ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฐํํ ๋จ์ผ ๊ฐ์ ์ ์ฅํ๋ ์ด์ ๋๋ค.
ย
์์ 1
๊ฐ ์ง์์ ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๊ณ์ฐํ๊ณ โmax_salary_for_departmentโ ์ปฌ๋ผ์ ์ถ๊ฐํ์ฌ ๊ฐ์ ๋ฐํํ ์ฟผ๋ฆฌ์
๋๋ค.
SELECT e.employee_id , e.department_id , e.first_name || ' ' || e.last_name AS full_name , e.salary , ( SELECT MAX(salary) FROM `HR.employees` as ms WHERE department_id = e.department_id ORDER BY e.salary DESC ) AS max_salary_for_department FROM `HR.employees` AS e ORDER BY department_id;
WITH
์ ์ ์ฌ์ฉํ์ฌ ๊ณตํต ํ
์ด๋ธ์ธ โMaxSalariesโ ๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์ธ์ฟผ๋ฆฌ์์์ ์ง์ ์ ๋ณด์ ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๊ฒฐํฉํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. WITH
์ ์ ์ ์ธํ ๊ณตํต ํ
์ด๋ธ์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํด ์ฝ๋์ ์ ์ง ๋ฐ ์์ ์ ์ฉ์ดํ๊ฒ ํด์ค๋๋ค.WITH MaxSalaries AS ( SELECT department_id , MAX(salary) AS max_salary FROM `HR.employees` GROUP BY department_id ) SELECT e.employee_id , e.department_id , e.first_name || ' ' || e.last_name AS full_name , e.salary , ms.max_salary AS max_salary_for_department FROM `HR.employees` AS e LEFT JOIN MaxSalaries AS ms ON e.department_id = ms.department_id ORDER BY e.department_id;

ย
์์ 2
โemployeesโ ํ
์ด๋ธ๊ณผ โjobsโ ํ
์ด๋ธ์ ํ์ฉํ์ฌ ์ง์์ ์ง๋ฌด ๋ช
์ ์กฐํํ๋ ์ฟผ๋ฆฌ์
๋๋ค. ํน์ ์ง์์ โemployee_idโ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ง์์ ์ง๋ฌด ์ด๋ฆ์ ์ค์นผ๋ผ ๊ฐ์ผ๋ก ์กฐํํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ์
WITH
์ ์ ์ฌ์ฉํ ์ฟผ๋ฆฌ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.SELECT employee_id , first_name || ' ' || last_name AS full_name , ( SELECT job_title FROM `HR.jobs` AS j WHERE j.job_id = e.job_id ) AS job_title FROM `HR.employees` AS e WHERE 1=1 , employee_id = 102;
WITH EmployeeJob AS ( SELECT e.employee_id , e.first_name || ' ' || e.last_name AS full_name , j.job_title FROM `HR.employees` AS e JOIN `HR.jobs` AS j ON e.job_id = j.job_id ) SELECT employee_id , full_name , job_title FROM EmployeeJob WHERE 1=1 , employee_id = 102;

ย
10.2.2 ์ธ๋ผ์ธ ๋ทฐ
์ธ๋ผ์ธ ๋ทฐ๋
FROM
์ ๋ด์์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ธ๋ผ์ธ ๋ทฐ๋ ์ฟผ๋ฆฌ ๋ด์์ ์์ ํ
์ด๋ธ๋ก ์๋ํ๋ฉฐ, ์ฃผ ์ฟผ๋ฆฌ์์ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ์ฌ ์์
์ ์ํํฉ๋๋ค. ์ธ๋ผ์ธ ๋ทฐ๋ ๋จ์ํ, ๋ฐ์ดํฐ ๋ณํ, ์ค๊ฐ ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑ ๋ฑ ๋ค์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ SQL ์ฟผ๋ฆฌ์ ํจ์จ์ฑ๊ณผ ๊ฐ๋
์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฟผ๋ฆฌ์ ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ , ์ค๊ฐ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ฉํ์ฌ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ ๋ฐ ๋์์ ์ค๋๋ค.์ธ๋ผ์ธ ๋ทฐ ๋ด์์
ORDER BY
๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง, ์ต์ข
๊ฒฐ๊ณผ ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ ๋ด ORDER BY
๋ ์ต์ข
๊ฒฐ๊ณผ์ ์ ๋ ฌ์ ๊ฒฐ์ ํ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ผ๋ถ๊ฐ ์๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์ต์ข
๊ฒฐ๊ณผ์ ์ ๋ ฌ์ ์ํ๋ค๋ฉด ์๋ธ์ฟผ๋ฆฌ๊ฐ ์๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ORDER BY
๋ฅผ ํฌํจ์์ผ์ผ ํฉ๋๋ค. ย
์ธ๋ผ์ธ ๋ทฐ๋ ์์ ํ
์ด๋ธ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ด ์ค๊ฐ ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑํจ์ผ๋ก์จ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค.
- ์์ ํ ์ด๋ธ์ฒ๋ผ ์๋: ์ธ๋ผ์ธ ๋ทฐ๋ ์ฟผ๋ฆฌ ์คํ ์ ์์์ ์ผ๋ก ์์ฑ๋๋ฉฐ, ์ฟผ๋ฆฌ ์คํ์ด ์๋ฃ๋๋ฉด ์ฌ๋ผ์ง๋๋ค.
- ๋ณต์กํ ์ฟผ๋ฆฌ์ ๋จ์ํ: ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์กฐ์ธ ์กฐ๊ฑด์ด๋ ํํฐ๋ง ๋ก์ง์ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ถ๋ฆฌํ์ฌ ์ฃผ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋ค์ค ์กฐ์ธ์ ์ค๊ฐ ๋จ๊ณ: ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธํ ๋, ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๊ฐ ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑํ ๊ฒฐ๊ณผ๋ฅผ ๋์์ผ๋ก ์ถ๊ฐ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ์ค๊ฐ ๊ฒฐ๊ณผ ์์ฑ: ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ค๊ฐ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
ย
๊ธฐ๋ณธ ๊ตฌ๋ฌธ
SELECT column1 , column2 FROM ( SELECT sub_column1 , sub_column2 FROM sub_table WHERE conditions ) AS inlineview_sub_column WHERE main_table_conditions;
์ค๋ช
- inlineview_sub_column: ์ธ๋ผ์ธ ๋ทฐ์ ๋ณ์นญ์ผ๋ก, ์ธ๋ผ์ธ ๋ทฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- column1, column2: ๋ฉ์ธ์ฟผ๋ฆฌ์์ ์ ํํ๋ ค๋ ๋ฉ์ธ ํ ์ด๋ธ์ ์ด์ ๋๋ค.
- sub_column1, sub_column2: ์ธ๋ผ์ธ ๋ทฐ ๋ด์์ ์ ํํ๋ ค๋ โTable"์ ์ด์ ๋๋ค.
- sub_table: ์ธ๋ผ์ธ ๋ทฐ ๋ด๋ถ์ ์๋ธ์ฟผ๋ฆฌ์์ ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ ๋๋ค.
- conditions: ์ธ๋ผ์ธ ๋ทฐ ๋ด์ ์๋ธ์ฟผ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์กฐ๊ฑด๋ค์ ๋๋ค.
- main_table_conditions: ์ธ๋ผ์ธ ๋ทฐ ์ธ๋ถ์ ๋ฉ์ธ์ฟผ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์กฐ๊ฑด๋ค์ ๋๋ค.
ย
์์ 1
โemployeesโ ํ
์ด๋ธ์ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ณ์ฐํ๋ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ธ๋ผ์ธ ๋ทฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ฉ์ธ์ฟผ๋ฆฌ๋ ์ธ๋ผ์ธ ๋ทฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ์ฌ ์ง์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ์กฐํํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ๋ ์ฃผ๋ก ์๋ ค์ง์ง ์์ ๊ฐ์ ๋จผ์ ์กฐํํ๊ฑฐ๋ ๊ณ์ฐํ ๋ค ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ์ธ์ฟผ๋ฆฌ์์ ํ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
์๋ ์์์์ ๋ณผ ์ ์๋ฏ์ด, โemployeesโ ํ
์ด๋ธ์ ์ ์ฒด ์ง์์ ํ๊ท ๊ธ์ฌ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์์ต๋๋ค. ์๋ธ์ฟผ๋ฆฌ์์๋ ์ด ๊ฐ์ ์๊ธฐ ์ํด ๋จผ์ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ณ์ฐ๋ ํ๊ท ๊ธ์ฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์์ ์ธ๋ผ์ธ ๋ทฐ์ ๊ฒฐ๊ณผ์ธ โavgs.avg_salaryโ์์ ์ฐธ์กฐ๋๋ฉฐ, ํด๋น ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ธ์ฌ๊ฐ ํ๊ท ๋ณด๋ค ๋์ ์ง์๋ค์ ํํฐ๋งํ์ฌ ์ง์์ ์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ์กฐํํฉ๋๋ค.
SELECT e.first_name , e.salary FROM `HR.employees` AS e ( SELECT AVG(salary) AS avg_salary FROM `HR.employees` ) AS avgs WHERE e.salary > avgs.avg_salary;
ย
WITH
์ ์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์ฟผ๋ฆฌ์ ๊ฐ๋
์ฑ์ด๊ธ์ฌ๋ฅผ ๊ณ์ฐํ๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ๋ ์์ ์ด๋ฆ์
๋๋ค. WITH AverageSalary AS ( SELECT AVG(salary) AS avg_salary FROM `HR.employees` ) SELECT e.first_name , e.salary FROM `HR.employees` AS e JOIN AverageSalary avgs ON e.salary > avgs.avg_salary;
ย
์์์ ๊ฒฐ๊ณผ๋ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์
WITH
์ ์ ์ฌ์ฉํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๊ฐ์ต๋๋ค.
ย
ย
์์ 2
๋ถ์๋ณ๋ก ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ โfirst_nameโ, โdepartment_idโ, โsalaryโ๋ฅผ ์กฐํํฉ๋๋ค.
์๋ ์๋ธ์ฟผ๋ฆฌ ์์๋ ๊ฐ โdepartment_idโ๋ณ๋ก ์ต๋ ๊ธ์ฌ โmax_salaryโ๋ฅผ ๊ณ์ฐํ์ฌ ๋ถ์๋ณ๋ก ๊ฐ์ฅ ๋์ ๊ธ์ฌ ๊ฐ์ ๋ฐํํฉ๋๋ค.
๋ฉ์ธ์ฟผ๋ฆฌ์์๋ ๋ฐํ๋ ๊ฐ์ฅ ๋์ ๊ธ์ฌ ๊ฐ์
JOIN
์ฐ์ฐ์ ํตํด โemployeesโ ํ
์ด๋ธ๊ณผ ๊ฒฐํฉํฉ๋๋ค. JOIN
์ฐ์ฐ์ โdepartment_idโ์ โsalaryโ ๊ธฐ์ค์ผ๋ก ์ด๋ฃจ์ด์ง๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ ๋ถ์์์ ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ์ ๋ณด๋ง ํํฐ๋งํ์ฌ ์กฐํํฉ๋๋ค.SELECT e.first_name , e.department_id , e.salary FROM `HR.employees` AS e JOIN ( SELECT department_id , MAX(salary) AS max_salary FROM `HR.employees` GROUP BY department_id ) AS d ON e.department_id = d.department_id AND e.salary = d.max_salary;
ย
๊ฐ ๋ถ์์ ์ต๋ ๊ธ์ฌ๋ผ๋ ์๋ ค์ง์ง ์์ ๊ธฐ์ค๊ฐ์ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฏ๋ก ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ํด๋น ๊ฐ์ ๋จผ์ ๊ณ์ฐํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ์ธ์ฟผ๋ฆฌ์์ ํ์ฉํฉ๋๋ค. ์ด์ ๊ฐ์ด ์๋ธ์ฟผ๋ฆฌ๋ ์๋ ค์ง์ง ์์ ๊ธฐ์ค์ผ๋ก ๊ฒ์ํ ๋ ์ฉ์ดํฉ๋๋ค.
ย
WITH
์ ์ ์ฌ์ฉํ๋ฉด โDepartmentMaxSalariesโ๋ผ๋ ์์ ์ด๋ฆ์ผ๋ก ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฟผ๋ฆฌ์ ๊ฐ๋
์ฑ์ด ํฅ์๋๋ฉฐ, ๋ณต์กํ ์ฟผ๋ฆฌ์ ๊ตฌ์ฑ์ ์ข ๋ ๋ช
ํํ๊ฒ ํ์
ํ ์ ์์ต๋๋ค.WITH DepartmentMaxSalaries AS ( SELECT department_id , MAX(salary) AS max_salary FROM `HR.employees` GROUP BY department_id ) SELECT e.first_name , e.department_id , e.salary FROM `HR.employees` AS e JOIN DepartmentMaxSalaries dms ON e.department_id = dms.department_id AND e.salary = dms.max_salary;
ย
์์์ ๊ฒฐ๊ณผ๋ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์
WITH
์ ์ ์ฌ์ฉํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๊ฐ์ต๋๋ค.
ย
์์ 3
์ง์ฑ
๋ณ ํ๊ท ๊ธ์ฌ์ ํด๋น ๊ธ์ฌ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ์กฐํํฉ๋๋ค.
์๋ ์๋ธ์ฟผ๋ฆฌ ์์์์ โemployeesโ ํ
์ด๋ธ์์ โjob_idโ๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ณ์ฐํ์ฌ โivโ๋ก ๋ณ์นญ์ ํฉ๋๋ค. ๋ฉ์ธ ์ฟผ๋ฆฌ์์๋ ํด๋น ๊ฒฐ๊ณผ๋ฅผ
JOIN
์ฐ์ฐํ์ฌ โemployeesโํ
์ด๋ธ๊ณผ ๊ฒฐํฉํฉ๋๋ค. JOIN
์ ON
์ ์์ โjob_idโ ๊ธฐ์ค์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ ๊ฐ โjob_idโ์ ๋ํ ๊ฐ ์ง์์ โsalaryโ์ โavg_salaryโ๊ฐ ํจ๊ป ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ORDER BY
์ ์์ ๊ฐ ์ง์์ โsalaryโ์ โavg_salaryโ์ ์ฐจ์ด๊ฐ ํฐ ์์๋๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ โjob_idโ์ ํ๊ท ๊ธ์ฌ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ด๋ ์ง์๋ถํฐ ์กฐํํ ์ ์์ต๋๋ค.SELECT e.first_name , e.job_id , e.salary , iv.avg_salary FROM `HR.employees` AS e JOIN ( SELECT job_id , AVG(salary) AS avg_salary FROM `HR.employees` GROUP BY job_id ) AS iv ON e.job_id = iv.job_id ORDER BY ABS(e.salary - iv.avg_salary) DESC;
๊ฐ โjob_idโ์ โavg_salaryโ๋ผ๋ ์๋ ค์ง์ง ์์ ๊ธฐ์ค์ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฏ๋ก, ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๊ธฐ์ค๊ฐ์ ๋จผ์ ๊ณ์ฐํ ํ ๋ฉ์ธ์ฟผ๋ฆฌ์์ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
WITH
์ ์ ์ฌ์ฉํ๋ฉด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์ โJobAverageSalariesโ๋ผ๋ ์ผ์์ ์ธ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ์์ ์ฟผ๋ฆฌ์ ๊ฐ๋
์ฑ์ ๋์ด๋ฉฐ, ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ฌ์ค๋๋ค.WITH JobAverageSalaries AS ( SELECT job_id , AVG(salary) AS avg_salary FROM `HR.employees` GROUP BY job_id ) SELECT e.first_name , e.job_id , e.salary , jas.avg_salary FROM `HR.employees` AS e JOIN JobAverageSalaries AS jas ON e.job_id = jas.job_id ORDER BY ABS(e.salary - jas.avg_salary) DESC;
ย
์์์ ๊ฒฐ๊ณผ๋ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์
WITH
์ ์ ์ฌ์ฉํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๊ฐ์ต๋๋ค.
ย
10.2.3. ์ค์ฒฉ
์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ๋ ํ๋์ SQL ์ฟผ๋ฆฌ ์์ ๋ค๋ฅธ ์๋ธ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ๋ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ํ๊ฐํ๊ฑฐ๋ ๋น๊ตํ๊ธฐ ์ํด ์ฃผ๋ก
WHERE
์ ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋, ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ๋ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํ๋๋ฉฐ, ์๋ธ์ฟผ๋ฆฌ ๋ด๋ถ์์๋ ์ธ๋ถ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ์กฐ๊ฑด์ ํ์ฉํฉ๋๋ค.์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์ฟผ๋ฆฌ ์์์ ์ฌ๋ฌ ์์ค์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๊ฑฐ๋, ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ๊ณ์ฐ์ด๋ ๋น๊ต๋ฅผ ํ ์ ์์ต๋๋ค.
ย
๊ธฐ๋ณธ ๊ตฌ๋ฌธ
SELECT main_column1 FROM main_table WHERE main_column2 operator ( SELECT sub_column FROM sub_table WHERE sub_condition );
์ค๋ช
- main_column1: ์ธ๋ถ ์ฟผ๋ฆฌ์์ ์ ํํ ์ฃผ์ ์ด์ ์ง์ ํฉ๋๋ค.
- main_table: ์ธ๋ถ ์ฟผ๋ฆฌ์ ์ฃผ ํ ์ด๋ธ์ ์ง์ ํฉ๋๋ค.
- main_column2: ์ธ๋ถ ์ฟผ๋ฆฌ์์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ ์ฃผ์ ์ด์ ์ง์ ํฉ๋๋ค.
- operator: ๋น๊ต ์ฐ์ฐ์(์:
=
,>
,<
,IN
๋ฑ)๋ฅผ ์ง์ ํฉ๋๋ค.
- sub_column: ์๋ธ์ฟผ๋ฆฌ์์ ์ ํํ ์ด์ ์ง์ ํฉ๋๋ค.
- sub_table: ์๋ธ์ฟผ๋ฆฌ์ ํ ์ด๋ธ์ ์ง์ ํฉ๋๋ค.
- sub_condition: ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋๋ ์กฐ๊ฑด์ ์ง์ ํฉ๋๋ค.
ย
์์ 1
์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํตํด โemployeesโ ํ
์ด๋ธ์์ 2005๋
1์ 1์ผ ์ดํ ์
์ฌํ ์ง์๋ค์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๊ธ์ฌ๊ฐ ๋์ ์ง์์ ์์ด๋, ์ฑ, ์ด๋ฆ, ์
์ฌ์ผ, ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ์
๋๋ค.
SELECT employee_id , first_name , last_name , hire_date , salary FROM `HR.employees` WHERE salary > ( SELECT AVG(salary) FROM `HR.employees` WHERE hire_date > '2005-01-01' );

ย
์์ 2
์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํตํด โdepartmentsโ ํ
์ด๋ธ์์ โmanger_idโ ์ปฌ๋ผ์ด
NULL
์ธ โdepartment_idโ๋ฅผ ์กฐํํ๊ณ , โemployeesโ ํ
์ด๋ธ์์ ํด๋น โdepartment_idโ์ ์ํ์ง ์์ ์ง์์ โdepartment_idโ์ โemployee_idโ๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ์
๋๋ค.SELECT department_id , employee_id FROM `HR.employees` WHERE department_id NOT IN ( SELECT department_id FROM `HR.departments` WHERE manager_id IS NULL );

ย
์์ 3
percentile ํจ์(๋ฐฑ๋ถ์ ํจ์)๋ฅผ ์ด์ฉํ์ฌ โemployeesโ ํ
์ด๋ธ์์ ์ง์๋ค์ ๊ธ์ฌ(โsalaryโ)๊ฐ ์์ 25%์ ํด๋นํ๋ ๊ฐ, ์ฆ 75๋ฒ์งธ ๋ฐฑ๋ถ์์๋ฅผ ์ฐพ๊ณ , ์ด๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์๋ค์ ์์ด๋(โemployee_idโ)์ ๊ธ์ฌ(โsalaryโ)๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ์
๋๋ค.
SELECT employee_id , salary FROM `HR.employees` WHERE salary > ( SELECT percentile_cont(salary, 0.75) OVER() FROM `HR.employees` LIMIT 1 ) ORDER BY salary DESC;

ย
10.2.4. IN
IN
์ฐ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ ์์ ํน์ ๊ฐ์ ํฌํจํ๊ฑฐ๋ ํฌํจํ์ง ์๋์ง ํ์ธํฉ๋๋ค. NOT IN
์ฐ์ฐ์๋ ๊ทธ ๋ฐ๋์ ์กฐ๊ฑด์ ๋ํ๋
๋๋ค.ย
๊ธฐ๋ณธ ๊ตฌ๋ฌธ
value [ NOT ] IN ( subquery )
ย
์์ 1
๋ค์์ ์ง์
๋ช
์ด 'Sales Representative', 'Marketing Manager'์ธ ์ง์์ ์์ด๋์, ์ด๋ฆ์ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ์
๋๋ค.
SELECT employee_id , first_name || ' ' || last_name AS full_name FROM `HR.employees` WHERE 1=1 , job_id IN ( SELECT job_id FROM `HR.jobs` WHERE 1=1 , job_title IN ('Sales Representative', 'Marketing Manager') );
WITH SelectedJobs AS ( SELECT job_id FROM `HR.jobs` WHERE job_title IN ('Sales Representative', 'Marketing Manager') ) SELECT e.employee_id , e.first_name || ' ' || e.last_name AS full_name FROM `HR.employees` AS e WHERE 1=1 , e.job_id IN ( SELECT job_id FROM SelectedJobs );

ย
์์ 2
โdepartmentsโ ํ
์ด๋ธ์์ ํน์ ๋ถ์ 'Sales', 'Marketing'์ ์ํ์ง ์์ ์ง์์ ์ฐพ๋
NOT IN
์๋ธ์ฟผ๋ฆฌ์
๋๋ค.SELECT employee_id, , first_name || ' ' || last_name AS full_name , department_id FROM `HR.employees` WHERE department_id NOT IN ( SELECT department_id FROM `HR.departments` WHERE 1=1 , department_name IN ('Sales', 'Marketing') );
WITH ExcludedDepartments AS ( SELECT department_id FROM `HR.departments` WHERE department_name IN ('Sales', 'Marketing') ) SELECT e.employee_id , e.first_name || ' ' || e.last_name AS full_name , e.department_id FROM `HR.employees` AS e WHERE 1=1 , e.department_id NOT IN ( SELECT department_id FROM ExcludedDepartments );

ย
10.2.5. EXISTS
EXISTS
๋ SQL์์ ์ฌ์ฉ๋๋ ๋
ผ๋ฆฌ ์ฐ์ฐ์๋ก, ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. EXISTS
์๋ธ์ฟผ๋ฆฌ๋ ์ฃผ๋ก WHERE
์ ์์ ์ฌ์ฉ๋๋ฉฐ, ์ธ๋ถ ์ฟผ๋ฆฌ์ ๊ฐ ํ์ ๋ํด ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ์ฐธ ๋๋ ๊ฑฐ์ง์ ํ๋จํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ ๋ด์์๋ ์ผ๋ฐ์ ์ผ๋ก SELECT
๋ฌธ์ด ์๋๋ผ ๋จ์ํ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๊ฐ ์๋์ง๋ฅผ ํ์ธํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋น์ด์์ง ์์ผ๋ฉด TRUE
๋ฅผ ๋ฐํํ๊ณ , ๊ฒฐ๊ณผ๊ฐ ๋น์ด์์ผ๋ฉด FALSE
๋ฅผ ๋ฐํํฉ๋๋ค.ย
๊ธฐ๋ณธ ๊ตฌ๋ฌธ
SELECT
์ ์์์ ๊ตฌ๋ฌธSELECT EXISTS ( SELECT 'found' FROM sub_table WHERE condition ) AS exists_result;
ย
WHERE
์ ์์์ ๊ตฌ๋ฌธSELECT column1 , column2 FROM main_table WHERE EXISTS ( SELECT 'found' FROM sub_table WHERE condition );
์ค๋ช
- column1, column2: ๋ฐํํ ์ด์ ์ง์ ํฉ๋๋ค.
- main_table: ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์ง์ ํฉ๋๋ค.
- sub_table: ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ๋ ๋ฒ์งธ ํ ์ด๋ธ์ ์ง์ ํฉ๋๋ค.
- found: ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋ ๊ฐ์ผ๋ก, ์ค์ ๋ก๋ ํญ์ ์ฐธ(
TRUE
)์ผ๋ก ํ๊ฐ๋๋ ์์์ ๊ฐ์ ๋๋ค. ์ด ๊ฐ์EXISTS
์๋ธ์ฟผ๋ฆฌ์์ ์กฐ๊ฑด์ด ์ฐธ์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- condition: ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ์กฐ๊ฑด์ ์ง์ ํฉ๋๋ค.
ย
์์
EXISTS
์๋ธ์ฟผ๋ฆฌ๋ฅผ ํตํด โdepartmentsโ ํ
์ด๋ธ์ ๋ถ์ ์์ด๋๊ฐ 50์ธ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์ด ํ๋๋ผ๋ ์กด์ฌํ๋ค๋ฉด, โemployeesโ ํ
์ด๋ธ์ ์ง์ ์์ด๋, ์ง์
์์ด๋, ๋ถ์ ์์ด๋๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ์
๋๋ค.SELECT employee_id , job_id , department_id FROM `HR.employees` WHERE EXISTS ( SELECT 1 FROM `HR.departments` WHERE department_id = 50 )

ย
10.2.6. ์๊ด
์๊ด ์๋ธ์ฟผ๋ฆฌ๋ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์ด์ ์ฐธ์กฐํ์ฌ ์คํ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋จ์ํ ์ธ๋ถ ์ฟผ๋ฆฌ์์ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ์๊ด ์๋ธ์ฟผ๋ฆฌ๋ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์๋ก ์ฐ๊ด์ฑ์ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ธ๋ถ ์ฟผ๋ฆฌ์ ์คํ์ ์ํฅ์ ๋ฏธ์น๊ฒ ๋ฉ๋๋ค.
ย
SELECT
์ ์์์ ๊ตฌ๋ฌธSELECT m.column1 , m.column2 ( SELECT s.value FROM sub_table s WHERE s.id = m.id ) AS subquery_result FROM main_table AS m;
ย
WHERE
์ ์์์ ๊ตฌ๋ฌธSELECT m.column1 , m.column2 FROM main_table m WHERE operator ( SELECT s.value FROM sub_table s WHERE m.id = s.id );
์ค๋ช
- main_table (m): ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์ง์ ํฉ๋๋ค.
- sub_table (s): ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ๋ ๋ฒ์งธ ํ ์ด๋ธ์ ์ง์ ํฉ๋๋ค.
- m.id: ๋ฉ์ธ ํ ์ด๋ธ โmain_tableโ์ id ์ด์ ๋ํ๋ ๋๋ค.
- s.id: ์๋ธ ํ ์ด๋ธ โsub_tableโ์ id ์ด์ ๋ํ๋ ๋๋ค. ์ด ์ด์ ์ธ๋ถ ์ฟผ๋ฆฌ์ ๋ฉ์ธ ํ ์ด๋ธ๊ณผ ์๋ธ์ฟผ๋ฆฌ์ ์๋ธ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- operator: ๋น๊ต ์ฐ์ฐ์(์:
=
,>
,<
,IN
๋ฑ)๋ฅผ ์ง์ ํฉ๋๋ค.
ย
์์
์๊ด ์๋ธ์ฟผ๋ฆฌ ๋ด์ โjob_historyโ ํ
์ด๋ธ์ ์ง์ ์์ด๋์ ์ธ๋ถ ์ฟผ๋ฆฌ์ โemployeesโ ํ
์ด๋ธ์ ์ง์ ์์ด๋๊ฐ ๊ฐ์ ์ง์์ ์ฑ๊ณผ ์ด๋ฆ ๋ฐ ์ง์ ์์ด๋๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ์
๋๋ค.
SELECT e.first_name , e.last_name , e.employee_id FROM `HR.employees` AS e WHERE EXISTS ( SELECT employee_id FROM `HR.job_history` AS j WHERE j.employee_id = e.employee_id );

๋ค์๊ณผ ๊ฐ์ด, โemployeesโ ํ
์ด๋ธ์ ์ง์ ์์ด๋(โemployee_idโ) ์ค โjob_historyโ ํ
์ด๋ธ์ ์ํ ์ง์ ์์ด๋(โemployee_idโ)์ ์ผ์นํ๋ ์ฌ์์ ์ด๋ฆ(โfirst_nameโ), ์ฑ(โlast_nameโ) ๋ฐ ์ง์ ์์ด๋(โemployee_idโ)๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ย
10.2.7. ARRAY
๋ฐฐ์ด ํํ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ํน๋ณํ ์๋ธ์ฟผ๋ฆฌ ํํ ๋ฐฉ๋ฒ์
๋๋ค. ๊ฒฐ๊ณผ๊ฐ 0ํ ์ผ ๋ ๋น ๋ฐฐ์ด์ ๋ฐํํ๊ณ
NULL
๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค. ARRAY
์๋ธ์ฟผ๋ฆฌ๋ ๋ฐํ ๋ฐฐ์ด์ ๋ํ ์ ํ์ด ์ปฌ๋ผ ๋น ๋จ์ผํ ์ ํ์ด์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. SELECT AS STRUCT
์ ํจ๊ป ์์ฑํ๋ ค๋ฉด SELECT
๋ชฉ๋ก์ ์ฌ๋ฌ ๊ฐ์ ์ด์ด ํฌํจ๋ ์ ์์ผ๋ฉฐ, ๋ฐฐ์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฐ์ STRUCT
์ ๋ฐฐ์ด ๊ตฌ์กฐ๋ก ๋ฐํ๋ฉ๋๋ค. SELECT AS
์์ด ์ฌ๋ฌ ์ด์ ์ ํํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.ย
๊ธฐ๋ณธ ๊ตฌ๋ฌธ
ARRAY ( subquery )
ย
์์ 1
โjob_idโ๊ฐ 'SA_MAN'์ธ ์ง์๋ค์ โfirst_nameโ์ ๋ฐฐ์ด๋ก ์ ํํ๋ ์ฟผ๋ฆฌ์
๋๋ค.
SELECT ARRAY( SELECT first_name FROM `HR.employees` WHERE job_id='SA_MAN' ) AS SA_MAN;
WITH SaManEmployees AS ( SELECT ARRAY_AGG(first_name) AS SA_MAN FROM `HR.employees` WHERE job_id = 'SA_MAN' ) SELECT SA_MAN FROM SaManEmployees;

ย
์์ 2
๋ถ์๋ณ ์ง์ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ์์ฑํ๋ ์ฟผ๋ฆฌ์
๋๋ค.
GROUP BY
์ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ ARRAY_AGG
๋ก ์ฌ์ฉํฉ๋๋ค.SELECT department_id , ARRAY_AGG(first_name) AS employees_name FROM `HR.employees` GROUP BY department_id;
WITH DepartmentEmployees AS ( SELECT department_id , ARRAY_AGG(first_name) AS employees_name FROM `HR.employees` GROUP BY department_id ) SELECT department_id , employees_name FROM DepartmentEmployee;
