데이터베이스를 다루는 데 있어 가장 기본이 되는 것은 데이터를 조회하고, 추가하고, 수정하고, 삭제하는 작업이다. 오라클 데이터베이스에서는 이러한 작업을 수행하기 위해 SQL의 DML(Data Manipulation Language) 명령어인 SELECT, INSERT, UPDATE, DELETE를 사용한다. 이번 포스트에서는 오라클 데이터베이스에서 사용하는 기본 DML 구문의 사용법을 상세하게 알아 볼 예정이다.
1. SELECT 구문: 데이터 조회하기
1.1 기본 SELECT 구문
SELECT 구문은 데이터베이스에서 정보를 조회하는 가장 기본적인 명령어다.
SELECT column1, column2, ...
FROM table_name
WHERE condition;
간단한 예시를 살펴보자.
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE department_id = 50;
이 쿼리는 부서 번호가 50인 직원들의 ID, 이름, 성, 급여를 조회한다. department_id
는 실제 데이터베이스의 컬럼명과 일치해야 하며, 50은 찾고자 하는 부서 번호로 각자의 환경에 맞게 변경해야 한다.
1.2 모든 열 조회하기
테이블의 모든 열을 조회하려면 별표(*)를 사용한다.
SELECT * FROM employees;
하지만 실무에서는 필요한 열만 명시적으로 선택하는 것이 권장된다. 이는 네트워크 트래픽과 메모리 사용량을 줄이고, 쿼리 성능을 향상시킨다.
1.3 조건절과 연산자 사용하기
WHERE 절에는 다양한 연산자를 사용할 수 있다.
-- 비교 연산자
SELECT * FROM employees WHERE salary > 10000;
-- 논리 연산자
SELECT * FROM employees
WHERE department_id = 50 AND salary > 5000;
-- BETWEEN 연산자
SELECT * FROM employees
WHERE salary BETWEEN 5000 AND 10000;
-- IN 연산자
SELECT * FROM employees
WHERE department_id IN (10, 20, 30);
-- LIKE 연산자
SELECT * FROM employees
WHERE last_name LIKE 'S%';
LIKE
연산자에서 ‘%’는 0개 이상의 문자를 의미하고, ‘_’는 정확히 한 문자를 의미한다. 예를 들어, ‘S%’는 ‘S’로 시작하는 모든 문자열과 일치한다.
1.4 정렬하기 (ORDER BY)
결과를 특정 열을 기준으로 정렬하려면 ORDER BY 절을 사용한다.
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE department_id = 50
ORDER BY salary DESC;
DESC
는 내림차순(큰 값에서 작은 값 순), ASC
는 오름차순(작은 값에서 큰 값 순)을 의미한다. 기본값은 ASC
이다.
1.5 그룹화 (GROUP BY)와 집계 함수
데이터를 그룹화하고 집계 함수를 사용하여 요약 정보를 얻을 수 있다.
SELECT department_id, AVG(salary) as avg_salary, COUNT(*) as emp_count
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 8000
ORDER BY avg_salary DESC;
이 쿼리는 각 부서별 평균 급여와 직원 수를 계산하되, 평균 급여가 8000을 초과하는 부서만 조회한다. department_id
는 그룹화 기준 컬럼이고, 8000은 필터 조건으로 각자의 상황에 맞게 변경할 수 있다.
주요 집계 함수에는 SUM, AVG, COUNT, MAX, MIN 등이 있다.
1.6 조인 (JOIN)
여러 테이블을 연결하여 데이터를 조회하려면 JOIN을 사용한다.
-- INNER JOIN
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
-- LEFT OUTER JOIN
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
첫 번째 쿼리는 부서가 있는 직원만 조회하고, 두 번째 쿼리는 부서가 없는 직원도 포함하여 조회한다. employees
와 departments
는 테이블 이름이고, e
와 d
는 각각의 테이블 별칭이다.
1.7 서브쿼리 (Subquery)
쿼리 내에 다른 쿼리를 중첩하여 사용할 수 있다.
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
이 쿼리는 전체 직원의 평균 급여보다 높은 급여를 받는 직원들을 조회한다.
2. INSERT 구문: 데이터 추가하기
2.1 단일 행 추가하기
테이블에 단일 행을 추가하는 가장 기본적인 방법이다.
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
예를 들어:
INSERT INTO departments (department_id, department_name, manager_id, location_id)
VALUES (280, '데이터 분석', 103, 1700);
departments
는 테이블 이름이고, 괄호 안의 값들은 실제 삽입할 데이터다. 280, ‘데이터 분석’, 103, 1700 부분은 각자의 환경에 맞게 변경해야 한다.
2.2 여러 행 추가하기
한 번에 여러 행을 추가할 수도 있다.
INSERT INTO departments (department_id, department_name, location_id)
VALUES
(281, '인공지능', 1700),
(282, '클라우드 서비스', 1700),
(283, '블록체인', 1700);
2.3 서브쿼리를 통한 데이터 추가
다른 테이블이나 쿼리 결과에서 데이터를 가져와 삽입할 수 있다.
INSERT INTO emp_backup (employee_id, first_name, last_name, hire_date, salary)
SELECT employee_id, first_name, last_name, hire_date, salary
FROM employees
WHERE department_id = 50;
이 쿼리는 부서 번호가 50인 직원들의 정보를 백업 테이블에 복사한다. emp_backup
은 데이터를 삽입할 대상 테이블이고, employees
는 데이터를 가져올 소스 테이블이다.
3. UPDATE 구문: 데이터 수정하기
3.1 기본 UPDATE 구문
이미 존재하는 데이터를 수정할 때 UPDATE 문을 사용한다.
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
예를 들어:
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 50;
이 쿼리는 부서 번호가 50인 모든 직원의 급여를 10% 인상한다. employees
는 테이블 이름이고, 1.1은 급여 인상률, 50은 부서 번호로 각자의 환경에 맞게 변경해야 한다.
3.2 서브쿼리를 이용한 UPDATE
서브쿼리를 사용하여 다른 테이블의 데이터를 기반으로 업데이트할 수 있다.
UPDATE employees e
SET e.salary = (
SELECT AVG(salary) * 1.2
FROM employees
WHERE department_id = e.department_id
)
WHERE e.employee_id IN (145, 146, 147);
이 쿼리는 직원 ID가 145, 146, 147인 직원들의 급여를 해당 부서 평균 급여의 120%로 설정한다. 직원 ID 목록은 실제 업데이트하려는 직원 ID로 변경해야 한다.
3.3 다중 테이블 UPDATE
Oracle 11g 이상에서는 다중 테이블을 동시에 업데이트할 수 있다.
UPDATE (
SELECT e.salary, j.min_salary
FROM employees e
JOIN jobs j ON e.job_id = j.job_id
WHERE e.salary < j.min_salary
)
SET salary = min_salary;
이 쿼리는 현재 급여가 해당 직무의 최소 급여보다 낮은 직원들의 급여를 최소 급여로 조정한다.
4. DELETE 구문: 데이터 삭제하기
4.1 기본 DELETE 구문
테이블에서 데이터를 삭제할 때 DELETE 문을 사용한다.
DELETE FROM table_name
WHERE condition;
예를 들어:
DELETE FROM employees
WHERE hire_date < TO_DATE('01-JAN-2010', 'DD-MON-YYYY');
이 쿼리는 2010년 1월 1일 이전에 입사한 모든 직원을 삭제한다. 날짜 형식과 기준 날짜는 각자의 환경에 맞게 변경해야 한다.
4.2 서브쿼리를 이용한 DELETE
서브쿼리를 사용하여 다른 테이블의 데이터를 기반으로 삭제할 수 있다.
DELETE FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location_id = 1700
);
이 쿼리는 지역 ID가 1700인 부서에 속한 모든 직원을 삭제한다. 지역 ID는 실제 환경에 맞게 변경해야 한다.
4.3 DELETE와 TRUNCATE의 차이
테이블의 모든 데이터를 빠르게 삭제해야 할 때는 TRUNCATE를 고려할 수 있다.
TRUNCATE TABLE emp_backup;
TRUNCATE와 DELETE의 주요 차이점:
- TRUNCATE는 트랜잭션 로그를 최소화하여 성능이 더 빠르다.
- TRUNCATE는 자동으로 커밋되므로 롤백할 수 없다.
- TRUNCATE 후에는 테이블의 AUTO_INCREMENT 값이 초기화된다.
- DELETE는 WHERE 절을 통해 선택적 삭제가 가능하지만, TRUNCATE는 항상 전체 테이블을 비운다.
이 글에서 다룬 SELECT, INSERT, UPDATE, DELETE 구문은 데이터베이스 작업의 기본이지만, 효과적으로 활용하기 위해서는 지속적으로 쿼리를 작성하고 익숙해질 필요가 있다. 오라클 SQL은 강력하면서도 유연한 도구이며, 이를 마스터하면 데이터를 효과적으로 관리하고 분석할 수 있다. 이 글에서 소개한 기본 구문을 토대로 더 복잡한 쿼리와 고급 기능도 도전해보길 바란다!
관련 태그 및 키워드: 오라클 SQL, SELECT 구문, INSERT 구문, UPDATE 구문, DELETE 구문, 데이터 조회, 데이터 삽입, 데이터 수정, 데이터 삭제, 트랜잭션 관리, SQL 성능 최적화, JOIN, 서브쿼리, 그룹화, 정렬, WHERE 조건절, 오라클 데이터베이스, DML