티스토리 뷰
★★ DML - SELECT의 개요
SELECT 문 : 테이블을 구성하는 튜플(행)들 중에서 전체 또는 조건을 만족하는 튜플(행)을 검색하여 주기억장치 상에 임시 테이블로 구성하는 명령문
일반 형식
1 2 3 4 5 6 | SELECT Predicate [ 테이블명 ].속성명1, [ 테이블명. ]속성명2, … FROM 테이블명1, 테이블명2, … [ WHERE 조건 ] [ GROUP BY 속성명1, 속성명2, … ] [ HAVING 조건 ] [ ORDER BY 속성명 [ ASC | DESC ] ]; | cs |
SELECT절
- 속성명 : 검색하여 불러올 속성(열) 또는 속성을 이용한 수식을 지정
- 기본 테이블을 구성하는 모든 속성을 지정할 때는 '*'를 기술한다
- 두 개 이상의 테이블을 대상으로 검색할 때는 '테이블 명·속성 명'으로 표현한다
- Predicate : 불러올 튜플 수를 제한할 명령어를 기술(ALL, DISTINCT, DISTINCTROW)
* ALL : 모든 튜플을 검색할 때 지정하는 것으로, 주로 생략
* DISTINCT : 중복된 튜플이 있으면 그 중 첫 번째 한 개만 검색
* DISTINCTROW : 중복된 튜플을 제거하고 한 개만 검색하지만 선택된 속성의 값이 아닌, 튜플 전체를 대상으로 한다
FROM절 : 질의에 의해 검색될 ㅔ이터들을 포함하는 테이블 명을 기술함
WHERE절 : 검색할 조건을 기술함
- 조건 연산자
* 비교 연산자 : =(같다), <>(같지 않다), >(크다), >=(크거나 같다), <(작다), <=(작거나 같다), IN(포함되어 있다)
* 논리 연산자 : NOT, AND, OR
* LIKE : 대표 문자를 이용해 지정된 속성의 값이 문자 패턴과 일치하는 튜플만 검색
- * 또는 % : 모든 문자를 대표
- ? 또는 _ : 한 자리 문자를 대표
- # : 한 자리 숫자를 대표
GROUP BY절
- 특정 속성을 기준으로 그룹호하여 검색할 때 그룹화할 속성을 지정함
- 일반적으로 GROUP BY절은 그룹 함수와 함께 사용됨
* 그룹 함수의 종류
- COUNT(속성명) : 그룹별 튜플 수를 구하는 함수
- MAX(속성명) : 그룹별 최대값을 구하는 함수
- MIN(속성명) : 그룹별 최소값을 구하는 함수
- SUM(속성명) : 그룹별 합계를 구하는 함수
- AVG(속성명) : 그룹별 평균을 구하는 함수
HAVING절 : GROUP BY와 함께 사용되며, 그룹에 대한 조건을 지정함
ORDER BY절 : 특정 속성을 기준으로 정렬하여 검색할 때 사용함
- 속성명 : 정렬의 기준이 되는 속셩 명은 기술함
- [ ASC | DESC ] : 정렬 방식으로서 ASC는 오름차순, 'DESC'는 내림차순
- 생략하면 오름차순으로 지정됨
문제
- 다음과 같은 기본 테이블에 대해 다음 문제의 결과를 확인하세요
<사원> |
<여가 활동> |
|||||||
이름 |
부서 |
생일 |
주소 |
기본급 |
이름 |
취미 |
경력 |
|
홍길동 |
기획 |
04/05/61 |
효자동 |
120 |
김선달 |
당구 |
10 |
|
임꺽정 |
인터넷 |
01/09/69 |
석사동 |
80 |
성춘향 |
나이트댄스 |
5 |
|
황진이 |
편집 |
07/21/75 |
후평동 |
100 |
일지매 |
태껸 |
15 |
|
김선달 |
편집 |
10/23/73 |
효자동 |
90 |
임꺽정 |
씨름 |
8 |
|
성춘향 |
기획 |
02/20/64 |
후평동 |
100 |
||||
장길산 |
편집 |
03/11/67 |
고진동 |
120 |
||||
일지매 |
기획 |
04/29/78 |
원곡동 |
110 |
||||
강건달 |
인터넷 |
12/11/80 |
90 |
기본 검색
문제 1
- <사원> 테이블의 모든 튜플을 검색하시오
|
|
||||||
|
|
※ 위의 SQL은 모두 보기에 주어진 <사원> 테이블 전체를 그대로 출력합니다.
문제 2
- <사원> 테이블에서 주소만 검색하되 같은 주소는 한 번만 출력하시오.
|
주소 | |||||||
효자동 | ||||||||
석사동 | ||||||||
후평동 | ||||||||
고잔동 | ||||||||
원곡동 | ||||||||
|
문제 3
- <사원> 테이블에서 기본급에 특별수당 10을 더한 월급을 "XX 부서의 XXX의 월급 XXX" 형태로 출력하시오
1 2 | select 부서, "부서의", 이름, "의 월급", 기본급 + 10 from 사원; | cs |
부서 |
이름 | 기본급 |
||
기획 |
부서의 |
홍길동 | 의 월급 |
130 |
인터넷 |
부서의 |
임꺽정 | 의 월급 |
90 |
편집 |
부서의 |
황진이 | 의 월급 |
110 |
편집 |
부서의 |
김선달 | 의 월급 |
100 |
기획 |
부서의 |
성춘향 | 의 월급 |
110 |
편집 |
부서의 |
장길산 | 의 월급 |
130 |
기획 |
부서의 |
일지매 | 의 월급 |
120 |
인터넷 |
부서의 |
강건달 | 의 월급 |
100 |
조건 지정 검색
문제 1
- <사원> 테이블에서 '기획'부의 모든 튜플을 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
홍길동 |
기획 |
04/05/61 |
효자동 |
120 |
||||
성춘향 |
기획 |
02/20/64 |
후평동 |
100 |
||||
일지매 |
기획 |
04/29/78 |
원곡동 |
110 |
문제 2
- <사원> 테이블에서 '기획'부에서 근무하면서 '후평동'에 사는 사람의 튜플을 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
성춘향 |
기획 |
02/20/64 |
후평동 |
100 |
※ 연산자 우선순위
- 산술( ×, /, +, -), 관계(=, >, <, >=, …), 논리(NOT, AND, OR), 연산자가 같이 있을 때는 산술 > 관계 > 논리 연산자 순으로 연산자 우선순위가 정해진다
문제 3
- <사원> 테이블에서 부서가 '기획'이거나 '인터넷'인 튜플을 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
홍길동 |
기획 |
04/05/61 |
효자동 |
120 |
||||
임꺽정 |
인터넷 |
01/09/69 |
석사동 |
80 |
||||
성춘향 |
기획 |
02/20/64 |
후평동 |
100 |
||||
일지매 |
기획 |
04/29/78 |
원곡동 |
110 |
||||
강건달 |
인터넷 |
12/11/80 |
90 |
- 다음과 같이 검색해도 된다
1 2 3 | SELECT * FROM 사원 WHERE 부서 IN ('기획', '인터넷'); | cs |
문제 4
- <사원> 테이블에서 성이 '김'인 사람의 튜플을 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
김선달 |
편집 |
10/22/73 |
효자동 |
90 |
문제 5
- <사원> 테이블에서 생일이 '01/09/69'에서 '10/22/73' 사이인 튜플을 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
임꺽정 |
인터넷 |
01/09/69 |
석사동 |
80 |
||||
김선달 |
편집 |
10/22/73 |
효자동 |
90 |
문제 6
- <사원> 테이블에서 주소가 NULL인 튜플을 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
강건달 |
인터넷 |
12/11/80 |
90 |
- NULL이 아닌 값을 검색할 때는 IS NOT NULL을 사용한다
* 예) <사원> 테이블에서 주소가 NULL이 아닌 튜플 검색
1 2 3 | SELECT * FROM 사원 WHERE 주소 IS NOT NULL; | cs |
정렬 검색
문제 1
- <사원> 테이블에서 주소를 기준으로 오름차순 정렬시켜서 상위 2개의 튜플만 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
장길산 |
편집 |
03/11/67 |
고잔동 |
120 |
||||
임꺽정 |
인터넷 |
01/09/69 |
석사동 |
80 |
문제 2
- <사원> 테이블에서 '부서'를 기준으로 오름차순 정렬하고, 같은 부서에 대해서는 '이름'을 기준으로 내림차순 정렬시켜서 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
홍길동 |
기획 |
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 |
효자동 |
60 |
그룹지정 검색
문제 1
- <사원> 테이블에서 부서별 기본급의 평균을 구하시오
|
부서 |
평균 |
|||
기획 |
110 |
||||
인터넷 |
85 |
||||
편집 |
103.3 |
- GROUP BY 절이 그룹을 지정한다
- 그룹에 대한 조건을 지정할 때는 WHERE가 아닌 HAVING을 사용한다
- AVG(기본급) AS 평균 : '기본급' 속성에 있는 값들의 평균을 구하되 '평균'이라는 속성명으로 표시
문제 2
- <사원> 테이블에서 부서별 튜플 수를 검색하시오
|
부서 |
사원수 |
|||
기획 |
3 |
||||
인터넷 |
2 |
||||
편집 |
3 |
문제 3
- <사원> 테이블에서 기본급이 100 이상인 사원이 2명 이상인 부서의 튜플 수를 구하시오
|
부서 |
사원수 |
|||
기획 |
3 |
||||
편집 |
2 |
- "WHERE 기본급 >= 100" 절에 의해서 기본급이 100 이상 되는 자료만 거색 대상이 된다
- "GROUP BY 부서" 절에 의해서 기본급이 100 이상 되는 자료에 대해서만 부서별로 그룹을 지정
- "HAVING COUNT(*) >= 2" 절에 의해서 부서의 인원이 2 이상인 부서의 인원만 검색
문제 1
- 취미가 '나이트댄스'인 사원의 이름과 주소를 검색하시오
|
이름 |
주소 |
|||
성춘향 |
후평동 |
- "SELECT 이름 FROM 여가활동 WHERE 취미 = '나이트댄스'" 를 수행하여 <여가활동> 테이블에서 '성춘향을 찾는다
- 하위 질의에 해당하는 피연산자의 자리에 '성춘향'을 대입하면 질의문은 "SELECT 이름, 주소 FROM 사원 WHERE 이름 = '성춘향'과 같다
문제 2
- 취미 활동을 하지 않는 사원들을 검색하시오
|
이름 |
부서 |
생일 |
주소 |
기본급 |
|||
홍길동 |
기획 |
04/05/61 |
효자동 |
120 |
||||
황진이 |
편집 |
07/21/75 |
후평동 |
100 |
||||
장길산 |
편집 |
03/11/67 |
고잔동 |
120 |
||||
강건달 |
인터넷 |
12/11/80 |
90 |
- NOT IN( ) : NOT IN( )은 포함되지 않는 데이터를 의미. <사원> 테이블에서 모든 자료를 검색하는데, <여가활동> 테이블에 이름이 있는 자료는 제외하고 검색함
복수 테이블 검색
문제
- 경력이 10년 이상인 사원의 이름, 부서, 취미, 경력을 검색하시오
|
이름 |
부서 |
취미 |
경력 |
|||
김선달 |
편집 |
당구 |
10 |
||||
일지매 |
기획 |
태껸 |
15 |
문제
- 사원들의 명단이 <사원> 테이블과 <직원> 테이블에 저장되어 있다. 두 테이블을 통합하는 질의문을 작성하시오. 단, 같은 레코드가 두 번 나오지 않게 하시오
<사원> |
<직원> | ||||||
사원 |
직급 |
사원 | 직급 | ||||
김형석 |
대리 |
신원섭 | 이사 | ||||
홍영선 |
과장 |
이성호 | 대리 | ||||
류기선 |
부장 |
홍영선 | 과장 | ||||
김현천 |
이사 |
류기선 | 부장 |
|
직원 | 직급 | ||||||||||
김현천 | 이사 | |||||||||||
김형석 | 대리 | |||||||||||
류기선 | 부장 | |||||||||||
신원섭 | 이사 | |||||||||||
이성호 | 대리 | |||||||||||
홍영선 | 과장 |