-
์ปฌ๋ผ ๋ณ์นญ: AS ํค์๋๋ ์ ํ์ ์ด๋ค.
-
ํ ์ด๋ธ ๋ณ์นญ: ํ ์ด๋ธ๋ช ALIAS๋ช
SELECT TB1.NAME AS N, -- ์ปฌ๋ผ์ ALIAS๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
TB1.AGE A, -- AS๋ฅผ ๋ถ์ด์ง ์์๋ ์ฌ์ฉ๊ฐ๋ฅ
TB1.'123' AS NUM
FROM TB1
SELECT A.NAME
FROM TB1 A, TB2 B -- ํ
์ด๋ธ์ ALIAS๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
WHERE A.NAME = B.NAME
- ์ค๋ผํด์์ ์กฐํ๋ ํ์ด ๋ช๋ฒ์งธ ํ์ธ์ง ๋ถ์ฌ
-- ROWNUM์ ์ ๋ ฌ ์ ์ ํ ๋น
SELECT ROWNUM, ENAME, JOB, SAL
FROM SCOTT.EMP
-- ์ ๋ ฌ๋ ๊ฒฐ๊ณผ์ ์์ ๋ถ์ฌ
SELECT ROWNUM, ENAME, JOB, SAL
FROM (SELECT ENAME, JOB, SAL
FROM SCOTT.EMP
ORDER BY JOB)
-- ROWNUM์ ์ญ์์ผ๋ก ์ฌ์ฉ
SELECT ROWNUM, ENAME, JOB, SAL
FROM (SELECT ENAME, JOB, SAL
FROM SCOTT.EMP
ORDER BY JOB)
ORDER BY ROWNUM DESC
-- ROWNUM์ด 1~3์ธ ๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
SELECT ROWNUM, ENAME, JOB, SAL
FROM SCOTT.EMP
WHERE ROWNUM BETWEEN 1 AND 3
-
SELECT ์ชฝ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ฌ ๊ฒฝ์ฐ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ (Scalar Subqueries)
-
FROM ์ ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ฌ ๊ฒฝ์ฐ์๋ ์ธ๋ผ์ธ ๋ทฐ (Inline View)
-
WHERE ์ ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ฌ ๊ฒฝ์ฐ์๋ ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ (Nested Subqueries)
-- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
SELECT 'ํ์ ์' AS NAME,
(SELECT AGE
FROM TB1
WHERE NAME = 'ํ์ ์'
) AS AGE
FROM DUAL
-- ์ธ๋ผ์ธ ๋ทฐ
SELECT AGE
FROM (SELECT AGE
FROM TB1
WHERE NAME = 'ํ์ ์')
-- ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ
SELECT NAME, AGE
FROM TB1
WHERE NAME = (SELECT NAME
FROM TB1
WHERE NAME = 'ํ์ ์')
- ์ค๋ผํด์์ OVER()๋ฅผ ์ฌ์ฉํ๋ฉด GROUP BY๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๋ถ์ ํจ์ (SUM, MAX, COUNT)์ ์ง๊ณ ํจ์ (GROUP BY, ORDER BY)๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์ง๊ณ ํจ์ ์ฌ์ฉ ์, ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ง๋์น๊ฒ ๊ธธ์ด์ง โ OVER()๋ฅผ ์ฌ์ฉํด ์ฟผ๋ฆฌ ๊ธธ์ด๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ
<๋ถ์ํจ์>(<์ปฌ๋ผ>) OVER (
[PARTITION BY <์ปฌ๋ผ1>, <์ปฌ๋ผ2>, ...]
[ORDER BY <์ปฌ๋ผ1> [ASC|DESC], <์ปฌ๋ผ2> [ASC|DESC], ...]
[ROWS BETWEEN <์์์ > AND <๋์ >]
)
- PARTITION BY: ํ๋ค์ ์ง์ ํ ์ปฌ๋ผ์ ๊ฐ์ ๋ฐ๋ผ ํํฐ์ ์ผ๋ก ๋๋๋ค.
- ORDER BY: ์ง์ ๋ ์ปฌ๋ผ์ ๊ฐ์ ๋ฐ๋ผ ๊ฐ ํํฐ์ ๋ด์์ ํ๋ค์ ์ ๋ ฌ.
- ROWS BETWEEN: ํน์ ํ์ ๊ธฐ์ค์ผ๋ก ๋ช ๊ฐ์ ํ์ ํฌํจํ ์ง๋ฅผ ์ง์ .
์์
SELECT
employee_id,
department_id,
salary,
SUM(salary) OVER (PARTITION BY department_id) as dept_total_salary,
AVG(salary) OVER (PARTITION BY department_id) as avg_salary,
MAX(salary) OVER (PARTITION BY department_id) as max_salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as rank
FROM employees;
-- INNER JOIN: TB1๊ณผ TB2์์ ์กฐ๊ฑด์ ๋ง๋ ๋ ์ฝ๋๋ง ๋ฐํ.
SELECT *
FROM TB1 JOIN TB2
ON TB1.NAME = TB2.NAME;
-- LEFT OUTER JOIN: TB1์ ๋ชจ๋ ๋ ์ฝ๋์, ์กฐ๊ฑด์ ๋ง๋ TB2์ ๋ ์ฝ๋๋ฅผ ๋ฐํ.
-- TB2์ ๋งค์นญ๋๋ ๋ ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ NULL ๊ฐ์ ๋ฐํ.
SELECT *
FROM TB1 LEFT OUTER JOIN TB2
ON TB1.NAME = TB2.NAME;
-- RIGHT OUTER JOIN: TB2์ ๋ชจ๋ ๋ ์ฝ๋์, ์กฐ๊ฑด์ ๋ง๋ TB1์ ๋ ์ฝ๋๋ฅผ ๋ฐํ.
-- TB1์ ๋งค์นญ๋๋ ๋ ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ NULL ๊ฐ์ ๋ฐํ.
SELECT *
FROM TB1 RIGHT OUTER JOIN TB2
ON TB1.NAME = TB2.NAME;
-- FULL OUTER JOIN: TB1 ๋๋ TB2์ ์๋ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ฐํ.
-- ์กฐ๊ฑด์ ๋ง๋ ๋ ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ์ปฌ๋ผ์ NULL ๊ฐ์ ๋ฐํ.
SELECT *
FROM TB1 FULL OUTER JOIN TB2
ON TB1.NAME = TB2.NAME;
-
UNION์ ์ค๋ณต์ ์ ๊ฑฐํ๋ฉด์ ๋ ๊ฒฐ๊ณผ ์งํฉ์ ํฉ์น ๋ ์ฌ์ฉ.
-
UNION ALL์ ์ค๋ณต์ ์ ๊ฑฐํ์ง ์๊ณ ๋ ๊ฒฐ๊ณผ ์งํฉ์ ํฉ์น ๋ ์ฌ์ฉ.
-
INTERSECT๋ ๋ ๊ฒฐ๊ณผ ์งํฉ์ ๊ณตํต ๋ถ๋ถ๋ง์ ์ฐพ์ ๋ ์ฌ์ฉ.
-
MINUS๋ ํ ๊ฒฐ๊ณผ ์งํฉ์์ ๋ค๋ฅธ ๊ฒฐ๊ณผ ์งํฉ์ ์ ์ธํ ๋ ์ฌ์ฉ.
-- UNION์ ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ฉฐ ์ค๋ณต ์ ๊ฑฐ
SELECT * FROM TB1
UNION
SELECT * FROM TB2
-- UNION ALL์ ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ฉฐ ์ค๋ณต ํฌํจ
SELECT * FROM TB1
UNION ALL
SELECT * FROM TB2
-- INTERSECT๋ ๊ฐ ๊ฒฐ๊ณผ์์ ๊ณตํต์ ์ผ๋ก ์กด์ฌํ๋ ๋ ์ฝ๋ ๋ฐํ
SELECT * FROM TB1
INTERSECT
SELECT * FROM TB2
-- MINUS๋ 1๋ฒ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์งํฉ์์ 2๋ฒ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์งํฉ์ ์ ์ธํ ๋ ์ฝ๋ ๋ฐํ
SELECT * FROM TB1
MINUS
SELECT * FROM TB2
- ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ๊ฐ๋ค์ ๋ฌถ๋ ๋ฐฉ์์ GROUP BY๋ ๊ฐ๋ฅ.
- ์ผ๋ถ ์ํฉ์์ GROUP BY๊ฐ DISTINCT์ ๋นํด ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๊ฐ ์ ์ ๊ฒฝ์ฐ์๋ GROUP BY๋ฅผ ์ฐ๋ DISTINCT๋ฅผ ์ฐ๋ ํฐ ์ฐจ์ด๊ฐ ์๋ค.
SELECT DISTINCT JOB
FROM EMP
---
SELECT *
FROM EMP
GROUP BY JOB
- ๋ฌถ์ ๊ธฐ์ค์ด ๋๋ ์ปฌ๋ผ์ GROUP BY ์ปฌ๋ผ์ ์ฌ์ฉํด์ ๋ฌถ๋๋ค.
- ๋ฌถ์ ํ์๋ ๋ฌถ์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก๋ง ์กฐํ ๊ฐ๋ฅ, ๋ฐ๋ผ์ ๋๋ถ๋ถ ๋ฌถ์ ํ โ ํฉ๊ณ or ํ๊ท ์ ๊ตฌํ๋ ์์ผ๋ก ์ฌ์ฉ
SELECT AVG(SAL), JOB
FROM EMP
GROUP BY JOB
ORDER BY AVG(SAL) DESC
- GROUP BY๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๋ฌถ์ ๋ค์๋ ๋ฌถ์ ๋ด์ฉ์ WHERE ์ฌ์ฉ ๋ถ๊ฐ โ HAVING ์ฌ์ฉ
- GROUP BY ํ๋จ์ HAVING ์กฐ๊ฑด ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ค.
SELECT AVG(SAL), JOB
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) > 2500
ORDER BY AVG(SAL) DESC
- ํน์ ๋ฌธ์๋ฅผ ํฌํจํ๊ณ ์์ ๊ฒฝ์ฐ์๋ง ์กฐํ
SELECT *
FROM TB1
WHERE NAME LIKE 'ํ%' -- 'ํ'์ผ๋ก ์์ํ๋ ๊ฒฝ์ฐ์๋ง
SELECT *
FROM TB1
WHERE NAME LIKE '%์ ์' -- '์ ์'์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ์๋ง
SELECT *
FROM TB1
WHERE NAME LIKE '%์ ์%' -- '์ ์'์ด ๋ค์ด์์ ๊ฒฝ์ฐ
-
์ค๋ผํด์์ SELECT ์ WHERE ์ ์์ REGEXP_LIKE๋ฅผ ์ฌ์ฉํ๋ฉด LIKE IN ์ฒ๋ผ ๋ค์ค LIKE๋ก ์ฌ์ฉ ๊ฐ๋ฅ
-
REGEXP_LIKE (์ปฌ๋ผ๋ช , '๊ฐ|๊ฐ')
-
RegExp - ์ ๊ทํํ์ (Regular Expression)
SELECT *
FROM EMP
WHERE REGEXP_LIKE(ENAME, 'JA|AL|ING')
-
ORACLE์์ WHERE์ IF, ELSE IF, ELSE๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์๋ MYBATIS์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ต์ ์ด์ง๋ง ์ํฉ์ด ์ฌ์์น ์์ ๊ฒฝ์ฐ์๋ WHERE ์ ์ IF ์ฒ๋ผ ๋ฃ์ด ์ค ์ ์๋ค.
-
WHERE ((์กฐ๊ฑด1) OR (์กฐ๊ฑด2))
- IF ์กฐ๊ฑด์ ์ฌ์ฉํ ๊ฑฐ๋ฉด ELSE๋ฅผ ๊ผญ ๋ง๋ค๊ฑฐ๋ IF์ ํด๋นํ์ง ์์ ๊ฒฝ์ฐ ์กฐ๊ฑด์ ์ํํ์ง ์๋๋ก ๊ตฌํํ์.
SELECT *
FROM EMP
WHERE (
(JOB = 'CLERK' AND SAL < 1000) OR -- IF
(JOB = 'PRESIDENT' AND SAL > 3000) OR -- ELSE IF
(1=1 AND SAL > 2900) -- ELSE
)
SELECT *
FROM TB1
WHERE NOT(AGE = 40 AND NAME = 'ํ์ ์')
- ๋จผ์ ANY์ SOME์ ๋์ผํ ๊ธฐ๋ฅ์ธ๋ฐ ANY(๊ฐ, ๊ฐ, ๊ฐ) ์ค์์ ์กฐ๊ฑด์ด ํ๋๋ผ๋ ๋ง์ผ๋ฉด ์กฐํํ๋ค.
- SAL > ANY(1000, 1500)์ผ๋ก ๊ฑธ๋ฉด SAL์ด 1000 OR 1500๋ณด๋ค ํฌ๋ฉด ์กฐํํ๊ฒ ๋๋ค.
-- ANY, SOME
SELECT *
FROM TB1
WHERE SAL > ANY(1000, 1500)
ORDER BY SAL
- ALL์ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์ ๊ฒฝ์ฐ์๋ง ์กฐํํ๊ฒ ๋๋ค.
- SAL > ALL(1000, 1500)์ ๊ฒฝ์ฐ์๋ SAL์ด 1000, 1500๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ง ์กฐํ๋๊ฒ ๋๋ค.