๐ก ์ผ๋ฐ์ ์ผ๋ก๋ ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค ์กฐ์ธ์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง๋ง, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ ์ฑ๋ฅ์ด ์ข๊ณ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ ๊ฒ. ๋ฌผ๋ก , ์กฐ์ธ์ด ์๋ ์๋ธ์ฟผ๋ฆฌ๋ก๋ง ํ ์ ์๋ ๋ฌธ์ ๋ ์๋ค.
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 ์ปฌ๋ผ์ด ์๋ค๋ ๊ฒ์ ๊ฐ์ )