DML - SELECT
SELECT 문은 테이블을 구성하는 튜플(행)들 중에서 전체 또는 조건을 만족하는 튜플(행)을 검색하여 주기억장치 상에 임시 테이블로 구성하는 명령문이다.
1. 일반 형식
SELECT PREDICATE [테이블명,]속성명1, [테이블명,]속성명2, ...
FROM 테이블명1, 테이블명2, ...
[WHERE 조건]
[GROUP BY 속성명1, 속성명2, ...]
[HAVING 조건]
[ORDER BY 속성명 [ASC | DESC]];
- SELECT절
> 속성명: 검색하여 불러올 속성(열) 또는 속성을 이용한 수식을 지정
> 기본 테이블을 구성하는 모든 속성을 지정할 때는 '*' 를 기술
> 두 개 이상의 테이블을 대상으로 검색할 때는 '테이블명.속성명' 으로 표현
> PREDICATE: 불러올 튜플 수를 제한할 명령어를 기술
* PREDICATE 옵션
> ALL: 모든 튜플을 검색할 때 지정하는 것으로, 주로 생략
> DISTINCT: 중복된 튜플이 있으면 그 중 첫 번째 한 개만 검색
> DISTINCTROW: 중복된 튜플을 제거하고 한 개만 검색하지만 선택된 속성의 값이 아닌, 튜플 전체를 대상으로 한다.
- FROM절: 질의에 의해 검색될 데이터들을 포함하는 테이블명을 기술
- WHERE절: 검색할 조건을 기술
- GROUP BY절: 특정 속성을 기준으로 그룹화하여 검색할 때 그룹화할 속성을 지정
- 일반적으로 GROUP BY절은 그룹 함수와 함께 사용
- HAVING절: GROUP BY와 함께 사용되며, 그룹에 대한 조건을 지정
- ORDER BY절: 특정 속성을 기준으로 정렬하여 검색할 때 사용
- 속성명: 정렬의 기준이 되는 속성명을 기술
- [ASC | DESC]: 정렬 방식으로서 'ASC'는 오름차순, 'DESC'는 내림차순이다. 생략하면 오름차순으로 지정된다.
* 그룹 함수
릴레이션의 한 열을 요약하거나 집계하는 함수, COUNT, MAX, MIN, SUM, AVG 등이 있다.
* 조건 연산자 / 연산자 우선순위 / 주요 함수
- 조건 연산자
> 비교 연산자
연산자 |
= |
<> |
> |
< |
>= |
<= |
의미 |
같다 |
같지 않다 |
크다 |
작다 |
크거나 같다 |
작거나 같다 |
- 논리 연산자: NOT, AND, OR
NOT |
조건을 만족하지 않을 경우에만 데이터를 추출 |
AND |
두 조건을 모두 만족할 경우에만 데이터를 추출 |
OR |
두 조건 중 하나라도 만족할 경우에 데이터를 추출 |
- LIKE 연산자: 가장 일반적으로 사용되는 문자열에 대한 연산으로, 대표 문자를 이용해 지정된 속성의 값이 문자 패턴과 일치하는 튜플을 검색하기 위해 사용
대표 문자 |
* 또는 % |
? 또는 _ |
# |
의미 |
모든 문자를 대표 |
문자 하나를 대표 |
숫자 하나를 대표 |
* 연산자 우선순위
종류 |
연산자 |
우선순위 |
산술 연산자 |
x, /, +, - |
왼쪽에서 오른쪽으로 갈수록 낮아진다. |
관계 연산자 |
=, <>, >, >=, <, <= |
모두 같다. |
논리 연산자 |
NOT, AND, OR |
왼쪽에서 오른쪽으로 갈수록 낮아진다. |
* 주요 함수
NOW() |
현재 날짜와 시간을 표시 |
DATE() |
현재 날짜를 표시 |
LEFT(문자열, 자릿수) |
문자열의 왼쪽에서 주어진 자릿수만큼 추출 |
MID(문자열, 시작값, 자릿수) |
문자열의 시작 위치에서 주어진 자릿수만큼 추출 |
RIGHT(문자열, 자릿수) |
문자열의 오른쪽에서 주어진 자릿수만큼 추출 |
TRIM(문자열) |
문자열의 좌우 공백을 제거 |
LEN(문자열) |
문자열의 길이를 반환 |
UPPER(문자열) |
문자열을 모두 대문자로 변환 |
LOWER(문자열) |
문자열을 모두 소문자로 변환 |
AVG(필드명) |
필드의 평균을 구한다. |
SUM(필드명) |
필드의 합계를 구한다. |
COUNT(필드명) |
필드의 레코드 수를 구한다. |
MIN(필드명) |
필드의 최솟값을 구한다. |
MAX(필드명) |
필드의 최댓값을 구한다. |
2. 기본 검색
예1) <사원> 테이블의 모든 튜플을 검색하시오.
SELECT * FROM 사원;
SELECT 사원.* FROM 사원;
SELECT 이름, 부서, 생일, 주소, 기본급 FROM 사원;
SELECT 사원, 이름, 사원.부서, 사원.생일, 사원.주소, 사원.기본급 FROM 사원;
예2) <사원> 테이블에서 주소만 검색하되 같은 주소는 한 번만 출력하시오.
SELECT DISTINCT 주소 FROM 사원;
예3) <사원> 테이블에서 기본급에 특별수당 10을 더한 월급을 "XX부서의 XXX의 월급 XXX" 형태로 출력하시오.
SELECT 부서, "부서의", 이름, "의 월급", 기본급+10 FROM 사원;
3. 조건 지정 검색
예4) <사원> 테이블에서 '기획'부의 모든 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 부서='기획';
예5) <사원> 테이블에서 '기획'부에서 근무하면서 '후평동'에 사는 사람의 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 부서='기획' AND 주소='후평동';
예6) <사원> 테이블에서 부서가 '기획'이거나 '인터넷'인 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 부서='기획' OR 부서='인터넷';
예7) <사원> 테이블에서 성이 '김'인 사람의 튜플을 검색하시오.
SELETE * FROM 사원 WHERE 이름 LIKE '김%';
예8) <사원> 테이블에서 생일이 '01/09/69'에서 '10/22/73' 사이인 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 생일 BETWEEN '01/09/69' AND '10/22/73';
예9) <사원> 테이블에서 주소가 NULL인 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 주소 IS NULL;
4. 정렬 검색
예10) <사원> 테이블에서 주소를 기준으로 오름차순 정렬해서 검색하시오.
SELECT * FROM 사원 ORDER BY 주소 ASC;
예11) <사원> 테이블에서 '부서'를 기준으로 오름차순 정렬하고, 같은 부서에 대해서는 '이름'을 기준으로 내림차순 정렬해서 검색하시오.
SELECT * FROM 사원 ORDER BY 부서 ASC, 이름 DESC;
5. 그룹 지정 검색
예12) <사원> 테이블에서 부서별 기본급의 평균을 구하시오.
SELECT 부서, AVG(기본급) AS 평균 FROM 사원 GROUP BY 부서;
예13) <사원> 테이블에서 부서별 튜플 수를 검색하시오.
SELECT 부서, COUNT(*) AS 사원수 FROM 사원 GROUP BY 부서;
예14) <사원> 테이블에서 기본급이 100 이상인 사원이 2명 이상인 부서의 튜플 수를 구하시오.
SELECT 부서, COUNT(*) AS 사원수 FROM 사원 WHERE 기본급 >= 100
GROUP BY 부서 HAVING COUNT(*) >=2;
6. 하위 질의
* 하위 질의
조건절에 주어진 질의를 먼저 수행하여 그 검색 결과를 조건절의 피연산자로 사용한다.
예15) 취미가 '나이트댄스' 인 사원의 이름과 주소를 검색하시오.
SELECT 이름, 주소 FROM 사원 WHERE 이름= (SELECT 이름 FROM 여가활동 WHERE 취미='나이트댄스');
예16) 취미활동을 하지 않는 사원들을 검색하시오.
SELECT * FROM 사원 WHERE 이름 NOT IN (SELECT 이름 FROM 여가활동);
7. 복수 테이블 검색
예17) 경력이 10년 이상인 사원의 이름, 부서, 취미, 경력을 검색하시오.
SELECT 사원.이름, 사원.부서, 여가활동.취미, 여가활동.경력 FROM 사원, 여가활동
WHERE 여가활동.경력 >=10 AND 사원.이름 = 여가활동 = 이름;
8. 통합(UNION) 질의
예18) 사원들의 명단이 <사원> 테이블과 <직원> 테이블에 저장되어 있다. 두 테이블을 통합하는 질의문을 작성하시오. 단, 같은 레코드가 두 번 나오지 않게 하시오.
SELECT * FROM 사원 UNION SELECT * FORM 직원;
<사원>
사원 |
직급 |
김형석 |
대리 |
홍영선 |
과장 |
류기선 |
부장 |
김현천 |
이사 |
<직원>
사원 |
직급 |
신원섭 |
이사 |
이성호 |
대리 |
홍영선 |
과장 |
류기선 |
부장 |