SQL Select문 기본 문법과 실행 순서 & Truncate 와 Delete 차이
SQL Select문의 기본 문법과 실행 순서를 체계적으로 설명하는 가이드로, FROM부터 ORDER BY까지 각 절의 역할과 사용법을 상세히 다룬다. 그리고 Truncate 와 Delete 의 차이를 설명한다.
SQL Select문의 실행 순서
SQL 쿼리를 작성할 때는 문법적 순서와 실제 실행 순서가 다르다는 점을 이해해야 한다. 오라클 기준으로 실제 실행 순서는 다음과 같다.
실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
이 순서를 이해하면 쿼리 작성과 디버깅이 훨씬 수월해진다.
SQL 실행 순서를 이해하는 것은 효율적인 쿼리 작성과 성능 최적화의 기본이다.
FROM 절
FROM 절은 쿼리에서 가장 먼저 실행되며, 데이터를 가져올 테이블을 지정한다.
SELECT column_name
FROM table_name;
여러 테이블을 조인할 경우 다음과 같이 작성한다:
SELECT column_name
FROM table1
JOIN table2 ON table1.column = table2.column;
💡 FROM 절에서는 테이블뿐만 아니라 서브쿼리(인라인 뷰)도 사용할 수 있다.
WHERE 절
WHERE 절은 FROM 절 다음에 실행되며, 조건에 맞는 행만 필터링한다.
SELECT column_name
FROM table_name
WHERE condition;
WHERE 절에서 자주 사용되는 조건식:
-- 기본키와 기본키 비교
WHERE employee_id = 100
-- 기본키와 외래키 비교
WHERE department.dept_id = employee.dept_id
-- 컬럼과 값 비교
WHERE last_name = 'Smith'
-- 다중 조건
WHERE salary > 5000 AND department_id = 20
⚡ WHERE 절은 GROUP BY 이전에 실행되므로 집계 함수(SUM, AVG 등)를 WHERE 절에서 사용할 수 없다.
GROUP BY 절
GROUP BY 절은 지정된 컬럼을 기준으로 데이터를 그룹화한다.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
GROUP BY 사용 시 주의사항:
- SELECT 절에는 GROUP BY에 명시된 컬럼과 집계 함수만 사용 가능
- GROUP BY에 명시된 컬럼 순서대로 그룹화 진행
-- 다중 컬럼 그룹화
SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id;
GROUP BY 절에 명시되지 않은 컬럼을 SELECT 절에 단독으로 사용하면 오류가 발생한다.
HAVING 절
HAVING 절은 GROUP BY로 그룹화된 결과에 조건을 적용한다.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 8000;
HAVING과 WHERE의 차이점:
- WHERE: 개별 행에 대한 필터링 (그룹화 전)
- HAVING: 그룹화된 결과에 대한 필터링 (그룹화 후)
-- WHERE와 HAVING 함께 사용
SELECT department_id, AVG(salary)
FROM employees
WHERE hire_date > TO_DATE('01-JAN-2005', 'DD-MON-YYYY')
GROUP BY department_id
HAVING AVG(salary) > 8000;
💡 HAVING 절에서는 집계 함수를 사용할 수 있지만, WHERE 절에서는 사용할 수 없다.
SELECT 절
SELECT 절은 쿼리 결과에 포함될 컬럼을 지정한다.
SELECT column1, column2, ...
FROM table_name;
SELECT 절에서 사용할 수 있는 요소:
DISTINCT 키워드
중복된 행을 제거한다.
SELECT DISTINCT department_id
FROM employees;
별칭(Alias)
컬럼이나 표현식에 별칭을 부여한다.
SELECT first_name AS name, salary * 12 AS annual_salary
FROM employees;
와일드카드(*)
모든 컬럼을 선택한다.
SELECT *
FROM employees;
그룹 함수
데이터를 집계하는 함수를 사용한다.
SELECT COUNT(*), SUM(salary), AVG(salary), MAX(salary), MIN(salary)
FROM employees;
SELECT 절은 쿼리에서 마지막에서 두 번째로 실행되므로, SELECT 절에서 정의한 별칭은 ORDER BY 절에서만 사용할 수 있다.
ORDER BY 절
ORDER BY 절은 쿼리 결과를 정렬한다.
SELECT column1, column2
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
ORDER BY 사용 예시:
-- 오름차순 정렬(기본값)
SELECT employee_id, last_name, salary
FROM employees
ORDER BY salary ASC;
-- 내림차순 정렬
SELECT employee_id, last_name, salary
FROM employees
ORDER BY salary DESC;
-- 다중 컬럼 정렬
SELECT department_id, last_name, salary
FROM employees
ORDER BY department_id ASC, salary DESC;
⚡ ORDER BY 절은 쿼리에서 가장 마지막에 실행되므로, SELECT 절에서 정의한 별칭을 사용할 수 있다.
DDL, DML, TCL, DCL, DQL
데이터 정의어 (DDL : Data Definition Language) – Auto Commit
- Create: DB 생성
- Alter: DB 변경
- Drop: DB 삭제
- Rename: DB 이름변경
- Truncate: 데이블을 모든 행을 삭제
데이터 조작어 (DML: Data Manipulation Language)
- Insert: 데이터 입력
- Update: 데이터 수정
- Delete: 데이터 삭제
트랜잭션 처리어 (TCL: Transation Control Language)
- Commit: 트랜잭션 작업 정상 처리
- RollBack: 트랜잭션 작업 취소
- Savepoint: 임시 작업구간 저장
데이터 제어어 (DCL : Data Control Language)
- Grant: DB에 대한 일련의 권한 부여
- Revolk: DB에 대한 일련의 권한 취소
데이터 질의어 (DQL : Data Query Language)
- Select
Truncate 와 Delete
Truncate 는 DDL, Delete 는 DML
-
Truncate: 테이블을 모든 행을 삭제하는 명령어, 롤백이 안됨, 자동 커밋
-
Delete: 롤백이 가능, 부분 삭제 가능, 삭제를 위한 공간이 필요 , 처리 속도가 느림.
전체 SELECT문 예제
다음은 모든 절을 포함한 완전한 SELECT문 예제이다:
SELECT department_id, job_id, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
WHERE hire_date > TO_DATE('01-JAN-2005', 'DD-MON-YYYY')
GROUP BY department_id, job_id
HAVING COUNT(*) > 1
ORDER BY department_id ASC, avg_salary DESC;
이 쿼리는:
- employees 테이블에서 데이터를 가져온다(FROM)
- 2005년 1월 1일 이후 입사한 직원만 필터링한다(WHERE)
- 부서와 직무별로 그룹화한다(GROUP BY)
- 각 그룹에 2명 이상의 직원이 있는 경우만 선택한다(HAVING)
- 부서 ID, 직무 ID, 직원 수, 평균 급여를 표시한다(SELECT)
- 부서 ID 오름차순, 평균 급여 내림차순으로 정렬한다(ORDER BY)
SQL Select문의 각 절을 이해하고 실행 순서를 숙지하면 더 효율적이고 정확한 쿼리를 작성할 수 있다. 특히 그룹 함수와 관련된 GROUP BY와 HAVING 절의 사용법을 정확히 이해하는 것이 중요하다.
댓글남기기