๐ก ์ผ๋ฐ์ ์ผ๋ก๋ ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค ์กฐ์ธ์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง๋ง, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ ์ฑ๋ฅ์ด ์ข๊ณ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ ๊ฒ. ๋ฌผ๋ก , ์กฐ์ธ์ด ์๋ ์๋ธ์ฟผ๋ฆฌ๋ก๋ง ํ ์ ์๋ ๋ฌธ์ ๋ ์๋ค.
SQL Developer์ โ๊ณํ์ค๋ช โ ํญ์์ ๊ฐ ์ฟผ๋ฆฌ ๋ณ ์คํ ์์ ๋ฐ ๋น์ฉ(cost)์ ํ์ธํ ์ ์๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ท๋ชจ๊ฐ ํด ์๋ก ์ฑ๋ฅ ํ๋, ์ต์ ์ ์คํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
select column, column
from table
where column ์ฐ์ฐ์ (select column
from table)where ์
having ์
from ์ (์๋ธ์ฟผ๋ฆฌ๋ณด๋ค๋ ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค.)
select๋ฌธ์ from์ ๋ด๋ถ์ select๋ฌธ์ผ๋ก ๋ง๋ค์ด์ง ๋ทฐ(๊ฐ์์ ํ
์ด๋ธ)๋ฅผ
์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ๋ถ๋ฅด๊ณ , ์ด๋ ๋ด๋ถ์ select๋ฌธ์ด ์ข
๋ฃ๋๋ฉด ์ฌ๋ผ์ง๋ค.
DB์ ๋ทฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅํด๋๋ฉด ๊ณ์ ๋จ์์์ด ์ฌ์ฉํ ์ ์๋ค.
์กฐ๊ฑด์์์ ์ฌ์ฉ๋๋ค.๋น๊ต๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ด ์ฟผ๋ฆฌ์ ์คํ๊ฒฐ๊ณผ๋ก๋ง ํ๋ํ ์ ์์ ๋ ์ฌ์ฉ๊ดํธ๋ก ๋ฌถ๋๋ค.์ ์ ํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.ํ ํ๋ง ๋ฐํ๋๋ค. (์คํ๊ฒฐ๊ณผ๊ฐ 1ํ, 1์ด์ด๋ค.)์ฌ๋ฌ ํ์ด ๋ฐํ๋๋ค. (์คํ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ํ, 1์ด์ด๋ค.)| ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ | ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ |
|---|---|
| = | in |
| <> ์ค๋ผํด์์๋ != | not in |
| > | >any, >all |
| < | <any <all |
๐ก IN ์ฐ์ฐ์๋ ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ์์๋ = ๋์ ์ฌ์ฉํ ์ ์๋ค.
๋ฐ๋ผ์ ๋จ์ผํ, ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ์ ์๊ด์์ด ์์ ํ๊ฒ ์ธ ์ ์์ผ๋ฏ๋ก
๋๋ฑ ๋น๊ต์ ๋ํด์๋ = ๋ณด๋ค๋ IN์ ์ฌ์ฉํ๋ค.
๋ ๊ฐ ์ด์์ ์ปฌ๋ผ๊ฐ์ด ์กฐํ์กฐ๊ฑด์ผ๋ก ๋ฐํ๋๋ค. (ํ์ ์๋ ์๊ด ์๋ค.)๋น๊ต ์ฐ์ฐ์: IN, NOT IN (ํฌ๊ธฐ ๋น๊ต ์ฐ์ฐ์ ๋ถ๊ฐ๋ฅํ๋ค.)
๋ ์ปฌ๋ผ์ ๋ฐ์ดํฐ ํ์ ์ด ๋์ผํ๊ฑฐ๋, ์ปฌ๋ผ์ ๊ฐ์ด ๋ฌต์์ ํ๋ณํ์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
select column, column, ....
from table1
where (column1, column2) in (select column3, column4
from table2)
IN : ์๋ ๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๋ง์กฑํ๋ ํ์ ์กฐํ
colum1=column3 and colum2=colum4
NOT IN : ์๋ ๋ ๊ฒฝ์ฐ ์ค ํ๋๋ผ๋ ๋ง์กฑํ์ง ์๋ ๊ฒฝ์ฐ(ํ๋๋ผ๋ ๊ฐ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ)๋ฅผ ์กฐํ
column1โ column3 or column2โ column4
where์ ์ขํญ์ column1๊ณผ ์๋ธ์ฟผ๋ฆฌ ๋ด column3์ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐwhere์ ์ขํญ์ column2๊ณผ ์๋ธ์ฟผ๋ฆฌ ๋ด column4์ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ๋ณต์ ๊ฐ์ ์กฐ๊ฑด์ ๋ํ์ฌ ๊ฐ๋ณ์ ์ผ๋ก ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
-- 80๋ฒ ๋ถ์์์ ๊ทผ๋ฌดํ๊ณ , 80๋ฒ ๋ถ์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๊ธ์ฌ๋ฅผ ๋ง์ด ๋ฐ์ ์ง์์ด๊ณ , 80๋ฒ ๋ถ์์ ๊ด๋ฆฌ์์ ๊ฐ์ ํด์ ์
์ฌํ ์ง์์ ์กฐํํ๊ธฐ
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
AND SALARY > (SELECT AVG(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80)
AND TO_CHAR(HIRE_DATE, 'YYYY') = (SELECT TO_CHAR(E.HIRE_DATE, 'YYYY')
FROM EMPLOYEES E, DEPARTMENTS D
WHERE E.EMPLOYEE_ID = D.MANAGER_ID
AND D.DEPARTMENT_ID = 80);
๋ค์คํ ํจ์์ ์ค์ฒฉ์ SELECT์ ์์๋ง ํ์ฉ๋๋ค.
๋ฐ๋ผ์ HAVING COUNT(*) = MAX(COUNT(*))๋ผ๊ณ ๊ทธ๋๋ก ์ธ ์ ์๊ณ , ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค.
SELECT JOB_ID, COUNT(*)
FROM EMPLOYEES
GROUP BY JOB_ID
HAVING COUNT(*) > 10
ORDER BY JOB_ID;
-- ์ง์ข
๋ณ๋ก ์ฌ์์๋ฅผ ์กฐํํ์ ๋ ์ฌ์์๊ฐ ๊ฐ์ฅ ๋ง์ ์ง์ข
์ ์กฐํํ๊ธฐ
SELECT JOB_ID, COUNT(*) CNT
FROM EMPLOYEES
GROUP BY JOB_ID
HAVING COUNT(*) = (SELECT MAX(COUNT(*))
FROM EMPLOYEES
GROUP BY JOB_ID);
WITH์ ์ ์ฌ์ฉํ๋ฉด SQL๋ฌธ์์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋๋ SQL๋ฌธ ํน์ ์คํ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์์ ํ ์ด๋ธ๋ก ์์ฑํ๊ณ , ๊ทธ ์คํ๊ฒฐ๊ณผ๋ฅผ ์์๋ก ์ ์ฅํ ์ ์๋ค.
WITH ๊ฐ์ํ
์ด๋ธ๋ณ์นญ
AS (SELECT ์ปฌ๋ผ๋ช
1, ์ปฌ๋ผ๋ช
2, ํํ์ ๋ณ์นญ1, ํํ์ ๋ณ์นญ2
FROM ํ
์ด๋ธ๋ช
WHERE ์กฐ๊ฑด์)
SELECT ์ปฌ๋ผ๋ช
1, ์ปฌ๋ผ๋ช
2, ๋ณ์นญ1, ๋ณ์นญ2
FROM ๊ฐ์ํ
์ด๋ธ๋ณ์นญ
-- ์ง์ข
๋ณ๋ก ์ฌ์์๋ฅผ ์กฐํํ์ ๋ ์ฌ์์๊ฐ ๊ฐ์ฅ ๋ง์ ์ง์ข
์ ์กฐํํ๊ธฐ
-- ์์ SQL์ WITH์ ์ ์ฌ์ฉํด์ ๋ณ๊ฒฝํ๊ธฐ
WITH JOB_EMPS -- SELECT๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์์ ํ
์ด๋ธ๋ก ์ง์ . ์ฌ๋ฌ ๊ฐ์ ํ
์ด๋ธ์ ๋ง๋ค ์ ์๋ค.
AS (SELECT JOB_ID, COUNT(*) CNT
FROM EMPLOYEES
GROUP BY JOB_ID)
SELECT JOB_ID, CNT
FROM JOB_EMPS
WHERE CNT = (SELECT MAX(CNT)
FROM JOB_EMPS);
-- ์ง์ข
๋ณ๋ก ์ฌ์์๋ฅผ ์กฐํํ์ ๋ ์ฌ์์๊ฐ ๊ฐ์ฅ ๋ง์ ์ง์ข
์ ์กฐํํ๊ธฐ
-- ์์ฌ์นผ๋ผ ROWNUM์ ์๋ฒ์ ์ด์ฉํด์ ์กฐํํ๊ธฐ. ์๋ฒ์ด 1๋ฒ์ธ ํ์ด ์ฌ์์๊ฐ ๊ฐ์ฅ ๋ง์ ์ง์ข
์ ํ์ด๋ค.
SELECT JOB_ID, CNT
FROM (SELECT JOB_ID, COUNT(*) CNT
FROM EMPLOYEES
GROUP BY JOB_ID
ORDER BY CNT DESC) -- ์ง์ข
๋ณ ์ฌ์์๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๊ฐ์์ ํ
์ด๋ธ
WHERE ROWNUM = 1; -- ์กฐํ๊ฒฐ๊ณผ์ ์๋ฒ 1์ธ ํ์ ์กฐํ (ROWNUM ์ปฌ๋ผ์ด ์๋ค๋ ๊ฒ์ ๊ฐ์ )