01 | SELECT문
가장 기본적인 SQL문으로 테이블이나 뷰에 있는 데이터를 조회할 때 사용하는 문장이다. SQL문 중 사용빈도로 볼 때 가장 많이 사용하는 것이 SELECT문이며, 기본 구문은 다음과 같다.
SELECT * 혹은 컬럼
FROM [스키마.]테이블명 혹은 [스키마.]뷰명
WHERE 조건
ORDER BY 컬럼;
SQL에 대한 사전지식이 없다고 가정하고 데이터를 조회한다는 것이 어떤 식으로 이루어질지 생각해보자. 어딘가에 있는 데이터를 추출해야 한다고 할 때 필요한 것은, 어디에서(WHERE), 어떤 데이터(WHAT)를 가져올 것인지로 구분할 수 있다. 이때, ‘어디에서’(테이블 혹은 뷰에서)에 해당하는 내용을 FROM절에서, ‘어떤 데이터’에 해당하는 내용을 SELECT절에 기술해 준다.그리고 ‘어떤 데이터’는 다시 어떠한 조건에 맞는 데이터인지를 식별해야 하는데, 이 조건을 기술하는 부분이 바로 WHERE절이다.
사원 테이블에서 급여가 5000이 넘는 사원번호와 사원명을 조회한다고 할 때 앞서 설명한 방식을 적용하면,
SELECT 사원번호, 사원명
FROM 사원 테이블
WHERE 급여 > 50000;
이를 다시 SQL문으로 변환하면 다음과 같다.
입력
SELECT employee_id, emp_name
FROM employees
WHERE salary > 5000;
결과
EMPLOYEE_ID EMP_NAME
----------- ------------------
201 Michael Hartstein
202 Pat Fay
203 Susan Mavris
204 Hermann Baer
205 Shelley Higgins
206 William Gietz
....
58개의 행이 선택됨
사번과 사원명뿐 아니라 사원 테이블에 있는 모든 데이터(컬럼)를 보려면 컬럼명을 일일이 나열하는 대신 ‘*’를 붙인다. 가장 기본적인 형태의 SELECT문의 구조는 이것이 전부다! 의외로 정말 간단하다고 생각할 수도 있을 텐데, 이 정도로 SQL문은 다른 컴퓨터 언어에 비해 배우기 쉽다. 추가로 알아야 할 내용은 용도에 따라 기본 형태에 추가되는 구문이다. 예를 들어, 위 문장에서 조회 결과를 사번으로 정렬해서 보고 싶다면 WHERE 다음에 ORDER BY절을 붙인다.
입력
SELECT employee_id, emp_name
FROM employees
WHERE salary > 5000
ORDER BY employee_id;
결과
EMPLOYEE_ID EMP_NAME
----------- ----------------
100 Steven King
101 Neena Kochhar
102 Lex De Haan
103 Alexander Hunold
104 Bruce Ernst
....
58개의 행이 선택됨
조건을 추가로 붙일 수도 있다. 급여가 5000 이상이고 job_id가 ‘IT_PROG’인 사원을 조회한다면, AND 연산자와 job_id를 검색하는 조건을 추가한다.
입력
SELECT employee_id, emp_name
FROM employees
WHERE salary > 5000
AND job_id = 'IT_PROG'
ORDER BY employee_id;
결과
EMPLOYEE_ID EMP_NAME
----------- -----------------
103 Alexander Hunold
104 Bruce Ernst
한 가지 주의할 점은 오라클은 디폴트로 대소문자를 구분한다는 것이다. 따라서 job_id = ‘it_prog’라고 하면 데이터가 조회되지 않는다.
입력
SELECT employee_id, emp_name
FROM employees
WHERE salary > 5000
AND job_id = 'it_prog'
ORDER BY employee_id;
결과
선택된 행 없음
급여가 5000 이상이거나 job_id가 ‘IT_PROG’인 사원, 즉 급여가 5000 이상인 사원 혹은 job_id 값이 ‘IT_PROG’인 사원을 조회한다면, AND 대신 OR 연산자와 조건을 추가로 붙이면 된다.
입력
SELECT employee_id, emp_name
FROM employees
WHERE salary > 5000
OR job_id = 'IT_PROG'
ORDER BY employee_id;
결과
EMPLOYEE_ID EMP_NAME
----------- ------------------
100 Steven King
101 Neena Kochhar
102 Lex De Haan
103 Alexander Hunold
104 Bruce Ernst
....
61개의 행이 선택됨
2장에서 소개했던 emp_dept_v1 뷰처럼 한 개 이상의 테이블에서 데이터를 조회해 올 수 있다.
입력
SELECT a.employee_id, a.emp_name, a.department_id,
b.department_name
FROM employees a,
departments b
WHERE a.department_id = b.department_id;
FROM절 절을 보면 테이블명 다음에 a, b라고 명시해 놓고 SELECT와 WHERE절에서 ‘a.’컬럼 그리고 ‘b.’컬럼 형태로 사용하는데, 이 a와 b를 별칭alias이라고 한다. 즉 employees란 이름 대신 a, departments 대신 b를 사용한다고 기술한 것이다. 테이블명 뿐만 아니라 컬럼명에도 별칭을 붙일 수 있는데, 그 형태는 “원컬럼명 AS 컬럼별칭”이며 이때 ‘AS’는 생략 가능하다.
입력
SELECT a.employee_id, a.emp_name, a.department_id,
b.department_name AS dep_name
FROM employees a,
departments b
WHERE a.department_id = b.department_id;
결과
EMPLOYEE_ID EMP_NAME DEPARTMENT_ID DEP_NAME
----------- ------------------ ------------- -------------
200 Jennifer Whalen 10 총무기획부
201 Michael Hartstein 20 마케팅
202 Pat Fay 20 마케팅
114 Den Raphaely 30 구매/생산부
...
106개의 행이 선택됨
SELECT나 WHERE 절에서 컬럼을 명시하려면 “테이블명.컬럼명” 형태로 써야 하는데 테이블명이 길면 SQL문장도 길어져 가독성이 떨어지므로 이때 별칭을 만들어 사용하면 여러 모로 편리하다. 이러한 별칭은 SELECT는 물론 INSERT, UPDATE, DELETE, MERGE 등 다른 DML에서도 모두 사용할 수 있다. 이 외에도 원하는 데이터를 추출하기 위해 기본 구문에 추가되는 형태는 매우 다양하다. 예를 들어, 특정 값을 집계해서 보려면 GROUP BY를, 다른 테이블과 연결해 데이터를 추출하려면 조인을 사용한다. 이런 추가적인 내용은 뒤에서 차례대로 다룰 것이다.