SQL νμ©
β’
β’
β’
μλΈμΏΌλ¦¬ (Sub Query)
SQLλ¬Έ λ΄λΆμ μ¬μ©νλ SELECT λ¬Έ
μλΈμΏΌλ¦¬ λΆλ₯
β’
μ€ν κ²°κ³Όμ λ°λ₯Έ λΆλ₯
β¦
λ¨μΌν μλΈμΏΌλ¦¬
β¦
λ€μ€ν μλΈμΏΌλ¦¬
βͺ
β’
μ¬μ© μμΉμ λ°λ₯Έ λΆλ₯
β¦
μ€μΉΌλΌ μλΈμΏΌλ¦¬
β¦
μΈλΌμΈ λ·°
β¦
μλΈ μΏΌλ¦¬
μ€ν κ²°κ³Όμ λ°λ₯Έ λΆλ₯
β’
λ¨μΌν μλΈμΏΌλ¦¬ : κ²°κ³Ό λ°μ΄ν°κ° νλμΈ μλΈμΏΌλ¦¬
β’
λ€μ€ν μλΈμΏΌλ¦¬ : κ²°κ³Ό λ°μ΄ν°κ° μ¬λ¬ νμΈ μλΈμΏΌλ¦¬
μ°μ° | μ€λͺ
|
IN | ν΄λΉ 컬λΌκ³Ό μ¬λ¬ κ°μ κ°μ΄ μΌμΉνλ λ°μ΄ν°λ₯Ό ꡬνλ μ°μ° |
ANY | A λΉκ΅μ°μ° ANY B: λΉκ΅ν κ²°κ³Ό μ€, νλ λ§μ΄λΌλ 쑰건μ λ§μ‘±νλ Aλ₯Ό ꡬνλ μ°μ° |
ALL | A λΉκ΅μ°μ° ALL B: λΉκ΅ν κ²°κ³Ό μ€, λͺ¨λ λ°μ΄ν°μ λν΄ μ‘°κ±΄μ λ§μ‘±νλ Aλ₯Ό ꡬνλ μ°μ° |
EXISTS | μλΈμΏΌλ¦¬μ μ‘΄μ¬νλ λ°μ΄ν°λ§ μ‘°ννλ μ°μ° |
μ¬μ© μμΉμ λ°λ₯Έ λΆλ₯
β’
μ€μΉΌλΌ μλΈμΏΌλ¦¬ : SELECT μ μμ μ¬μ©νλ μλΈμΏΌλ¦¬
β’
μΈλΌμΈ λ·° : FROM μ μμ μ¬μ©νλ μλΈμΏΌλ¦¬
β’
μλΈ μΏΌλ¦¬ : WHERE μ μμ μ¬μ©νλ μλΈμΏΌλ¦¬
μλΈμΏΌλ¦¬ μμμ½λ
β’
λ¨μΌν μλΈμΏΌλ¦¬
β’
λ€μ€ν μλΈμΏΌλ¦¬
β¦
IN
β¦
ANY
β¦
ALL
β¦
EXISTS
β’
μ€μΉΌλΌ μλΈμΏΌλ¦¬
β’
μΈλΌμΈ λ·°
β’
μλΈμΏΌλ¦¬
λ¨μΌν μλΈμΏΌλ¦¬
μ§μ ν
μ΄λΈμμ κ°μ₯ λμ κΈμ¬λ₯Ό λ°λ μ§μμ μ΄λ¦κ³Ό ν΄λΉ λΆμ IDλ₯Ό μ‘°ννκ³ , κ·Έ λΆμμ μ΄λ¦μ ν¨κ» μΆλ ₯νμμμ€.
SELECT e.first_name,
e.department_id,
(SELECT department_name
FROM departments d
WHERE d.department_id = e.department_id) AS department_name
FROM employees e
WHERE e.salary = (SELECT MAX(salary) FROM employees);
SQL
볡μ¬
μ΄ μμμμλ λ¨Όμ κ°μ₯ λμ κΈμ¬λ₯Ό λ°λ μ§μμ κΈμ¬λ₯Ό μλΈμΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ μ‘°νν©λλ€. κ·Έλ¦¬κ³ κ·Έ κΈμ¬μ μΌμΉνλ μ§μμ μ΄λ¦κ³Ό λΆμ IDλ₯Ό λ©μΈ 쿼리μμ μ ννκ³ , λΆμ ν
μ΄λΈμ μλΈμΏΌλ¦¬λ‘ μ¬μ©νμ¬ ν΄λΉ λΆμμ μ΄λ¦μ μ°Ύμ μΆλ ₯ν©λλ€.
λ€μ€ν μλΈμΏΌλ¦¬
IN
3000λ³΄λ€ λμ κΈμ¬λ₯Ό λ°λ μ§μμ΄ μν λΆμμ λΆμ IDμ λΆμ μ΄λ¦μ μ‘°ννλ, λΆμ μ΄λ¦μ κΈ°μ€μΌλ‘ μ λ ¬νμμμ€.
SELECT department_id, department_name
FROM departments d
WHERE d.department_id IN (SELECT e.department_id
FROM employees e
WHERE e.salary > 3000)
ORDER BY d.department_name;
SQL
볡μ¬
1.
departments ν
μ΄λΈμμ department_idμ department_name μ΄μ μ νν©λλ€.
2.
μλΈμΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ μ§μ ν
μ΄λΈ(employees)μμ κΈμ¬κ° 3000λ³΄λ€ λμ μ§μμ λΆμ IDλ₯Ό μ νν©λλ€.
3.
λ©μΈ 쿼리μμλ λΆμ ν
μ΄λΈμμ μ νλ λΆμ IDλ₯Ό κ°μ§ λΆμλ§μ νν°λ§ν©λλ€.
4.
λ§μ§λ§μΌλ‘ λΆμ μ΄λ¦μ κΈ°μ€μΌλ‘ κ²°κ³Όλ₯Ό μ λ ¬ν©λλ€.
ANY
EMPLOYEE ν
μ΄λΈμ DEPT_CODE κ° 'D9' μΈ λΆμμ μ΅μ κΈμ¬ λ³΄λ€ λ ν° κΈμ¬λ₯Ό λ°λ μ¬μμ μ‘°ννμμ€.
SELECT e.emp_id μ¬μλ²νΈ
,e.emp_name μ§μλͺ
,d.dept_id λΆμλ²νΈ
,d.dept_title λΆμλͺ
,TO_CHAR(e.salary, '999,999,999') κΈμ¬
FROM employee e
,department d
WHERE e.dept_code = d.dept_id
AND e.salary > ANY (
SELECT salary
FROM employee
WHERE dept_code = 'D9'
)
SQL
볡μ¬
1.
employee ν
μ΄λΈ(e)κ³Ό department ν
μ΄λΈ(d)μ μ‘°μΈν©λλ€. μ΄λ₯Ό ν΅ν΄ μ§μμ λΆμ μ 보λ₯Ό κ°μ Έμ΅λλ€.
2.
μ§μμ μ¬μλ²νΈ(emp_id), μ§μλͺ
(emp_name), λΆμλ²νΈ(dept_id), λΆμλͺ
(dept_title), κ·Έλ¦¬κ³ κΈμ¬(salary)λ₯Ό μ νν©λλ€.
3.
WHERE μ μμλ λ€μμ μνν©λλ€:
β’
e ν
μ΄λΈκ³Ό d ν
μ΄λΈμ dept_codeμ dept_idκ° μΌμΉνλ νλ§ μ νν©λλ€.
β’
e ν
μ΄λΈμ κΈμ¬κ° 'D9' λΆμμ μ΄λ€ μ§μμ κΈμ¬λ³΄λ€ λμ κ²½μ°λ₯Ό μ νν©λλ€.
4.
TO_CHAR ν¨μλ₯Ό μ¬μ©νμ¬ κΈμ¬λ₯Ό νΉμ νμμΌλ‘ λ³νν©λλ€. μ΄ κ²½μ°, '999,999,999' νμμ μ¬μ©νμ¬ κΈμ‘μ 3μ리λ§λ€ μΌνλ‘ κ΅¬λΆλ νμμΌλ‘ νμν©λλ€.
μ΄ μΏΌλ¦¬μ κ²°κ³Όλ 'D9' λΆμμ μ΄λ€ μ§μμ κΈμ¬λ³΄λ€ λμ κΈμ¬λ₯Ό λ°λ λͺ¨λ μ§μμ μ 보λ₯Ό ν¬ν¨ν©λλ€.
ALL
EMPLOYEE ν
μ΄λΈμ DEPT_CODE κ° 'D1' μΈ λΆμμ μ΅λκΈμ¬ λ³΄λ€ λ ν° κΈμ¬λ₯Ό λ°λ μ¬μμ μ‘°ννμμ€.
SELECT e.emp_id μ¬μλ²νΈ
,e.emp_name μ§μλͺ
,d.dept_id λΆμλ²νΈ
,d.dept_title λΆμλͺ
,TO_CHAR(e.salary, '999,999,999') κΈμ¬
FROM employee e, department d
WHERE e.dept_code = d.dept_id
AND e.salary > ALL (
SELECT salary
FROM employee
WHERE dept_code = 'D1'
)
;
SQL
볡μ¬
1.
employee ν
μ΄λΈ(e)κ³Ό department ν
μ΄λΈ(d)μ μ‘°μΈν©λλ€. μ΄λ₯Ό ν΅ν΄ μ§μμ λΆμ μ 보λ₯Ό κ°μ Έμ΅λλ€.
2.
μ§μμ μ¬μλ²νΈ(emp_id), μ§μλͺ
(emp_name), λΆμλ²νΈ(dept_id), λΆμλͺ
(dept_title), κ·Έλ¦¬κ³ κΈμ¬(salary)λ₯Ό μ νν©λλ€.
3.
WHERE μ μμλ λ€μμ μνν©λλ€:
β’
e ν
μ΄λΈκ³Ό d ν
μ΄λΈμ dept_codeμ dept_idκ° μΌμΉνλ νλ§ μ νν©λλ€.
β’
e ν
μ΄λΈμ κΈμ¬κ° 'D1' λΆμμ λͺ¨λ μ§μμ κΈμ¬λ³΄λ€ λμ κ²½μ°λ₯Ό μ νν©λλ€.
4.
TO_CHAR ν¨μλ₯Ό μ¬μ©νμ¬ κΈμ¬λ₯Ό νΉμ νμμΌλ‘ λ³νν©λλ€. μ΄ κ²½μ°, '999,999,999' νμμ μ¬μ©νμ¬ κΈμ‘μ 3μ리λ§λ€ μΌνλ‘ κ΅¬λΆλ νμμΌλ‘ νμν©λλ€.
μ΄ μΏΌλ¦¬μ κ²°κ³Όλ 'D1' λΆμμ λͺ¨λ μ§μμ κΈμ¬λ³΄λ€ λμ κΈμ¬λ₯Ό λ°λ λͺ¨λ μ§μμ μ 보λ₯Ό ν¬ν¨ν©λλ€.
EXISTS
κΈμ¬κ° 3000λ³΄λ€ λμ μ§μμ΄ μν λΆμμ λΆμ IDμ λΆμ μ΄λ¦μ μ‘°ννμμμ€. λ¨, λΆμ μ΄λ¦μ κΈ°μ€μΌλ‘ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νμμμ€. EXISTSλ₯Ό μ¬μ©νμ¬ λΆμ ν
μ΄λΈκ³Ό μ§μ ν
μ΄λΈμ κ΄κ³λ₯Ό κ³ λ €νμμμ€.
SELECT department_id, department_name
FROM departments d
WHERE EXISTS(SELECT *
FROM employees e
WHERE e.department_id = d.department_id
AND e.salary > 3000 )
ORDER BY d.department_name;
SQL
볡μ¬
1.
λΆμ ν
μ΄λΈ(departments)μ κΈ°μ€μΌλ‘ μμν©λλ€.
2.
EXISTS μλΈμΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ κ° λΆμμ λν΄ λ€μμ νμΈν©λλ€:
β’
μ§μ ν
μ΄λΈ(employees)μμ ν΄λΉ λΆμμ μ§μμ΄ κΈμ¬κ° 3000λ³΄λ€ λμμ§ μ¬λΆλ₯Ό νμΈν©λλ€.
3.
λ§μ½ μλΈμΏΌλ¦¬μ κ²°κ³Όκ° μ°Έ(μ¦, μ μ΄λ ν λͺ
μ μ§μμ΄ κΈμ¬κ° 3000λ³΄λ€ λμ κ²½μ°)μ΄λ©΄, ν΄λΉ λΆμλ₯Ό κ²°κ³Όμ ν¬ν¨ν©λλ€.
4.
WHERE μ μ 쑰건μ λ§μ‘±νλ λͺ¨λ λΆμμ λΆμ IDμ λΆμ μ΄λ¦μ μ νν©λλ€.
5.
λ§μ§λ§μΌλ‘ λΆμ μ΄λ¦μ κΈ°μ€μΌλ‘ μ€λ¦μ°¨μμΌλ‘ κ²°κ³Όλ₯Ό μ λ ¬ν©λλ€.
μ΄ μΏΌλ¦¬λ κ° λΆμμ λν΄ κΈμ¬κ° 3000λ³΄λ€ λμ μ§μμ΄ μ μ΄λ ν λͺ
μ΄μ μλ κ²½μ° ν΄λΉ λΆμμ λΆμ IDμ λΆμ μ΄λ¦μ λ°νν©λλ€.
μ€μΉΌλΌ μλΈμΏΌλ¦¬
μ§μ ν
μ΄λΈμμ κ°μ₯ λμ κΈμ¬λ₯Ό μ‘°ν
SELECT employee_name,
salary,
(SELECT MAX(salary) FROM employees) AS max_salary
FROM employees;
SQL
볡μ¬
μ΄ μμμμλ μ€μΉΌλΌ μλΈμΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ μ§μ ν
μ΄λΈμμ κ°μ₯ λμ κΈμ¬λ₯Ό μ‘°νν©λλ€. μ΄ κ°μ κ° μ§μμ νμ ν¬ν¨μμΌ μΆλ ₯ν©λλ€.
μΈλΌμΈ λ·°
μΈλΌμΈ λ·°λ₯Ό μ¬μ©νμ¬ κΈμ¬κ° 3000 μ΄μμΈ μ¬μμ μ 보λ₯Ό μ‘°ννλ, λΆμ ν
μ΄λΈκ³Ό μ‘°μΈνμ¬ λΆμμ λΆμλͺ
μ ν¨κ» μΆλ ₯νμμ€.
SELECT e.employee_id,
e.employee_name,
d.department_name
FROM (
SELECT * FROM employees
WHERE salary > 3000
) e
JOIN departments d ON e.department_id = d.department_id;
SQL
볡μ¬
1.
λ΄λΆμμλ κΈμ¬κ° 3000 μ΄μμΈ λͺ¨λ μ¬μμ μ ννλ μλΈμΏΌλ¦¬κ° μ€νλ©λλ€.
2.
μ΄ μλΈμΏΌλ¦¬μ κ²°κ³Όλ eλΌλ λ³μΉμΌλ‘ μ¬μ©λ©λλ€.
3.
λ©μΈ 쿼리μμλ μ νλ μ¬μλ€(e)κ³Ό λΆμ ν
μ΄λΈ(departments)μ μ‘°μΈν©λλ€.
4.
μ΄λ, μ¬μ ν
μ΄λΈ(e)μ λΆμ IDμ λΆμ ν
μ΄λΈ(d)μ λΆμ IDλ₯Ό κΈ°μ€μΌλ‘ μ‘°μΈν©λλ€.
5.
μ‘°μΈ κ²°κ³Όλ‘λ μ¬μμ μ¬μ λ²νΈ(employee_id), μ¬μλͺ
(employee_name), κ·Έλ¦¬κ³ ν΄λΉ λΆμμ λΆμλͺ
(department_name)μ΄ μ νλ©λλ€.
μλΈμΏΌλ¦¬
μλΈμΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ κ° λΆμλ³λ‘ κ°μ₯ λμ κΈμ¬λ₯Ό κ°μ§ μ¬μλ€μ λΆμ IDμ μ΅λ κΈμ¬λ₯Ό μ‘°ννμμ€.
SELECT e.employee_id,
e.employee_name,
e.salary,
e.department_id
FROM employees e
WHERE (e.department_id, e.salary) IN (
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
);
SQL
볡μ¬
1.
λ©μΈ 쿼리μμλ μ§μ ν
μ΄λΈ(employees)μ κΈ°μ€μΌλ‘ μμν©λλ€.
2.
WHERE μ μμλ λ€μμ μνν©λλ€:
β’
μλΈμΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ κ° λΆμλ³λ‘ κ°μ₯ λμ κΈμ¬λ₯Ό μ‘°νν©λλ€. μ΄λ₯Ό μν΄ μ§μ ν
μ΄λΈμ λΆμλ³λ‘ κ·Έλ£Ήννκ³ κ° κ·Έλ£Ήμμ μ΅λ κΈμ¬λ₯Ό μ°Ύμ΅λλ€.
β’
λ©μΈ 쿼리μμλ λΆμλ³λ‘ κ°μ₯ λμ κΈμ¬λ₯Ό λ°λ μ§μλ€μ λΆμ IDμ κΈμ¬λ₯Ό μ νν©λλ€.
β’
μ΄λ₯Ό μν΄ λ©μΈ 쿼리μ μ§μ ν
μ΄λΈμμ (λΆμ ID, κΈμ¬) μμ΄ μλΈμΏΌλ¦¬μ κ²°κ³Όμ μΌμΉνλ νμ μ νν©λλ€.
3.
μ νλ νμλ μ¬μ λ²νΈ(employee_id), μ¬μλͺ
(employee_name), κΈμ¬(salary), κ·Έλ¦¬κ³ λΆμ ID(department_id)κ° ν¬ν¨λ©λλ€.
μ΄ μΏΌλ¦¬μ κ²°κ³Όλ‘λ κ° λΆμλ³λ‘ κ°μ₯ λμ κΈμ¬λ₯Ό λ°λ μ§μλ€μ μ 보λ§μ΄ μ νλ©λλ€.
μ‘°μΈ (JOIN)
μ¬λ¬ ν
μ΄λΈμ μ‘°ν©νμ¬ μ‘°ννλ λ°©μ
μ‘°μΈ μ’ λ₯
β’
λ΄λΆμ‘°μΈ
β¦
λλ± μ‘°μΈ
β¦
μΈλ―Έ μ‘°μΈ
β¦
μν° μ‘°μΈ
β¦
μ
ν μ‘°μΈ
β’
μΈλΆμ‘°μΈ
β¦
(+)
β¦
ANSI μ‘°μΈ
βͺ
LEFT OUTER JOIN
βͺ
RIGTH OUTER JOIN
βͺ
FULL OUTER JOIN
βͺ
CROSS JOIN (μΉ΄νμμ μ‘°μΈ)
λ΄λΆ μ‘°μΈ (INNER JOIN)
β’
λλ± μ‘°μΈ
β’
μΈλ―Έ μ‘°μΈ
β’
μν° μ‘°μΈ
β’
μ
ν μ‘°μΈ
λλ± μ‘°μΈ (EQUI JOIN)
λ±νΈ(=) μ°μ°μλ₯Ό μ¬μ©νμ¬, 2κ° μ΄μμ ν
μ΄λΈμ μ°κ²°μ§μ΄ μΆλ ₯νλ λ°©μ
ex)
SELECT *
FROM A, B
WHERE A.x = B.y;
SQL
볡μ¬
INNER JOIN
μΌμͺ½ ν
μ΄λΈκ³Ό μ€λ₯Έμͺ½ ν
μ΄λΈμ μ‘°μΈ μ‘°κ±΄μ λ§μ‘±νλ κ΅μ§ν©μ΄ λλ λ°μ΄ν°λ₯Ό μ‘°ννλ λ°©μ
ex)
SELECT *
FROM A INNER JOIN B
ON (A.x = B.y);
SQL
볡μ¬
μΈλ―Έ μ‘°μΈ (SEMI JOIN)
μλΈ μΏΌλ¦¬μ μ‘΄μ¬νλ λ°μ΄ν°λ§ λ©μΈ 쿼리μμ μΆμΆνμ¬ μΆλ ₯νλ λ°©μ
μν° μ‘°μΈ (ANTI JOIN)
μλΈ μΏΌλ¦¬μ μ‘΄μ¬νλ λ°μ΄ν°λ§ μ μΈνκ³ λ©μΈ 쿼리μμ μΆμΆνμ¬ μΆλ ₯νλ λ°©μ
μ ν μ‘°μΈ (SELF JOIN)
λμΌν νλμ ν
μ΄λΈμ 2λ²μ΄μ μ‘°ν©νμ¬ μΆλ ₯νλ λ°©μ
μΈλΆ μ‘°μΈ (OUTER JOIN)
β’
LEFT OUTER JOIN
β’
RIGTH OUTER JOIN
β’
FULL OUTER JOIN
β’
CROSS JOIN (μΉ΄νμμ μ‘°μΈ)
LEFT OUTER JOIN
μΌμͺ½ ν
μ΄λΈμ λ¨Όμ μ½μ΄λλ¦° ν,
μ‘°μΈ μ‘°κ±΄μ μΌμΉνλ μ€λ₯Έμͺ½ ν
μ΄λΈμ ν¨κ» μ‘°ννλ κ²
1.
ANSI
ν
μ΄λΈ1 A LEFT [OUTER] JOIN ν
μ΄λΈ2 B ON μ‘°μΈμ‘°κ±΄;
SQL
볡μ¬
2.
(+)
WHERE A.곡ν΅μ»¬λΌ = B.곡ν΅μ»¬λΌ(+)
SQL
볡μ¬
RIGHT OUTER JOIN
μ€λ₯Έμͺ½ ν
μ΄λΈμ λ¨Όμ μ½μ΄λλ¦° ν,
μ‘°μΈ μ‘°κ±΄μ μΌμΉνλ μΌμͺ½ ν
μ΄λΈμ ν¨κ» μ‘°ννλ κ²
1.
ANSI
ν
μ΄λΈ1 A RIGHT [OUTER] JOIN ν
μ΄λΈ2 B ON μ‘°μΈμ‘°κ±΄;
SQL
볡μ¬
2.
(+)
WHERE A.곡ν΅μ»¬λΌ(+) = B.곡ν΅μ»¬λΌ
SQL
볡μ¬
FULL OUTER JOIN
μ‘°μΈ μ‘°κ±΄μ μΌμΉνλ μμͺ½ ν
μ΄λΈμ λ°μ΄ν°λ₯Ό μ‘°ν©νμ¬ μ‘°ννλ κ²
ν
μ΄λΈ1 A FULL [OUTER] JOIN ν
μ΄λΈ2 B ON μ‘°μΈμ‘°κ±΄;
SQL
볡μ¬
μΉ΄νμμ μ‘°μΈ (Cartesian; CATASIAN PRODUCT) : CROSS μ‘°μΈ
WHERE μ μ μ‘°μΈ μ‘°κ±΄μ΄ μλ μ‘°μΈ
β’
A ν
μ΄λΈμ λ°μ΄ν° 건μ : X
β’
B ν
μ΄λΈμ λ°μ΄ν° 건μ : Y
β’
κ²°κ³Ό 건μ : X * Y (λ ν
μ΄λΈμ κ³±)
ex) SELECT *
FROM employees e
,departments d;
SQL
볡μ¬
β’
μΉ΄νμμ μ‘°μΈμ ANSI λ¬Έλ²μμλ CROSS μ‘°μΈμ΄λΌκ³ νλ€
ex) SELECT *
FROM employees e
CROSS JOIN departments d;
SQL
볡μ¬
μ§ν© μ°μ°μ
λ μ΄μμ μ§ν©μ κ²°ν©νκ±°λ λΉκ΅νλ λ° μ¬μ©λλ μ°μ°μ
μ§ν© μ°μ°μ | μ€λͺ
|
UNION | Aμ Bμ κ²°κ³Όλ₯Ό ν©μ§ν©μΌλ‘ λ¬Άμ΄μ€λλ€. μ€λ³΅ λ°μ΄ν°λ μ κ±°λ©λλ€. |
UNION ALL | Aμ Bμ κ²°κ³Όλ₯Ό ν©μ§ν©μΌλ‘ λ¬Άμ΄μ€λλ€. μ€λ³΅ λ°μ΄ν°κ° ν¬ν¨λ©λλ€. |
MINUS | Aμ Bμ κ²°κ³Όλ₯Ό μ°¨μ§ν©μΌλ‘ μΆλ ₯ν©λλ€. Aμλ μμ§λ§ Bμλ μλ λ°μ΄ν°λ§ μΆλ ₯λ©λλ€. |
INTERSECT | Aμ Bμ κ²°κ³Όλ₯Ό κ΅μ§ν©μΌλ‘ μΆλ ₯ν©λλ€. Aμ Bμ λͺ¨λ μ‘΄μ¬νλ λ°μ΄ν°λ§ μΆλ ₯λ©λλ€. |
UNION
A UNION B, Aμ Bμ κ²°κ³Όλ₯Ό ν©μ§ν©μ λ¬Άλλ€. μ€λ³΅ λ°μ΄ν°λ μ κ±°
SELECT employee_id, first_name, department_id
FROM employees
WHERE department_id = 10
UNION
SELECT employee_id, first_name, department_id
FROM employees
WHERE department_id = 10
;
SQL
볡μ¬
UNION ALL
A UNION ALL B, Aμ Bμ κ²°κ³Όλ₯Ό ν©μ§ν©μ λ¬Άλλ€. μ€λ³΅ λ°μ΄ν° ν¬ν¨
SELECT employee_id, first_name, department_id
FROM employees
WHERE department_id = 10
UNION ALL
SELECT employee_id, first_name, department_id
FROM employees
WHERE department_id = 10
;
SQL
볡μ¬
MINUS
A MINUS B, Aμ Bμ κ²°κ³Όλ₯Ό μ°¨μ§ν©μΌλ‘ μΆλ ₯
μ¬μμ΄ μλ λΆμλ₯Ό μ‘°ννμμ€.
SELECT department_id from departments
MINUS
SELECT department_id from employees
;
SQL
볡μ¬
INTERSECT
A INTERSECT B, Aμ Bμ κ²°κ³Όλ₯Ό κ΅μ§ν©μΌλ‘ μΆλ ₯
μ¬μμ΄ μλ λΆμλ₯Ό μ‘°ννμμ€.
SELECT department_id from departments
INTERSECT
SELECT department_id from employees
;
SQL
볡μ¬
κ·Έλ£Ή ν¨μ
μ¬λ¬ νμ κ·Έλ£Ήννκ³ κ° κ·Έλ£Ήμ λν΄ κ³μ°μ μννλ ν¨μ
κ·Έλ£Ή ν¨μ μ’ λ₯
β’
κ·Έλ£Ή ν¨μ
β’
κ·Έλ£Ή κ΄λ ¨ ν¨μ
κ·Έλ£Ή ν¨μ
ν¨μ | μ€λͺ
|
SUM(μΈμ) | μ«μν 컬λΌμΈ μΈμ ν©κ³λ₯Ό ꡬνλ ν¨μ |
AVG(μΈμ) | μ«μν 컬λΌμΈ μΈμ νκ· μ ꡬνλ ν¨μ |
COUNT(μΈμ) | μ‘°ν κ²°κ³ΌμΈ νμ κ°μλ₯Ό λ°ννλ ν¨μ
- COUNT(*) : NULL ν¬ν¨νμ¬ κ°μ ꡬν¨
- COUNT(컬λΌ) : NULL μ μΈνκ³ κ°μ κ΅¬ν¨ |
MAX(μΈμ) | μ«μν/λ μ§ν μΈμμ μ΅λκ°μ ꡬνλ ν¨μ |
- MAX(λ μ§): κ°μ₯ μ΅κ·Όμ λ μ§ | |
- MAX(μ«μ): κ°μ₯ ν° μ«μ | |
MIN(μΈμ) | μ«μν/λ μ§ν μΈμμ μ΅μκ°μ ꡬνλ ν¨μ |
- MIN(λ μ§): κ°μ₯ κ³Όκ±°μ λ μ§ | |
- MIN(μ«μ): κ°μ₯ μμ μ«μ | |
STDDEV(μΈμ) | μ«μν μΈμμ νμ€νΈμ°¨λ₯Ό ꡬνλ ν¨μ |
VARIANCE(μΈμ) | μ«μν μΈμμ λΆμ°λ₯Ό ꡬνλ ν¨μ |
κ·Έλ£Ή κ΄λ ¨ ν¨μ
ν¨μ | μ€λͺ
|
ROLLUP(μΈμ1, μΈμ2, ...) | κ·Έλ£Ή κΈ°μ€μΌλ‘ μ§κ³ν μ 보λ₯Ό λ 벨λ³λ‘ μΆλ ₯νλ ν¨μ |
CUBE(μΈμ1, μΈμ2, ...) | κ·Έλ£Ή κΈ°μ€μΌλ‘ μ§κ³ν μ 보λ₯Ό κ°λ₯ν λͺ¨λ μ‘°ν©λ³λ‘ μΆλ ₯νλ ν¨μ |
GROUPING SETS(μΈμ1, ...) | 그룹컬λΌμ΄ μ¬λ¬ κ° μΌ λ, μ§κ³ν μ 보λ₯Ό 컬λΌλ³λ‘ μΆλ ₯νλ ν¨μ |
GROUPING() | κ·Έλ£Ήνν 컬λΌλ€μ λν΄ κ·Έλ£Ήνλ μ¬λΆλ₯Ό μΆλ ₯νλ ν¨μ |
LISTAGG(λμ΄ν 컬λΌ, [ꡬλΆμ]) | κ·Έλ£Ήνλ λ°μ΄ν°λ₯Ό νλμ μ΄μ λͺ©λ‘μΌλ‘ λμ΄νμ¬ μΆλ ₯νλ ν¨μ |
WITHIN GROUP (ORDER BY μ λ ¬κΈ°μ€ μ»¬λΌ)λ₯Ό μ¬μ©νμ¬ μ λ ¬ μμλ₯Ό μ§μ ν μ μμ΅λλ€. | |
PIVOT() | κ·Έλ£Ήνν ν λ°μ΄ν°λ₯Ό μ΄λ‘ λ°κΎΈμ΄μ μΆλ ₯νλ ν¨μ |
UNPIVOT() | κ·Έλ£Ήνλ κ²°κ³ΌμΈ μ΄μ ν λ°μ΄ν°λ‘ λ°κΎΈμ΄μ μΆλ ₯νλ ν¨μ |
μλμ° ν¨μ
νκ³Ό ν κ°μ κ΄κ³λ₯Ό μ μνλ ν¨μ
μ’ λ₯
β’
μμ ν¨μ
β’
μ§κ³ ν¨μ
β’
ν μμ ν¨μ
β’
λΉμ¨ ν¨μ
λ¬Έλ² κ΅¬μ‘°
SELECT μλμ°ν¨μ( μΈμ )
OVER (
[PARTITION BY 컬λΌ1, 컬λΌ2, ...]
[ORDER BY 컬λΌ1 [ASC | DESC], 컬λΌ2 [ASC | DESC], ...]
[WINDOWING μ ]
)
FROM ν
μ΄λΈ;
SQL
볡μ¬
β’
κΈ°λ³Έ κ΅¬μ± μμ
κ΅¬μ± μμ | μ€λͺ
|
ν¨μ | μλμ° ν¨μμ μ’
λ₯λ₯Ό λνλ
λλ€. μλ₯Ό λ€μ΄, SUM(), AVG(), ROW_NUMBER() λ±μ΄ μμ΅λλ€. |
OVER | μλμ° ν¨μλ₯Ό μ¬μ©νκΈ° μν ν€μλμ
λλ€. |
PARTITION BY | μ νμ μΌλ‘ μ¬μ©λ©λλ€.
λ°μ΄ν°λ₯Ό νν°μ
μΌλ‘ λλλ λ° μ¬μ©λ©λλ€. |
ORDER BY | μ νμ μΌλ‘ μ¬μ©λ©λλ€. μλμ° ν¨μλ₯Ό μ μ©ν λ μ λ ¬ μμλ₯Ό μ§μ ν©λλ€. κΈ°λ³Έμ μΌλ‘ μ λ ¬ μμλ νμ¬ νμ μ€μ¬μΌλ‘ μ μ©λ©λλ€. |
β’
WINDOWING μ
μ©μ΄ | μ€λͺ
|
ROWS | ROWS ν€μλλ μλμ°μμ ROWSλ₯Ό κΈ°μ€μΌλ‘ λ²μλ₯Ό μ§μ ν©λλ€. μλ₯Ό λ€μ΄, ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGμ νμ¬ νμ μ€μ¬μΌλ‘ μμ 1κ°μ νκ³Ό λ€μ 1κ°μ νμ ν¬ν¨νλ μλμ° λ²μλ₯Ό μ μν©λλ€. |
RANGE | RANGE ν€μλλ μλμ°μμ κ°μ λ²μλ₯Ό κΈ°μ€μΌλ‘ λ²μλ₯Ό μ§μ ν©λλ€. μ£Όλ‘ μ«μλ λ μ§μ κ°μ μμν λ°μ΄ν° μ νμ 컬λΌμ λν΄ μ¬μ©λ©λλ€. |
BETWEEN~AND | BETWEEN~AND ν€μλλ μλμ°μ λ²μλ₯Ό μ§μ ν λ μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄, ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGκ³Ό κ°μ΄ μ¬μ©λ©λλ€. |
UNBOUNDED PRECEDING | UNBOUNDED PRECEDINGμ μλμ°μ μμμ λνλ΄λ©°, νμ¬ νλ³΄λ€ μμ λͺ¨λ νμ ν¬ν¨ν©λλ€. |
UNBOUNDED FOLLOWING | UNBOUNDED FOLLOWINGμ μλμ°μ λμ λνλ΄λ©°, νμ¬ νλ³΄λ€ λ€μ λͺ¨λ νμ ν¬ν¨ν©λλ€. |
CURRENT ROW | CURRENT ROWλ μλμ°μμ νμ¬ νμ λνλ
λλ€. |
PRECEDING | νμ¬ ν μ΄μ μ μμΉν νλ€ κ°λ¦¬ν΅λλ€. |
FOLLOWING | νμ¬ ν μ΄νμ μμΉν νλ€μ κ°λ¦¬ν΅λλ€. |
μμ ν¨μ
κ²°κ³Ό μ§ν© λ΄μμ νμ μμλ₯Ό κ²°μ νλ ν¨μ
ν¨μλͺ
| μ€λͺ
|
RANK | λμΌν κ°μ λν μμλ₯Ό λΆμ¬νκ³ κ°μ μμμ λμΌν κ°μ΄ μλ€λ©΄ λ€μ μμλ 건λλ°κ³ κ·Έ λ€μ μμλ₯Ό λΆμ¬νλ€. |
DENSE_RANK | λμΌν κ°μ λν μμλ₯Ό λΆμ¬νκ³ κ°μ μμμ λμΌν κ°μ΄ μλ€λ©΄ λ€μ μμλ κ·Έ λ€μ μμμ λμΌν κ°μ κ°μ§λ€. |
ROW_NUMBER | μμλλ‘ μ«μλ₯Ό λΆμ¬νμ¬ κ° νμ λν μ μΌν μμλ₯Ό λΆμ¬νλ€. |
μμ ν¨μ μμ μ½λ
β’
RANK
β’
DENSE_RANK
β’
ROW_NUMBER
RANK
β’
κΈμ¬ λ΄λ¦Όμ°¨μμΌλ‘ μμλ₯Ό ꡬνμμ€. (곡λ μμλ©΄ λ€μ μμ μμ°)
SELECT employee_id, salary
, RANK()
OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
SQL
볡μ¬
DENSE_RANK
β’
κΈμ¬ λ΄λ¦Όμ°¨μμΌλ‘ μμλ₯Ό ꡬνμμ€. (곡λ μμκ° μμ΄λ λ€μ μμ μ΄λ¦Ό)
SELECT employee_id
,salary
,DENSE_RANK()
OVER (ORDER BY salary DESC) AS dense_salary_rank
FROM employees;
SQL
볡μ¬
ROW_NUMBER
β’
μ€λ³΅ μμ μκ΄μμ΄, μ μΌν μμ λ²νΈ λ§ κ·Έλλ‘ νλ²νΈλ₯Ό μΆλ ₯
SELECT employee_id
,salary
,ROW_NUMBER()
OVER (ORDER BY salary DESC) AS row_num
FROM employees;
SQL
볡μ¬
μ§κ³ ν¨μ
μ¬λ¬ νμ κ°μ κ·Έλ£Ήννκ³ μ§κ³νμ¬ λ¨μΌ κ²°κ³Ό κ°μ λ°ννλ ν¨μ
ν¨μλͺ
| μ€λͺ
|
SUM | μ«μν λ°μ΄ν°μ ν©μ κ³μ°ν©λλ€. |
AVG | μ«μν λ°μ΄ν°μ νκ· μ κ³μ°ν©λλ€. |
COUNT | κ²°κ³Ό μ§ν©μ΄λ κ·Έλ£Ήμ ν μλ₯Ό κ³μ°ν©λλ€. |
MAX | μ«μλ λ μ§ λ°μ΄ν°μ μ΅λκ°μ μ°Ύμ΅λλ€. |
MIN | μ«μλ λ μ§ λ°μ΄ν°μ μ΅μκ°μ μ°Ύμ΅λλ€. |
μ§κ³ ν¨μ μμ μ½λ
β’
SUM
β’
AVG
β’
COUNT
β’
MAX
β’
MIN
SUM
SELECT SUM(salary) AS total_salary
FROM employees;
SQL
볡μ¬
AVG
SELECT AVG(salary) AS average_salary
FROM employees;
SQL
볡μ¬
COUNT
SELECT COUNT(*) AS total_employees
FROM employees;
SQL
볡μ¬
MAX
SELECT MAX(salary) AS max_salary
FROM employees;
SQL
볡μ¬
MIN
SELECT MIN(salary) AS min_salary
FROM employees;
SQL
볡μ¬
ν μμ ν¨μ
κ²°κ³Ό μ§ν© λ΄μμ νΉμ νμ μμΉλ μμλ₯Ό κ²°μ νλ ν¨μ
ν¨μλͺ
| μ€λͺ
|
FIRST_VALUE | κ·Έλ£Ή λ΄μμ 첫 λ²μ§Έ νμ κ°μ λ°νν©λλ€. |
LAST_VALUE | κ·Έλ£Ή λ΄μμ λ§μ§λ§ νμ κ°μ λ°νν©λλ€. |
LAG | νμ¬ ν μ΄μ μ κ°μ κ°μ Έμ΅λλ€. |
LEAD | νμ¬ ν λ€μμ κ°μ κ°μ Έμ΅λλ€. |
ν μμ ν¨μ μμ μ½λ
β’
FIRST_VALUE
β’
LAST_VALUE
β’
LAG
β’
LEAD
FIRST_VALUE
β’
κ° λΆμλ³λ‘ 첫 λ²μ§Έλ‘ μ
μ¬ν μ§μμ κΈμ¬λ₯Ό μ‘°ν
SELECT department_id
, employee_id
, salary
,FIRST_VALUE(salary)
OVER (PARTITION BY department_id
ORDER BY hire_date) AS first_salary
FROM employees;
SQL
볡μ¬
LAST_VALUE
β’
κ° λΆμλ³λ‘ λ§μ§λ§μΌλ‘ μ
μ¬ν μ§μμ κΈμ¬λ₯Ό μ‘°ν
SELECT department_id
, employee_id
, salary
, LAST_VALUE(salary)
OVER (PARTITION BY department_id
ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_salary
FROM employees;
SQL
볡μ¬
LAG
β’
μ΄μ μ§μμ μ 보λ₯Ό μ‘°ν
SELECT employee_id, first_name, hire_date,
LAG(first_name) OVER (ORDER BY hire_date) AS previous_name,
LAG(hire_date) OVER (ORDER BY hire_date) AS previous_hire_date
FROM employees;
SQL
볡μ¬
LEAD
β’
λ€μ μ§μμ μ 보λ₯Ό μ‘°ν
SELECT employee_id, first_name, hire_date,
LEAD(first_name) OVER (ORDER BY hire_date) AS next_first_name,
LEAD(hire_date) OVER (ORDER BY hire_date) AS next_hire_date
FROM employees;
SQL
볡μ¬
λΉμ¨ ν¨μ
κ²°κ³Ό μ§ν© λ΄μμ νΉμ κ°μ λΉμ¨μ΄λ λ°±λΆμ¨μ κ³μ°νλ ν¨μ
ν¨μλͺ
| μ€λͺ
|
CUME_DIST | κ²°κ³Ό μ§ν©μμ νμ¬ νμ λμ λΆν¬ κ°μ κ³μ°ν©λλ€. |
PERCENT_RANK | κ²°κ³Ό μ§ν©μμ νμ¬ νμ λ°±λΆμ μμλ₯Ό κ³μ°ν©λλ€. |
NTILE | κ²°κ³Ό μ§ν©μ μ§μ λ κ°μμ λμΌν ν¬κΈ°μ κ·Έλ£ΉμΌλ‘ λλκ³ , κ° νμ κ·Έλ£Ή λ²νΈλ₯Ό ν λΉν©λλ€. |
RATIO_TO_REPORT | κ²°κ³Ό μ§ν©μ κ° κ·Έλ£Ήμμ νμ¬ νμ λΉμ¨μ κ³μ°ν©λλ€. |
λΉμ¨ ν¨μ μμ μ½λ
β’
CUME_DIST
β’
PERCENT_RANK
β’
NTILE
β’
RATIO_TO_REPORT
CUME_DIST
β’
μ΄ ν¨μλ κ²°κ³Ό μ§ν©μμ νμ¬ νμ λμ λΆν¬ κ°μ κ³μ°
SELECT employee_id
, salary
, CUME_DIST()
OVER (ORDER BY salary DESC) AS cumulative_distribution
FROM employees;
SQL
볡μ¬
PERCENT_RANK
β’
μ΄ ν¨μλ κ²°κ³Ό μ§ν©μμ νμ¬ νμ λ°±λΆμ μμλ₯Ό κ³μ°
SELECT employee_id
, salary
, PERCENT_RANK()
OVER (ORDER BY salary DESC) AS percent_rank
FROM employees;
SQL
볡μ¬
NTILE
β’
μ΄ ν¨μλ κ²°κ³Ό μ§ν©μ μ§μ λ κ°μμ λμΌν ν¬κΈ°μ κ·Έλ£ΉμΌλ‘ λλκ³ , κ° νμ κ·Έλ£Ή λ²νΈλ₯Ό ν λΉ
SELECT employee_id
, salary
, NTILE(4)
OVER (ORDER BY salary DESC) AS quartile
FROM employees;
SQL
볡μ¬
RATIO_TO_REPORT
β’
μ΄ ν¨μλ κ²°κ³Ό μ§ν©μ κ° κ·Έλ£Ήμμ νμ¬ νμ λΉμ¨μ κ³μ°
SELECT department_id
, employee_id
, salary
, RATIO_TO_REPORT(salary)
OVER (PARTITION BY department_id) AS salary_ratio
FROM employees;
SQL
볡μ¬
Top N 쿼리
κ²°κ³Ό μ§ν©μμ μμ Nκ°μ νμ λ°ννλ 쿼리
μ’ λ₯
β’
ROWNUM
β’
ROWID
ROWNUM
SELECT λ¬Έμ λ
Όλ¦¬μ μΈ μλ²μ λνλ΄λ κ°μμ 컬λΌ
SELECT *
FROM (
SELECT ROWNUM AS row_num, board_id, title, content
FROM board
WHERE ROWNUM <= 10 -- μνλ νμ΄μ§ ν¬κΈ°λ₯Ό μ¬κΈ°μ μ§μ ν©λλ€.
)
WHERE row_num >= 1; -- μνλ νμ΄μ§ λ²νΈμ λ§κ² μμνλ ν λ²νΈλ₯Ό μ¬κΈ°μ μ§μ ν©λλ€.
SQL
볡μ¬
ROWID
κ° νμ κ³ μ νκ² μλ³νλλ° μ¬μ©λλ μλ³μ
κ΅¬μ± μμ | μ€λͺ
|
μ€λΈμ νΈ λ²νΈ | ROWIDκ° μν κ°μ²΄(ν
μ΄λΈ λλ ν΄λ¬μ€ν°)μ κ³ μ ν λ²νΈλ₯Ό λνλ
λλ€. |
μλ νμΌ λ²νΈ | νμ΄ μ μ₯λ μλμ μΈ λ°μ΄ν° νμΌ λ²νΈλ₯Ό λνλ
λλ€. |
λΈλ‘ λ²νΈ | νμ΄ μ μ₯λ λ°μ΄ν° λΈλ‘μ λ²νΈλ₯Ό λνλ
λλ€. |
λ°μ΄ν° λ²νΈ | λΈλ‘ λ΄μμμ νμ μλμ μΈ μμΉλ₯Ό λνλ
λλ€. |
β’
ROWID μμμ½λ
SELECT ROWID
, employee_id
, first_name
FROM employees
WHERE department_id = 30;
SQL
볡μ¬
κ³μΈ΅ν 쿼리
κ³μΈ΅μ μΈ λ°μ΄ν° ꡬ쑰μμ λΆλͺ¨-μμ κ΄κ³λ₯Ό κ°μ§ λ°μ΄ν°λ₯Ό κ²μνκ±°λ μ‘°μνλ 쿼리
λ¬Έλ²
SELECT [ννμλ€]
FROM [ν
μ΄λΈλͺ
]
START WITH [μμ 쑰건]
CONNECT BY [μ¬κ· 쑰건];
SQL
볡μ¬
β’
κΈ°λ³Έ κ΅¬μ± μμ
ꡬ문 | μ€λͺ
|
SELECT [ννμλ€] | μ‘°νν μ΄μ μ§μ ν©λλ€. κ³μΈ΅ ꡬ쑰λ₯Ό νννκΈ° μν μ΄κ³Ό μΆκ°μ μΈ μ΄μ΄ ν¬ν¨λ μ μμ΅λλ€. |
FROM [ν
μ΄λΈλͺ
] | κ³μΈ΅ν 쿼리λ₯Ό μνν λμ ν
μ΄λΈμ μ§μ ν©λλ€. |
START WITH [μμ 쑰건] | κ³μΈ΅ ꡬ쑰μ μμμ μ μ μν©λλ€. μ§μ λ 쑰건μ λ§μ‘±νλ νμ΄ μμμ μ΄ λ©λλ€. |
CONNECT BY [μ¬κ· 쑰건] | μ¬κ·μ μΈ κ΄κ³λ₯Ό μ μν©λλ€. μ§μ λ 쑰건μ λ§μ‘±νλ νμ΄ μ΄μ νκ³Ό μ°κ²°λμ΄ κ³μΈ΅ ꡬ쑰λ₯Ό νμ±ν©λλ€. |
PRIOR | CONNECT BY μ κ³Ό ν¨κ» μ¬μ©λλ©°, μ΄μ νμ μλ―Ένλ ν€μλμ΄λ€.
|
β’
CONNECT BY ν€μλ
ν€μλ λ° ν¨μ | μ€λͺ
|
CONNECT BY | κ³μΈ΅μ 쿼리λ₯Ό μ μνκΈ° μν ν€μλλ‘, λΆλͺ¨-μμ κ°μ κ΄κ³λ₯Ό μ§μ ν©λλ€. |
LEVEL | νμ¬ νμ κ³μΈ΅ λ 벨μ λνλ΄λ μμ¬ μ΄μ
λλ€. |
CONNECT_BY_ROOT | κ³μΈ΅ ꡬ쑰μμ μ΅μμ λΆλͺ¨λ₯Ό λνλ΄λ μμ¬ μ΄μ
λλ€. |
CONNECT_BY_ISLEAF | νμ¬ νμ΄ λ¦¬ν(λ§λ¨) λ
ΈλμΈμ§ μ¬λΆλ₯Ό νλ³νλ μμ¬ μ΄μ
λλ€. |
SYS_CONNECT_BY_PATH | κ³μΈ΅μ 쿼리μμ νμ κ²½λ‘λ₯Ό λνλ΄λ ν¨μμ
λλ€. |
NOCYCLE | μν(cycle)μ λ°©μ§νκΈ° μν μ΅μ
μ
λλ€. |
CONNECT_BY_ISCYCLE | νμ¬ νμ΄ μν ꡬ쑰μ μλμ§ μ¬λΆλ₯Ό νλ³νλ μμ¬ μ΄μ
λλ€. |
ORDER BY SIBLINGS BY μ»¬λΌ | κ°μ LEVEL λ
Έλ μ¬μ΄μμ μ λ ¬μ μνν©λλ€. |
κ³μΈ΅ν μΏΌλ¦¬λ‘ μ‘°μ§λλ₯Ό μΆλ ₯νλ μμ μ½λ
SELECT LEVEL
, employee_id
, first_name
, last_name
, job_id
, manager_id
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id;
SQL
볡μ¬
β’
START WITH manager_id IS NULL: μ΅μμ λΆμμ μ§μλ€μ μ νν©λλ€. μ¬κΈ°μλ μ΅μμ μ§μμ΄ λ§€λμ κ° μλ μ§μλ€μ
λλ€.
β’
CONNECT BY PRIOR employee_id = manager_id: κ° νμ μ΄μ νκ³Ό μ°κ²°ν©λλ€. μ΄μ ν(PRIOR)μ employee_idκ° νμ¬ νμ manager_idμ κ°μ κ²½μ°, κ³μΈ΅μ μΌλ‘ μ°κ²°λ©λλ€.
β’
LEVEL: κ° νμ κ³μΈ΅ λ 벨μ λνλ
λλ€.
β¦
1 : λν
β¦
2 : λΆμμ₯ (μμ¬)
β¦
3 : μ§μ (λΆν)
PIVOT, UNPIVOT
PIVOT
κ·Έλ£Ήνν ν λ°μ΄ν°λ₯Ό μ΄λ‘ λ°κΎΈμ΄μ μΆλ ₯νλ ν¨μ
λ¬Έλ²
(
SELECT 컬λΌ1, 컬λΌ2, 컬λΌ3
FROM ν
μ΄λΈλͺ
)
PIVOT (
κ·Έλ£Ήν¨μ( 컬λ΄λͺ
)
FOR νΌλ²ν μ»¬λΌ IN ( κ°1, κ°2, κ°3, ... )
)
SQL
볡μ¬
β’
μ§κΈμ νμ νμ, λΆμλ μ΄μ κ·Έλ£Ήννμ¬ μ΅κ³ κΈμ¬λ₯Ό μΆλ ₯νμμ€.
SELECT *
FROM (
SELECT dept_code, job_code, salary
FROM employee
)
PIVOT (
MAX(salary)
-- μ΄μ μ¬λ¦΄ 컬λΌλ€
FOR dept_code IN ('D1','D2','D3','D4','D5','D6','D7','D8','D9')
)
ORDER BY job_code;
SQL
볡μ¬
UNPIVOT
κ·Έλ£Ήνλ κ²°κ³ΌμΈ μ΄μ ν λ°μ΄ν°λ‘ λ°κΎΈμ΄μ μΆλ ₯νλ ν¨μ
λ¬Έλ²
(
SELECT 컬λΌ1, 컬λΌ2, 컬λΌ3
FROM ν
μ΄λΈλͺ
)
UNPIVOT (
κΈ°μ€μ»¬λΌ
FOR νΌλ²ν μ»¬λΌ IN (μ΄1, μ΄2, μ΄3, ... )
)
SQL
볡μ¬
β’
μ§κΈμ½λλ₯Ό μ΄μμ νμΌλ‘ λ³ννμ¬, κ° λΆμ(dept_code)λ³λ‘ μ§λ¬΄λ³ μ΅λ κΈμ¬λ₯Ό μ‘°ννμμ€.
SELECT *
FROM (
SELECT dept_code
,MAX( DECODE(job_code, 'J1', salary ) ) J1
,MAX( DECODE(job_code, 'J2', salary ) ) J2
,MAX( DECODE(job_code, 'J3', salary ) ) J3
,MAX( DECODE(job_code, 'J4', salary ) ) J4
,MAX( DECODE(job_code, 'J5', salary ) ) J5
,MAX( DECODE(job_code, 'J6', salary ) ) J6
,MAX( DECODE(job_code, 'J7', salary ) ) J7
FROM employee
GROUP BY dept_code
ORDER BY dept_code
)
UNPIVOT (
salary
FOR job_code IN (J1, J2, J3, J4, J5, J6, J7)
)
;
SQL
볡μ¬
ν μ΄λΈ νν°μ
λμ©λ ν
μ΄λΈμ μ¬λ¬ λ°μ΄ν° νμΌλ‘ λΆλ¦¬νμ¬ μ μ₯νλ κΈ°λ²
νΉμ§
β’
CRUD μ±λ₯ ν₯μ
β’
νν°μ
λ³λ‘ λ
립μ μΌλ‘ λ°±μ
λ° λ³΅κ΅¬ κ°λ₯
β’
μ‘°ν μ±λ₯ ν₯μ
μ’ λ₯
νν°μ
μ’
λ₯ | μ€λͺ
|
Range Partition | μ§μ λ μ΄μ κ° λ²μμ λ°λΌ ν
μ΄λΈμ μ¬λ¬ νν°μ
μΌλ‘ λΆν ν©λλ€. μ£Όλ‘ λ μ§ λλ μ«μν μ΄μ μ¬μ©λ©λλ€. |
List Partition | μ΄μ λͺ©λ‘ κ°μ λ°λΌ ν
μ΄λΈμ μ¬λ¬ νν°μ
μΌλ‘ λΆν ν©λλ€. μ£Όλ‘ λͺ
μμ μΈ κ° λ¦¬μ€νΈμ μ¬μ©λ©λλ€. |
Hash Partition | ν΄μ ν¨μμ λ°λΌ νμ ν΄μ κ°μ κΈ°μ΄νμ¬ ν
μ΄λΈμ μ¬λ¬ νν°μ
μΌλ‘ λΆν ν©λλ€. κ· μΌνκ² λΆμ°λμ΄μλ κ²½μ°μ μ ν©ν©λλ€. |
νν°μ μΈλ±μ€
λ°μ΄ν°λ² μ΄μ€μμ νν°μ
λλ ν
μ΄λΈμ λν μΈλ±μ€
β’
νΉμ ν νν°μ
ν€μ κΈ°λ°νμ¬ μ¬λ¬ κ°μ νν°μ
μΌλ‘ λΆν λ λ°μ΄ν°μ λν λΉ λ₯Έ μ‘μΈμ€λ₯Ό μ 곡ν©λλ€.
β’
νν°μ
μΈλ±μ€λ νν°μ
λ ν
μ΄λΈκ³Ό κ΄λ ¨λ λ°μ΄ν°μ λν΄ μΈλ±μ€μ μΌλΆλ₯Ό κ°κ°μ νν°μ
μ μ μ₯νλ―λ‘, λλμ λ°μ΄ν°λ₯Ό λ³΄λ€ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νκ³ κ²μν μ μμ΅λλ€.
κ΅¬λΆ | μ€λͺ
|
Global Index | νλμ μΈλ±μ€κ° ν
μ΄λΈμ λͺ¨λ νν°μ
μ λν΄ μμ±λ©λλ€. νν°μ
ν€λ₯Ό ν¬ν¨νμ§ μμ΅λλ€. |
Local Index | κ° νν°μ
μ λν΄ λ³λμ μΈλ±μ€κ° μμ±λ©λλ€. κ° μΈλ±μ€λ ν΄λΉ νν°μ
μ λ°μ΄ν°λ§μ ν¬ν¨ν©λλ€. ν
μ΄λΈ νν°μ
μ μμ λμΌν μμ μΈλ±μ€κ° μμ±λ©λλ€. |
Prefixed Index | νν°μ
ν€λ₯Ό μΈλ±μ€μ 첫 λ²μ§Έ μ΄λ‘ μ¬μ©νλ μΈλ±μ€μ
λλ€. μ΄λ νν°μ
ν€μ μΌλΆκ° μΈλ±μ€ ν€μ μΌλΆλ‘ μ¬μ©λλ κ²½μ°λ₯Ό μλ―Έν©λλ€. |
Non Prefixed Index | νν°μ
ν€λ₯Ό μΈλ±μ€μ 첫 λ²μ§Έ μ΄λ‘ μ¬μ©νμ§ μλ μΈλ±μ€μ
λλ€. μΈλ±μ€ ν€μ νν°μ
ν€κ° λμΌνμ§ μμ΅λλ€. μ΄ κ²½μ° μΈλ±μ€λ ν
μ΄λΈ νν°μ
κ³Ό 무κ΄νκ² μλν©λλ€. |
μ κ· ννμ
λ¬Έμμ΄ ν¨ν΄μ νννλ λ° μ¬μ©λλ νμ μΈμ΄
ν¨μ
ν¨μλͺ
| μ€λͺ
|
REGEXP_LIKE | λ¬Έμμ΄μ΄ μ κ· ννμκ³Ό μΌμΉνλμ§ μ¬λΆλ₯Ό νμΈν©λλ€. |
REGEXP_REPLACE | λ¬Έμμ΄μμ μ κ· ννμκ³Ό μΌμΉνλ λΆλΆμ λ€λ₯Έ λ¬Έμμ΄λ‘ λ체ν©λλ€. |
REGEXP_INSTR | λ¬Έμμ΄μμ μ κ· ννμκ³Ό μΌμΉνλ λΆλΆμ μμΉλ₯Ό λ°νν©λλ€. |
REGEXP_SUBSTR | λ¬Έμμ΄μμ μ κ· ννμκ³Ό μΌμΉνλ λΆλΆμ μΆμΆν©λλ€. |
REGEXP_COUNT | λ¬Έμμ΄μμ μ κ· ννμκ³Ό μΌμΉνλ λΆλΆμ μλ₯Ό λ°νν©λλ€. |
λ©νλ¬Έμ
μ κ· ννμμ ꡬ문μ μ μνκ³ ν¨ν΄ 맀μΉμ μννλ λ° μ¬μ©λλ κΈ°νΈ
λ©ν λ¬Έμ | μ€λͺ
|
^ | λ¬Έμμ΄μ μμμ λνλ
λλ€. |
$ | λ¬Έμμ΄μ λμ λνλ
λλ€. |
. | μμμ ν λ¬Έμμ μΌμΉν©λλ€. |
* | λ°λ‘ μμ μλ λ¬Έμλ κ·Έλ£Ήμ΄ 0λ² μ΄μ λ°λ³΅λ¨μ λνλ
λλ€. |
+ | λ°λ‘ μμ μλ λ¬Έμλ κ·Έλ£Ήμ΄ 1λ² μ΄μ λ°λ³΅λ¨μ λνλ
λλ€. |
? | λ°λ‘ μμ μλ λ¬Έμλ κ·Έλ£Ήμ΄ 0 λλ 1λ² λνλ μ μμμ λνλ
λλ€. |
{n} | λ°λ‘ μμ μλ λ¬Έμλ κ·Έλ£Ήμ΄ nλ² λ°λ³΅λ¨μ λνλ
λλ€. |
{n,} | λ°λ‘ μμ μλ λ¬Έμλ κ·Έλ£Ήμ΄ nλ² μ΄μ λ°λ³΅λ¨μ λνλ
λλ€. |
{n,m} | λ°λ‘ μμ μλ λ¬Έμλ κ·Έλ£Ήμ΄ μ΅μ nλ² μ΄μ μ΅λ mλ²κΉμ§ λ°λ³΅λ¨μ λνλ
λλ€. |
[abc] | λκ΄νΈ μμ μλ λ¬Έμ μ€ νλμ μΌμΉν©λλ€. |
[^abc] | λκ΄νΈ μμ μλ λ¬Έμλ€μ μ μΈν λ¬Έμμ μΌμΉν©λλ€. |
[a-z] | λκ΄νΈ μμ μλ λ²μμ λ¬Έμ μ€ νλμ μΌμΉν©λλ€. |
| | "or"λ₯Ό λνλ΄λ©°, ν¨ν΄μ μ¬λ¬ λΆλΆ μ€ νλμ μΌμΉν©λλ€. |
() | κ·Έλ£Ήμ λνλ΄λ©°, κ·Έλ£Ήνλ λΆλΆμ λμ€μ μ°Έμ‘°νκ±°λ λ°λ³΅ μλμ μ§μ ν λ μ¬μ©λ©λλ€. |
\ | νΉμ λ¬Έμμ μλ―Έλ₯Ό μ κ±°νκ³ λ¬Έμ κ·Έ μ체λ₯Ό λνλ
λλ€. |
μμ μ½λ
β’
μ«μ κ²μ¬
β’
λ¬Έμ κ²μ¬
β’
μ΄λ©μΌ νμ κ²μ¬
μ«μ κ²μ¬
SELECT column_name
FROM table_name
WHERE REGEXP_LIKE(column_name, '^[0-9]+$');
SQL
볡μ¬
λ¬Έμ κ²μ¬
SELECT column_name
FROM table_name
WHERE REGEXP_LIKE(column_name, '^[A-Za-z]+$');
SQL
볡μ¬
μ΄λ©μΌ νμ κ²μ¬
SELECT email
FROM users
WHERE REGEXP_LIKE(email, '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');
SQL
볡μ¬