본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

SQL의 SELECT 구문은 데이터베이스에서 원하는 데이터를 조회할 때 사용하는 기본적인 명령어이다. 테이블에서 특정 컬럼 또는 조건에 맞는 행(row)을 선택하여 결과 집합을 반환한다.

SELECT [컬럼명1], [컬럼명2], ...
FROM [테이블명]
[WHERE 조건]
[GROUP BY 컬럼]
[HAVING 조건]
[ORDER BY 컬럼 ASC|DESC]
[LIMIT 개수];

주요 구성 요소

편집 원본 편집
  • SELECT
    • 반환할 컬럼 지정
    • *을 사용하면 모든 컬럼 선택
  • FROM
    • 데이터를 가져올 테이블 지정
  • WHERE
    • 행을 필터링하는 조건 지정
  • GROUP BY
    • 그룹화 기준 컬럼 지정 (집계 함수와 함께 사용)
  • HAVING
    • GROUP BY 이후 집계 결과에 조건을 걸 때 사용
  • ORDER BY
    • 정렬 기준 지정 (기본값은 ASC, 오름차순)
  • LIMIT
    • 반환할 결과 행의 개수 제한 (DBMS에 따라 다를 수 있음)

예제에서는 다음과 같은 employees 테이블을 사용한다:

id name department salary
1 Alice IT 6000
2 Bob HR 4000
3 Carol IT 7000
4 Dave Sales 4500
5 Eve IT 5000

1. 모든 직원 정보 조회

편집 원본 편집
SELECT * FROM employees;

2. 이름과 급여만 조회

편집 원본 편집
SELECT name, salary FROM employees;

3. IT 부서 직원만 조회

편집 원본 편집
SELECT * FROM employees WHERE department = 'IT';

→ 결과:

id name department salary
1 Alice IT 6000
3 Carol IT 7000
5 Eve IT 5000

4. 급여가 높은 순으로 정렬

편집 원본 편집
SELECT name, salary FROM employees ORDER BY salary DESC;

→ 결과:

name salary
Carol 7000
Alice 6000
Eve 5000
Dave 4500
Bob 4000

5. 부서별 인원 수 구하기

편집 원본 편집
SELECT department, COUNT(*) AS count
FROM employees
GROUP BY department;

→ 결과:

department count
IT 3
HR 1
Sales 1

6. 평균 급여가 5000 이상인 부서만 조회

편집 원본 편집
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 5000;

→ 결과:

department avg_salary
IT 6000

7. 상위 3명만 조회

편집 원본 편집
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;

→ 결과:

name salary
Carol 7000
Alice 6000
Eve 5000

오라클 SELECT 문 기본 요소

편집 원본 편집

SQL 개발자 시험은 오라클 문법을 기준으로 출제된다. 아래 예제는 위 employees 테이블에 커미션(comm) 칼럼을 더한 것이다(Alice·Carol·Eve는 NULL, Bob 500, Dave 1000).

  • ALL이 기본값이며 중복 행을 그대로 출력한다. DISTINCT는 SELECT 목록 전체가 같은 행을 하나로 줄인다.
  • DISTINCT는 SELECT 바로 뒤에 한 번만 쓴다. 칼럼이 둘 이상이면 칼럼 조합 기준으로 중복을 없앤다.
SELECT DISTINCT department FROM employees;                                -- HR, IT, Sales (3행)
SELECT COUNT(DISTINCT department), COUNT(ALL department) FROM employees;  -- 3, 5
  • 칼럼 뒤에 AS 별칭을 쓰거나, AS 없이 한 칸 띄우고 별칭을 쓴다.
  • 별칭에 공백·특수문자가 있거나 대소문자를 그대로 살리려면 큰따옴표로 감싼다. 큰따옴표가 없으면 오라클은 대문자로 바꾼다(name Name2 → 칼럼명 NAME2).
  • 별칭은 실행 순서상 SELECT 뒤에 처리되는 ORDER BY에서만 쓸 수 있다. WHERE에서 쓰면 ORA-00904: invalid identifier 오류가 난다(SQL WHERE 절).
SELECT name AS "직원 이름", salary * 12 연봉, salary + comm AS 총액
FROM employees;
직원 이름 연봉 총액
Alice 72000 NULL
Bob 48000 4500
Carol 84000 NULL
Dave 54000 5500
Eve 60000 NULL
  • 산술 연산자(+, -, *, /)에 NULL이 섞이면 결과는 NULL이다. NULL을 0으로 보려면 salary + NVL(comm, 0)처럼 NVL을 쓴다(데이터베이스 Null).
  • 오라클에서 10/4는 2.5이다. 나머지는 % 연산자가 없고 MOD(10, 4) 함수(결과 2)를 쓴다.
구분 오라클 SQL Server
연산자 || +
함수 CONCAT(a, b) (인수 2개) CONCAT(a, b, ...)
NULL 연결 NULL을 빈 문자열처럼 무시한다 +로 NULL을 연결하면 결과가 NULL이다(CONCAT은 NULL을 빈 문자열로 처리)
SELECT name || '(' || department || ')' AS 소속 FROM employees;  -- Alice(IT), Bob(HR), ...
SELECT 'A' || NULL || 'B' FROM DUAL;                              -- AB
  • 오라클이 자동으로 만드는 1행 1칼럼(DUMMY, 값 'X') 테이블이다. 테이블 없이 계산식이나 함수 결과를 볼 때 SELECT 1 + 1 FROM DUAL처럼 쓴다.
  • SQL Server는 FROM 절 없이 SELECT 1 + 1로 쓸 수 있다. 오라클도 23ai부터 FROM 없는 SELECT를 허용하지만, 시험은 FROM DUAL을 쓰는 전통 문법을 기준으로 한다.

LIMIT에 대하여

편집 원본 편집
  • 위 7번 예제의 LIMIT은 MySQL·PostgreSQL 문법이다. 오라클은 ROWNUM이나 FETCH FIRST n ROWS ONLY를, SQL Server는 TOP (n)을 쓴다(Top N 쿼리).
  • DISTINCT는 SELECT 목록 전체 조합의 중복을 없앤다. COUNT(DISTINCT 칼럼)과 COUNT(칼럼)의 차이
  • 별칭은 WHERE·GROUP BY에서 쓸 수 없고 ORDER BY에서는 쓸 수 있다(실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY)
  • 산술 연산에 NULL이 섞이면 NULL, 오라클 || 연결은 NULL을 무시한다
  • 오라클과 SQL Server의 연결 연산자(||와 +) 차이