Search

SQL ν™œμš©

SQL ν™œμš©

μ„œλΈŒμΏΌλ¦¬ (Sub Query)

SQLλ¬Έ 내뢀에 μ‚¬μš©ν•˜λŠ” SELECT λ¬Έ
메인쿼리 : μ„œλΈŒμΏΌλ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” μ΅œμ’…μ μΈ SELECT λ¬Έ

μ„œλΈŒμΏΌλ¦¬ λΆ„λ₯˜

β€’
μ‹€ν–‰ 결과에 λ”°λ₯Έ λΆ„λ₯˜
β—¦
단일행 μ„œλΈŒμΏΌλ¦¬
β—¦
닀쀑행 μ„œλΈŒμΏΌλ¦¬
β–ͺ
닀쀑 ν–‰ μ—°μ‚°μž : IN, ANY, ALL, EXISTS
β€’
μ‚¬μš© μœ„μΉ˜μ— λ”°λ₯Έ λΆ„λ₯˜
β—¦
슀칼라 μ„œλΈŒμΏΌλ¦¬
β—¦
인라인 뷰
β—¦
μ„œλΈŒ 쿼리

μ‹€ν–‰ 결과에 λ”°λ₯Έ λΆ„λ₯˜

β€’
단일행 μ„œλΈŒμΏΌλ¦¬ : κ²°κ³Ό 데이터가 ν•˜λ‚˜μΈ μ„œλΈŒμΏΌλ¦¬
β€’
닀쀑행 μ„œλΈŒμΏΌλ¦¬ : κ²°κ³Ό 데이터가 μ—¬λŸ¬ 행인 μ„œλΈŒμΏΌλ¦¬
μ—°μ‚°
μ„€λͺ…
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)

μ„œλΈŒ 쿼리에 μ‘΄μž¬ν•˜λŠ” λ°μ΄ν„°λ§Œ 메인 μΏΌλ¦¬μ—μ„œ μΆ”μΆœν•˜μ—¬ 좜λ ₯ν•˜λŠ” 방식
IN λ˜λŠ” EXISTS μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œ 쑰인

μ•ˆν‹° 쑰인 (ANTI JOIN)

μ„œλΈŒ 쿼리에 μ‘΄μž¬ν•˜λŠ” λ°μ΄ν„°λ§Œ μ œμ™Έν•˜κ³  메인 μΏΌλ¦¬μ—μ„œ μΆ”μΆœν•˜μ—¬ 좜λ ₯ν•˜λŠ” 방식

μ…€ν”„ 쑰인 (SELF JOIN)

λ™μΌν•œ ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ„ 2λ²ˆμ΄μƒ μ‘°ν•©ν•˜μ—¬ 좜λ ₯ν•˜λŠ” 방식

μ™ΈλΆ€ 쑰인 (OUTER JOIN)

β€’
LEFT OUTER JOIN
β€’
RIGTH OUTER JOIN
β€’
FULL OUTER JOIN
β€’
CROSS JOIN (μΉ΄νƒ€μ‹œμ•ˆ 쑰인)

LEFT OUTER JOIN

μ™Όμͺ½ ν…Œμ΄λΈ”μ„ λ¨Όμ € μ½μ–΄λ“œλ¦° ν›„, 쑰인 쑰건에 μΌμΉ˜ν•˜λŠ” 였λ₯Έμͺ½ ν…Œμ΄λΈ”μ„ ν•¨κ»˜ μ‘°νšŒν•˜λŠ” 것
쑰건에 λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ”, 였λ₯Έμͺ½ ν…Œμ΄λΈ”μ˜ λ°μ΄ν„°λŠ” NULL 둜 μ‘°νšŒλœλ‹€.
1.
ANSI
ν…Œμ΄λΈ”1 A LEFT [OUTER] JOIN ν…Œμ΄λΈ”2 B ON 쑰인쑰건;
SQL
볡사
2.
(+)
WHERE A.κ³΅ν†΅μ»¬λŸΌ = B.κ³΅ν†΅μ»¬λŸΌ(+)
SQL
볡사

RIGHT OUTER JOIN

였λ₯Έμͺ½ ν…Œμ΄λΈ”μ„ λ¨Όμ € μ½μ–΄λ“œλ¦° ν›„, 쑰인 쑰건에 μΌμΉ˜ν•˜λŠ” μ™Όμͺ½ ν…Œμ΄λΈ”μ„ ν•¨κ»˜ μ‘°νšŒν•˜λŠ” 것
쑰건에 λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ”, μ™Όμͺ½ ν…Œμ΄λΈ”μ˜ λ°μ΄ν„°λŠ” NULL 둜 μ‘°νšŒλœλ‹€.
1.
ANSI
ν…Œμ΄λΈ”1 A RIGHT [OUTER] JOIN ν…Œμ΄λΈ”2 B ON 쑰인쑰건;
SQL
볡사
2.
(+)
WHERE A.κ³΅ν†΅μ»¬λŸΌ(+) = B.κ³΅ν†΅μ»¬λŸΌ
SQL
볡사

FULL OUTER JOIN

쑰인 쑰건에 μΌμΉ˜ν•˜λŠ” μ–‘μͺ½ ν…Œμ΄λΈ”μ˜ 데이터λ₯Ό μ‘°ν•©ν•˜μ—¬ μ‘°νšŒν•˜λŠ” 것
쑰건에 λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ”, μ–‘μͺ½μ— λ°μ΄ν„°λŠ” NULL 둜 μ‘°νšŒλœλ‹€.
ν…Œμ΄λΈ”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 문의 논리적인 μˆœλ²ˆμ„ λ‚˜νƒ€λ‚΄λŠ” κ°€μƒμ˜ 컬럼
ORACLE DB
데이터λ₯Ό 좜λ ₯ν•  λ•Œ λΆ€μ—¬λ˜λŠ” 논리적인 μˆœμ„œ 번호이기 λ•Œλ¬Έμ—, ROWNUM 을 μ‚¬μš©ν•˜μ—¬ νŽ˜μ΄μ§• 처리λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œλŠ” 인라인 λ·°λ₯Ό μ¨μ•Όν•œλ‹€.
ROWNUM λ₯Ό ν™œμš©ν•œ νŽ˜μ΄μ§• 처리
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 절과 ν•¨κ»˜ μ‚¬μš©λ˜λ©°, 이전 행을 μ˜λ―Έν•˜λŠ” ν‚€μ›Œλ“œμ΄λ‹€. PRIOR μžμ‹ = λΆ€λͺ¨ (μ •λ°©ν–₯) : λΆ€λͺ¨ μžμ‹ PRIOR λΆ€λͺ¨ = μžμ‹ (μ—­λ°©ν–₯) : μžμ‹ λΆ€λͺ¨
β€’
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
볡사