121. DML - SELECT-1
121.1 일반 형식
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 : 검색할 튜플 수를 제한하는 명령어를 기술
- DISTINCT : 중복된 튜플이 있으면 그 중 첫 번째 한개만 표시
- 속성명 : 검색하여 불러올 속성(열) 또는 속성을 이용한 수식을 지정
- AS : 속성이나 연산의 이름을 다른 이름으로 표시하기 위해 사용
- FROM절 : 검색할 데이터가 들어있는 테이블 이름을 기술
- WHERE절 : 검색할 조건을 기술
- ORDER BY절 : 데이터를 정렬하여 검색할 때 사용
- 속성명 : 정렬의 기준이 되는 속성명을 기술
- [ASC | DESC] : 정렬 방식으로, 'ASC'는 오름차순, 'DESC'는 내림차순
121.2 조건 연산자
연산자 |
의미 |
= |
같다 |
<> |
같지 않다 |
> |
크다 |
< |
작다 |
>= |
크거나 같다 |
<= |
작거나 같다 |
- 논리 연산자 : NOT, AND, OR
- LIKE 연산자 : 대표 문자를 이용해 지정된 속성의 값이 문자 패턴과 일치하는 튜플을 검색하기 위해 사용됨
대표 문자 |
의미 |
% |
모든 문자를 대표함 |
_ |
문자 하나를 대표함 |
# |
숫자 하나를 대표함 |
- 다음과 같은 기본 테이블에 대해 다음 예제의 결과를 확인하라.
- <사원> 테이블
이름 |
부서 |
생일 |
주소 |
기본급 |
홍길동 |
기획 |
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 |
121.3 기본 검색
- SELECT 절에 원하는 속성을 지정하여 검색
121.3.1 예제 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 |
121.3.2 예제 2
- <사원> 테이블에서 '주소'만 검색하되 같은 '주소'는 한 번만 출력하라
SELECT DISTINCT 주소
FROM 사원;
주소 |
대흥동 |
망원동 |
상암동 |
서교동 |
연남동 |
합정동 |
121.3.3 예제 3
- <사원> 테이블에서 '기본급'에 특별수당 10을 더한 월급을 "XX부서의 XXX의 월급 XXX" 형태로 출력하라
SELECT 부서+'부서의' AS 부서2, 이름+'의 월급' AS 이름2, 기본급+10 AS 기본급2
FROM 사원;
- 부서+'부서의' AS 부서2 : '부서'에 "부서의"를 연결하여 표시하되, '부서2'라는 속성명으로 표시
- 결과
부서2 |
이름2 |
기본급2 |
기획부서의 |
홍길동의 월급 |
130 |
인터넷부서의 |
임꺽정의 월급 |
90 |
편집부서의 |
황진이의 월급 |
110 |
편집부서의 |
김선달의 월급 |
100 |
기획부서의 |
성춘향의 월급 |
110 |
편집부서의 |
장길산의 월급 |
130 |
기획부서의 |
일지매의 월급 |
120 |
인터넷부서의 |
강길산의 월급 |
100 |
121.4 조건 지정 검색
WHERE 절에 조건을 지정하여 조건에 만족하는 튜플만 검색하라
121.4.1 예제 1
- <사원> 테이블에서 '기획'부의 모든 튜플을 검색
SELECT *
FROM 사원
WHERE 부서='기획';
이름 |
부서 |
생일 |
주소 |
기본급 |
홍길동 |
기획 |
04/05/61 |
망원동 |
120 |
성춘향 |
기획 |
02/20/64 |
대흥동 |
100 |
일지매 |
기획 |
04/29/78 |
연남동 |
110 |
121.4.2 예제 2
- <사원> 테이블에서 '기획'부서에 근무하면서 '대흥동'에 사는 사람의 튜플을 검색하라
SELECT *
FROM 사원
WHERE 부서='기획' AND 주소='대흥동';
이름 |
부서 |
생일 |
주소 |
기본급 |
성춘향 |
기획 |
02/20/64 |
대흥동 |
100 |
121.4.3 예제 3
- <사원> 테이블에서 '부서'가 '기획'이거나 '인터넷'인 튜플을 검색하라
SELECT * FROM 사원 WHERE 부서='기획' OR 부서='인터넷';
SELECT * FROM 사원 WHERE 부서 IN ('기획', '인터넷');
이름 |
부서 |
생일 |
주소 |
기본급 |
홍길동 |
기획 |
04/05/61 |
망원동 |
120 |
임꺽정 |
인터넷 |
01/09/69 |
서교동 |
80 |
성춘향 |
기획 |
02/20/64 |
대흥동 |
100 |
일지매 |
기획 |
04/29/78 |
연남동 |
110 |
강길산 |
인터넷 |
12/11/80 |
|
90 |
121.4.4 예제 4
- <사원> 테이블에서 성이 '김'인 사람의 튜플을 검색하라
SELECT *
FROM 사원
WHERE 이름 LIKE "김%";
이름 |
부서 |
생일 |
주소 |
기본급 |
김선달 |
편집 |
10/22/73 |
망원동 |
90 |
121.4.5 예제 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 |
121.4.6 예제 6
- <사원> 테이블에서 '주소'가 NULL인 튜플을 검색하라
SELECT *
FROM 사원
WHERE 주소 IS NULL;
- NULL이 아닌 값을 검색할 때는 IS NOT NULL 사용
- 결과
이름 |
부서 |
생일 |
주소 |
기본급 |
강길산 |
인터넷 |
12/11/80 |
|
90 |
121.5 정렬 검색
ORDER BY 절에 특성 속성을 지정하여 지정된 속성으로 자료를 정렬하여 검색
121.5.1 예제 1
- <사원> 테이블에서 '주소'를 기준으로 내림차순 정렬시켜 상위 2개 튜플만 검색하라
SELECT TOP 2 *
FROM 사원
ORDER BY 주소 DESC;
이름 |
부서 |
생일 |
주소 |
기본급 |
황진이 |
편집 |
07/21/75 |
합정동 |
100 |
일지매 |
기획 |
04/29/78 |
연남동 |
110 |
121.5.2 예제 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 |
121.6 하위 질의
조건절에 주어진 질의를 먼저 수행하여 그 검색 결과를 조건절의 피연산자로 사용
121.6.1 예제 1
- '취미'가 '나이트댄스'인 사원의 '이름'과 '주소'를 검색하라
SELECT 이름, 주소
FROM 사원
WHERE 이름=(SELECT 이름 FROM 여가활동 WHERE 취미='나이트댄스');
121.6.2 예제 2
SELECT *
FROM 사원
WHERE 이름 NOT IN (SELECT 이름 FROM 여가활동);
이름 |
부서 |
생일 |
주소 |
기본급 |
홍길동 |
기획 |
04/05/61 |
망원동 |
120 |
황진이 |
편집 |
07/21/75 |
합정동 |
100 |
장길산 |
편집 |
03/11/67 |
상암동 |
120 |
강길산 |
인터넷 |
12/11/80 |
|
90 |
121.6.3 예제 3
SELECT 부서
FROM 사원
WHERE EXISTS (SELECT 이름 FROM 여가활동 WHERE 여가활동.이름=사원.이름);
- EXISTS ( ) : 하위 질의로 검색된 결과가 존재하는지 확인할 때 사용
- EXISTS (SELECT 이름 FROM 여가활동 WHERE 여가활동.이름=사원.이름) : <사원> 테이블의 '이름'이 <여가활동> 테이블의 '이름'에도 있는지 확인
- 결과
121.7 복수 테이블 검색
여러 테이블을 대상으로 검색을 수행
121.7.1 예제
- '경력'이 10년 이상인 사원의 '이름', '부서', '취미', '경력'을 검색하라
SELECT 사원.이름, 사원.부서, 여가활동.취미, 여가활동.경력
FROM 사원, 여가활동
WHERE 여가활동.경력>=10 AND 사원.이름=여가활동.이름;
이름 |
부서 |
취미 |
경력 |
김선달 |
편집 |
당구 |
10 |
일지매 |
기획 |
태껸 |
15 |