SELECT 기본
쉽게 말하면
SELECT는 '이 표에서 이 칸들만 보여 줘'라고 부탁하는 문장이에요. FROM 뒤에 표 이름, SELECT 뒤에 보고 싶은 칸을 적어요. *는 모든 칸, DISTINCT는 같은 줄은 한 번만, AS는 칸 이름을 바꿔서 보여 달라는 뜻이에요.
시험용 정의
SELECT는 테이블에서 데이터를 조회하는 문장이다. SELECT 열 목록 FROM 테이블이 기본이고, *는 모든 열, DISTINCT는 중복 행 제거, AS는 열에 별칭 붙이기다. 열 목록 자리에서 산술 연산(+ - * /)과 문자 연결(||)도 할 수 있다.
비유로 이해하기
도서관 사서에게 "책 목록(FROM)에서 제목과 저자만(SELECT) 보여 주세요"라고 하는 것이다. DISTINCT는 "같은 저자는 한 번만", AS는 "제목 칸 이름을 '책 이름'이라고 써 주세요"다.
자세히
그림으로 보기: SELECT 문이 처리되는 순서
- FROM어느 테이블에서(조인 포함)
- WHERE행을 거른다(집계 함수는 못 씀)
- GROUP BY그룹으로 묶는다
- HAVING그룹을 거른다(집계 함수 조건)
- SELECT보여 줄 열과 별칭을 정한다
- ORDER BY정렬한다(SELECT 의 별칭을 쓸 수 있음)
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| EMP·DEPT | 이 페이지의 연습용 테이블. EMP(사원: EMPNO 사번, ENAME 이름, JOB 직무, MGR 관리자 사번, HIREDATE 입사일, SAL 급여, COMM 수당, DEPTNO 부서번호)와 DEPT(부서: DEPTNO, DNAME 부서명, LOC 위치) |
| 별칭(Alias) | 결과에서 열에 붙이는 다른 이름. 원래 테이블의 열 이름은 바뀌지 않는다 |
| DUAL | Oracle이 기본으로 주는 행 하나짜리 테이블. 계산 결과만 보고 싶을 때 SELECT 1+1 FROM DUAL |
| 리터럴 | SQL 문 안에 직접 쓴 값. 문자는 작은따옴표('KIM'), 숫자는 그대로(100) |
SELECT 문법
| 쓰는 법 | 뜻 |
|---|---|
| SELECT * FROM emp | 모든 열 |
| SELECT ename, sal FROM emp | 필요한 열만, 쓴 순서대로 |
| SELECT DISTINCT job FROM emp | 결과에서 중복 행을 없앤다. 여러 열을 쓰면 열 조합 전체가 같을 때만 중복 |
| SELECT sal * 12 AS 연봉 FROM emp | 계산 결과에 별칭. AS는 생략 가능 |
| SELECT sal "월 급여" FROM emp | 공백·특수문자를 넣거나 대소문자를 지키려면 큰따옴표 |
| SELECT ename || '님' FROM emp | 문자 연결. SQL Server는 + 를 쓴다 |
알아 둘 규칙
- SQL 키워드와 열 이름은 대소문자를 구별하지 않는다. 하지만 문자열 값('KIM')은 구별한다
- 문자와 날짜 리터럴은 작은따옴표, 별칭은 큰따옴표
- 별칭은 SELECT보다 늦게 처리되는 ORDER BY에서는 쓸 수 있지만, WHERE에서는 쓸 수 없다
- Oracle은 FROM이 필수라 계산만 할 때 DUAL을 쓴다. SQL Server는 FROM 없이
SELECT 1+1이 된다
시험에 이렇게 나와요
- DISTINCT 위치와 여러 열에 쓸 때의 의미(조합 기준 중복 제거)
- 별칭: AS 생략 가능, 공백 있으면 큰따옴표, WHERE에서는 못 씀
- NULL 산술 = NULL, Oracle || 는 NULL 무시, SQL Server 연결은 +
- 결과 행 수 세기 문제 (DISTINCT 적용 전후)
출제 범위·공식 안내 기반
확인 문제
Q1. SAL이 3000, COMM이 NULL인 사원의 SAL + COMM과 ENAME || COMM 결과는? (Oracle, ENAME은 'CHO')
- 3000, NULL
- 3000, 'CHO'
- NULL, 'CHO'
- NULL, NULL
정답 보기
3번 NULL, 'CHO'
NULL이 들어간 산술 연산은 NULL이다. 반면 Oracle의 || 연결은 NULL을 빈 문자열처럼 다뤄서 'CHO'가 그대로 나온다.
Q2. JOB이 (DEV, DEV, SALES), DEPTNO가 (10, 20, 10)인 3행에서 SELECT DISTINCT job, deptno의 결과 행 수는?
- 1
- 2
- 오류
- 3
정답 보기
4번 3
DISTINCT는 열 조합 전체로 중복을 본다. (DEV,10), (DEV,20), (SALES,10) 모두 달라 3행.
Q3. 별칭에 대한 설명으로 틀린 것은?
- AS는 생략할 수 있다
- ORDER BY 절에서 SELECT 별칭을 쓸 수 있다
- WHERE 절에서 SELECT 별칭을 쓸 수 있다
- 공백이 있는 별칭은 큰따옴표로 감싼다
정답 보기
3번 WHERE 절에서 SELECT 별칭을 쓸 수 있다
WHERE는 SELECT보다 먼저 처리되므로 별칭을 모른다. ORDER BY는 SELECT 뒤라 쓸 수 있다.
Q4. Oracle에서 SELECT 'A' || NULL || 'B' FROM DUAL의 결과는?
- 오류
- NULL
- A B
- AB
정답 보기
4번 AB
Oracle의 || 는 NULL을 빈 문자열처럼 다룬다.
Q5. SQL Server에서 문자열을 이어 붙이는 연산자는?
- +
- .
- ||
- &
정답 보기
1번 +
Oracle은 ||, SQL Server는 +.
Q6. 열 별칭에 공백을 넣으려면?
- 작은따옴표로 감싼다
- 넣을 수 없다
- AS를 두 번 쓴다
- 큰따옴표로 감싼다
정답 보기
4번 큰따옴표로 감싼다
SELECT sal AS "월 급여" 처럼 쓴다.
헷갈리기 쉬운 O·X
SELECT 문에서 문자열 리터럴은 큰따옴표로 감싼다.
정답 보기
X 문자열 리터럴은 작은따옴표, 큰따옴표는 별칭이나 식별자에 쓴다.
SQL 키워드는 대소문자를 구별하지 않지만, 'KIM'과 'kim' 같은 데이터 값은 구별한다.
정답 보기
O WHERE ename = 'kim'은 KIM을 찾지 못한다.
DISTINCT를 쓰면 원래 테이블의 중복 데이터가 삭제된다.
정답 보기
X 조회 결과에서만 중복을 없앤다. 테이블은 그대로다.