일반 형식
SELECT [PREDICATE] [테이블명.]속성명 [AS 별칭][, [테이블명.]속성명, ...]
[그룹함수(속성명) [AS 별칭]]
[, Window함수 OVER (PARTITION BY 속성명1, 속성명2, ...
ORDER BY 속성명3, 속성명4, ...)]
FROM 테이블명[, 테이블명, ...]
[WHERE 조건]
[GROUP BY 속성명, 속성명, ...]
[HAVING 조건]
[ORDER BY 성명 [ASC | DESC]];
- SELECT절
- PREDICATE: 불러올 튜플 수를 제한할 명령어를 기술한다.
▶ ALL: 모든 튜플을 검색할 때 지정하는 것으로, 주로 생략한다.
▶ DISTINCT: 중복된 튜플이 있으면 그 중 첫 번째 한 개만 검색한다.
▶ DISTINCTROW: 중복된 튜플을 제거하고 한 개만 검색하지만 선택된 속성의 값이 아닌, 튜플 전체를 대상으로 한다.
- 속성명: 검색하여 불러올 속성(열) 또는 속성을 이용한 수식을 지정한다.
▶ 기본 테이블을 구성하는 모든 속성을 지정할 때는 '*'를 기술한다.
▶ 두 개 이상의 테이블을 대상으로 검색할 때는 '테이블명.속성명'으로 표현 한다.
- AS: 속성 및 연산의 이름을 다른 제목으로 표시하기 위해 사용된다.
- FROM절: 질의에 의해 검색될 데이터들을 포함하는 테이블명을 기술한다.
- WHERE절: 검색할 조건을 기술한다.
- ORDER BY절: 특정 속성을 기준으로 정렬하여 검색할 때 사용한다.
- 속성명: 정렬의 기준이 되는 속성명을 기술한다.
- [ASC | DESC]: 정렬 방식으로서 'ASC'는 오름차순, 'DESC'는 내림차순이다. 생략하면 오름차순으로 지정된다.
조건 연산자 / 연산자 우선순위
- 조건 연산자
연산자 | 의미 |
---|
= | 같다 |
<> | 같지 않다 |
> | 크다 |
< | 작다 |
>= | 크거나 같다 |
<= | 작거나 같다 |
- 논리 연산자: NOT, AND, OR
- LUKE 연산자: 대표 문자를 이용해 지정된 속성의 값이 문자 패턴과 일치하는 튜플을 검색하기 위해 사용됩니다.
대표 문자 | 의미 |
---|
% | 모든 문자를 대표함 |
_ | 문자 하나를 대표함 |
# | 숫자 하나를 대표함 |
- 연산자 우선순위
종류 | 연산자 | 우선순위 |
---|
산술 연산자 | x,/,+,- | 왼쪽에서 오른쪽으로 갈수록 낮아집니다. |
관계 연산자 | =,<>,>,>=,<,<= | 모두 같습니다. |
논리 연산자 | NOT, AND, OR | 왼쪽에서 오른쪽으로 갈수록 낮아집니다. |
※ 산술, 관계, 논리 연산자가 함께 사용되었을 때는 산술 > 관계 > 논리 연산자 순서로 연산자 우선순위가 정해집니다.
- 다음과 같은 기본 테이블에 대해 다음 예제의 결과를 확인하시오.
<사원>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
홍길동 | 기획 | 04/05/61 | 망원동 | 120 |
임꺽정 | 인터넷 | 01/09/69 | 서교동 | 80 |
황진이 | 편집 | 07/21/75 | 합정동 | 100 |
김선달 | 편집 | 10/22/73 | 망원동 | 90 |
성춘향 | 기획 | 02/20/64 | 대흥동 | 100 |
장길산 | 편집 | 03/11/67 | 상암동 | 120 |
일지매 | 기획 | 04/29/78 | 연남동 | 110 |
강건달 | 인터넷 | 12/11/80 | | 90 |
<여가활동>
이름 | 취미 | 경력 |
---|
김선달 | 당구 | 10 |
성춘향 | 나이트댄스 | 5 |
일지매 | 태껸 | 15 |
임꺽정 | 씨름 | 8 |
기본 검색
- SELECT 절에 원하는 속성을 지정하여 검색한다.
- 예제 1: <사원> 테이블의 모든 튜플을 검색하시오.
• SELECT * FROM 사원;
• SELECT 사원.* FROM 사원;
• SELECT 이름, 부서, 생일, 주소, 기본급 FROM 사원;
• SELECT 사원.이름 사원.부서 사원.생일 사원.주소 사원.기본급 FROM 사원;
※ 위의 SQL은 모두 보기에 주어진 <사원> 테이블 전체를 그대로 출력한다.
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
홍길동 | 기획 | 04/05/61 | 망원동 | 120 |
임꺽정 | 인터넷 | 01/09/69 | 서교동 | 80 |
황진이 | 편집 | 07/21/75 | 합정동 | 100 |
김선달 | 편집 | 10/22/73 | 망원동 | 90 |
성춘향 | 기획 | 02/20/64 | 대흥동 | 100 |
장길산 | 편집 | 03/11/67 | 상암동 | 120 |
일지매 | 기획 | 04/29/78 | 연남동 | 110 |
강건달 | 인터넷 | 12/11/80 | | 90 |
- 예제 2: <사원> 테이블에서 주소만 검색하되 같은 '주소'는 한 번만 출력하시오.
SELECT DISTINCT 주소
FROM 사원;
<결과>
- 예제 3: <사원> 테이블에서 '기본급'에 특별수당 10을 더한 월급을 "XX부서의 XXX의 월급 XXX" 형태로 출력하시오.
SELECT 부서 + '부서의' AS 부서2.이름 +'의 월급' AS 이름2.기본급 + 10 AS 기본급2
FROM 사원;
<결과>
부서2 | 이름2 | 기본급2 |
---|
기획부서의 | 홍길동의 월급 | 130 |
인터넷부서의 | 임꺽정의 월급 | 90 |
편집부서의 | 황진이의 월급 | 110 |
편집부서의 | 김선달의 월급 | 100 |
기획부서의 | 성춘향의 월급 | 110 |
편집부서의 | 장길산의 월급 | 130 |
기획부서의 | 일지매의 월급 | 120 |
인터넷부서의 | 강건달의 월급 | 100 |
조건 지정 검색
- WHERE절에 조건을 지정하여 조건에 만족하는 튜플만 검색한다.
- 예제 1: <사원> 테이블에서 '기획'부의 모든 튜플을 검색하시오.
SELECT *
FROM 사원
WHERE 부서 = '기획';
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
홍길동 | 기획 | 04/05/61 | 망원동 | 120 |
성춘향 | 기획 | 02/20/64 | 대흥동 | 100 |
일지매 | 기획 | 04/29/78 | 연남동 | 110 |
- 예제 2: <사원> 테이블에서 "기획" 부서에 근무하면서 "대흥동"에 사는 사람의 튜플을 검색하시오.
SELECT *
FROM 사원
WHERE 부서 = '기획' AND 주소 = '대흥동';<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
성춘향 | 기획 | 02/20/64 | 대흥동 | 100 |
- 예제 3: <사원> 테이블에서 부서가 "기획"이거나 "인터넷"인 튜플을 검색하시오.
SELECT *
FROM 사원
WHERE 부서 = '기획' OR 부서 = '인터넷';
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
홍길동 | 기획 | 04/05/61 | 망원동 | 120 |
임꺽정 | 인터넷 | 01/09/69 | 서교동 | 80 |
성춘향 | 기획 | 02/20/64 | 대흥동 | 100 |
일지매 | 기획 | 04/29/78 | 연남동 | 110 |
강건달 | 인터넷 | 12/11/80 | | 90 |
- 예제 4: <사원> 테이블에서 성이 '김'인 사람의 튜플을 검색하시오.
SELECT *
FROM 사원
WHERE 이름 LIKE '김%';
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
김선달 | 편집 | 10/22/73 | 망원동 | 90 |
- 예제 5: <사원> 테이블에서 '생일'이 '01/01/69'에서 '12/31/73' 사이인 튜플을 검색하시오.
SELECT *
FROM 사원
WHERE 생일 BETWEEN #01/01/69# AND #12/31/73#;
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
임꺽정 | 인터넷 | 01/09/69 | 서교동 | 80 |
김선달 | 편집 | 10/22/73 | 망원동 | 90 |
- 예제 6: <사원> 테이블에서 '주소'가 NULL인 튜플을 검색하시오.
SELECT *
FROM 사원
WHERE 주소 IS NULL;
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
강건달 | 인터넷 | 12/11/80 | | 90 |
정렬 검색
- ORDER BY 절에 특정 속성을 지정하여 지정된 속성으로 자료를 정렬하여 검색한다.
- 예제 1: <사원> 테이블에서 '주소'를 기준으로 내림차순 정렬시켜 상위 2개 튜플만 검색하시오.
SELECT TOP 2 *
FROM 사원
ORDER BY 주소 DESC;
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
황진이 | 편집 | 07/21/75 | 합정동 | 100 |
일지매 | 기획 | 04/29/78 | 연남동 | 110 |
- 예제 2: <사원> 테이블에서 '부서'를 기준으로 오름차순 정렬하고, 같은 '부서'에 대해서는 '이름'을 기준으로 내림차순 정렬시켜서 검색하시오.
SELECT *
FROM 사원
ORDER BY 부서 ASC, 이름 DESC;
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
홍길동 | 기획 | 04/05/61 | 망원동 | 120 |
일지매 | 기획 | 04/29/78 | 연남동 | 110 |
성춘향 | 기획 | 02/20/64 | 대흥동 | 100 |
임꺽정 | 인터넷 | 01/09/69 | 서교동 | 80 |
강건달 | 인터넷 | 12/11/80 | | 90 |
황진이 | 편집 | 07/21/75 | 합정동 | 100 |
장길산 | 편집 | 03/11/67 | 상암동 | 120 |
김선달 | 편집 | 10/22/73 | 망원동 | 90 |
하위 질의
- 하위 질의는 조건절에 주어진 질의를 먼저 수행하여 그 검색 결과를 조건절의 피연산자로 사용한다.
- 예제 1: '취미'가 "나이트댄스"인 사원의 '이름'과 '주소'를 검색하시오.
SELECT 이름, 주소
FROM 사원
WHERE 이름 = (SELECT 이름 FROM 여가활동 WHERE 취미 = '나이트댄스'):
<결과>
- 예제 2: 취미활동을 하지 않는 사원들을 검색하시오.
SELECT *
FROM 사원
WHERE 이름 NOT IN (SELECT 이름 FROM 여가활동);
<결과>
이름 | 부서 | 생일 | 주소 | 기본급 |
---|
홍길동 | 기획 | 04/05/61 | 망원동 | 120 |
황진이 | 편집 | 07/21/75 | 합정동 | 100 |
장길산 | 편집 | 03/11/67 | 상암동 | 120 |
강건달 | 인터넷 | 12/11/80 | | 90 |
- 예제 3: 취미활동을 하는 사원들의 부서를 검색하시오.
SELECT 부서
FROM 사원
WHERE EXISTS (SELECT 이름 FROM 여가활동 WHERE 여가활동.이름 = 사원.이름);
<결과>
복수 테이블 검색
- 여러 테이블을 대상으로 검색을 수행한다.
- 예제: '경력'이 10년 이상인 사원의 '이름', '부서', '취미', '경력'을 검색하시오.
SELECT 사원.이름, 사원.부서 여가활동.취미, 여가활동.경력
FROM 사원, 여가활동
WHERE 여가활동.경력 >= 10 AND 사원.이름 = 여가활동.이름;
<결과>
이름 | 부서 | 취미 | 경력 |
---|
김선달 | 편집 | 당구 | 10 |
일지매 | 기획 | 태껸 | 15 |