SQL SELECT 구문
IT 위키
더 많은 작업
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 |
SELECT * FROM employees;
SELECT name, salary FROM employees;
SELECT * FROM employees WHERE department = 'IT';
→ 결과:
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | IT | 6000 |
| 3 | Carol | IT | 7000 |
| 5 | Eve | IT | 5000 |
SELECT name, salary FROM employees ORDER BY salary DESC;
→ 결과:
| name | salary |
|---|---|
| Carol | 7000 |
| Alice | 6000 |
| Eve | 5000 |
| Dave | 4500 |
| Bob | 4000 |
SELECT department, COUNT(*) AS count
FROM employees
GROUP BY department;
→ 결과:
| department | count |
|---|---|
| IT | 3 |
| HR | 1 |
| Sales | 1 |
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 5000;
→ 결과:
| department | avg_salary |
|---|---|
| IT | 6000 |
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;
→ 결과:
| name | salary |
|---|---|
| Carol | 7000 |
| Alice | 6000 |
| Eve | 5000 |
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을 쓰는 전통 문법을 기준으로 한다.
- 위 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의 연결 연산자(
||와+) 차이
- Melton, J., & Simon, A. R. (2002). SQL: 1999 – Understanding Relational Language Components. Morgan Kaufmann.
- Oracle SQL Reference
- Oracle Database SQL Language Reference 19c - SELECT
- Oracle Database SQL Language Reference 19c - Concatenation Operator
- Microsoft Learn - + (String Concatenation) (Transact-SQL)
- PostgreSQL 공식 문서
- MySQL 문서