티스토리 뷰

★★ 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

  - <사원> 테이블의 모든 튜플을 검색하시오


 

1
2
Select *
From 사원;
cs

 

1
2
Select 사원.*
From 사원;
cs

 

1
2
Select 이름, 부서, 생일, 주소, 기본급
From 사원;
cs
1
2
Select 사원.이름, 사원.부서, 사원.생일, 사원.주소, 사원.기본급
From 사원;
cs



※ 위의 SQL은 모두 보기에 주어진 <사원> 테이블 전체를 그대로 출력합니다.


 문제 2

  - <사원> 테이블에서 주소만 검색하되 같은 주소는 한 번만 출력하시오.


 

1
2
select Distinct 주소
from 사원;
cs

주소

   


효자동

   


석사동

   


후평동

   


고잔동

   


원곡동

   


 

   




 문제 3

  - <사원> 테이블에서 기본급에 특별수당 10을 더한 월급을 "XX 부서의 XXX의 월급 XXX" 형태로 출력하시오


1
2
select 부서, "부서의", 이름, "의 월급", 기본급 + 10
from 사원;
cs


부서


이름


기본급

기획

부서의

홍길동

의 월급

130

인터넷

부서의

임꺽정

의 월급

90

편집

부서의

황진이

의 월급

110

편집

부서의

김선달

의 월급

100

기획

부서의

성춘향

의 월급

110

편집

부서의

장길산

의 월급

130

기획

부서의

일지매

의 월급

120

인터넷

부서의

강건달

의 월급

100



조건 지정 검색

 문제 1

  - <사원> 테이블에서 '기획'부의 모든 튜플을 검색하시오


 

1
2
3
selecct *
from 사원
where 부서='기획';
cs

이름

부서

생일

주소

기본급

홍길동

기획

04/05/61

효자동

120

성춘향

기획

02/20/64

후평동

100

일지매

기획

04/29/78

원곡동

110


 문제 2

  - <사원> 테이블에서 '기획'부에서 근무하면서 '후평동'에 사는 사람의 튜플을 검색하시오


 

1
2
3
select *
from 사원
where 부서='기획' and 주소='후평동';
cs

이름

부서

생일

주소

기본급

성춘향

기획

02/20/64

후평동

100


  ※ 연산자 우선순위

    - 산술( ×, /, +, -), 관계(=, >, <, >=, …), 논리(NOT, AND, OR), 연산자가 같이 있을 때는 산술 > 관계 > 논리 연산자 순으로 연산자 우선순위가 정해진다



 문제 3

  - <사원> 테이블에서 부서가 '기획'이거나 '인터넷'인 튜플을 검색하시오


 

1
2
3
select *
from 사원
where 부서='기획' or 부서='인터넷';
cs

이름

부서

생일

주소

기본급

홍길동

기획

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

  - <사원> 테이블에서 성이 '김'인 사람의 튜플을 검색하시오


 

1
2
3
select *
from 사원
where 이름 like "김%";
cs

이름

부서

생일

주소

기본급

김선달

편집

10/22/73

효자동

90


 문제 5

  - <사원> 테이블에서 생일이 '01/09/69'에서 '10/22/73' 사이인 튜플을 검색하시오


 

1
2
3
select *
from 사원
where 생일 between #01/09/69# and #10/22/73#;
cs

이름

부서

생일

주소

기본급

임꺽정

인터넷

01/09/69

석사동

80

김선달

편집

10/22/73

효자동

90


 문제 6

  - <사원> 테이블에서 주소가 NULL인 튜플을 검색하시오


 

1
2
3
SELECT *
FROM 사원
WHERE 주소 IS NULL;
cs

이름

부서

생일

주소

기본급

강건달

인터넷

12/11/80


90


  - NULL이 아닌 값을 검색할 때는 IS NOT NULL을 사용한다

   * 예) <사원> 테이블에서 주소가 NULL이 아닌 튜플 검색


1
2
3
SELECT *
FROM 사원
WHERE 주소 IS NOT NULL;
cs


정렬 검색

 문제 1

  - <사원> 테이블에서 주소를 기준으로 오름차순 정렬시켜서 상위 2개의 튜플만 검색하시오


 

1
2
3
SELECT TOP 2*
FROM 사원
ORDER BY 주소 ASC;
cs

이름

부서

생일

주소

기본급

장길산

편집

03/11/67

고잔동

120

임꺽정

인터넷

01/09/69

석사동

80


 문제 2

  - <사원> 테이블에서 '부서'를 기준으로 오름차순 정렬하고, 같은 부서에 대해서는 '이름'을 기준으로 내림차순 정렬시켜서 검색하시오


 

1
2
3
SELECT *
FROM 사원
ORDER BY 부서 ASC, 이름 DESC;
cs

이름

부서

생일

주소

기본급

홍길동

기획

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

  - <사원> 테이블에서 부서별 기본급의 평균을 구하시오


 

1
2
3
4
SELECT 부서, AVG(기본급)
AS 평균
FROM 사원
GROUP BY 부서;
cs

부서

평균

기획

110

인터넷

85

편집

103.3


  - GROUP BY 절이 그룹을 지정한다

  - 그룹에 대한 조건을 지정할 때는 WHERE가 아닌 HAVING을 사용한다

  - AVG(기본급) AS 평균 : '기본급' 속성에 있는 값들의 평균을 구하되 '평균'이라는 속성명으로 표시


 문제 2

  - <사원> 테이블에서 부서별 튜플 수를 검색하시오


 

1
2
3
4
SELECT 부서, COUNT(*)
AS 사원수
FROM 사원
GROUP BY 부서;
cs

부서

사원수

기획

3

인터넷

2

편집

3


 문제 3

  - <사원> 테이블에서 기본급이 100 이상인 사원이 2명 이상인 부서의 튜플 수를 구하시오


 

1
2
3
4
5
6
SELECT 부서, COUNT(*)
AS 사원수
FROM 사원
WHERE 기본급 >= 100
GROUP BY 부서
HAVING COUNT(*>= 2;
cs

부서

사원수

기획

3

편집

2


  - "WHERE 기본급 >= 100" 절에 의해서 기본급이 100 이상 되는 자료만 거색 대상이 된다

  - "GROUP BY 부서" 절에 의해서 기본급이 100 이상 되는 자료에 대해서만 부서별로 그룹을 지정

  - "HAVING COUNT(*) >= 2" 절에 의해서 부서의 인원이 2 이상인 부서의 인원만 검색


하위 질의[각주:1]

 문제 1

  - 취미가 '나이트댄스'인 사원의 이름과 주소를 검색하시오


 

1
2
3
4
5
SELECT 이름, 주소
FROM 사원
WHERE 이름 = ( SELECT 이름
               FROM 여가활동
               WHERE 취미 = '나이트댄스' );
cs

 이름

주소

성춘향

후평동


  - "SELECT 이름 FROM 여가활동 WHERE 취미 = '나이트댄스'" 를 수행하여 <여가활동> 테이블에서 '성춘향을 찾는다

  - 하위 질의에 해당하는 피연산자의 자리에 '성춘향'을 대입하면 질의문은 "SELECT 이름, 주소 FROM 사원 WHERE 이름 = '성춘향'과 같다


 문제 2

  - 취미 활동을 하지 않는 사원들을 검색하시오


 

1
2
3
4
SELECT *
FROM 사원
WHERE 이름 NOT IN ( SELECT 이름
                    FROM 여가활동 );
cs

이름

부서

생일

주소

기본급

홍길동

기획

04/05/61

효자동

120

황진이

편집

07/21/75

후평동

100

장길산

편집

03/11/67

고잔동

120

강건달

인터넷

12/11/80


90


  - NOT IN(  ) : NOT IN(  )은 포함되지 않는 데이터를 의미. <사원> 테이블에서 모든 자료를 검색하는데, <여가활동> 테이블에 이름이 있는 자료는 제외하고 검색함


복수 테이블 검색

 문제

  - 경력이 10년 이상인 사원의 이름, 부서, 취미, 경력을 검색하시오


 

1
2
3
SELECT 사원.이름, 사원.부서, 여가활동.취미, 여가활동.경력
FROM 사원, 여가활동
WHERE 여가활동.경력 >= 10 AND 사원.이름 = 여가활동.이름;
cs

이름

부서

취미

경력

김선달

편집

당구

10

일지매

기획

태껸

15



통합(UNION)[각주:2] 질의

 문제

  - 사원들의 명단이 <사원> 테이블과 <직원> 테이블에 저장되어 있다. 두 테이블을 통합하는 질의문을 작성하시오. 단, 같은 레코드가 두 번 나오지 않게 하시오


<사원>



<직원>





사원

직급


사원

직급




김형석

대리


신원섭

이사




홍영선

과장


이성호

대리




류기선

부장


홍영선

과장




김현천

이사


류기선

부장






 

1
2
3
4
5
SELECT *
FROM 사원
UNION
SELECT *
FROM 직원
cs
 

직원

직급

    
 
 

김현천

이사

    



 

김형석

대리

    



 

류기선

부장

     


 

신원섭

이사

     


 

이성호

대리

     


 

홍영선

과장

     





  1. 하위 질의는 조건절에 주어진 질의를 먼저 수행하여 그 검색 결과를 조건절의 피연산자로 사용 [본문으로]
  2. 두 테이블을 합치는 통합(UNION) 질의는 두 테이블에 모두 속해 있는 자료는 한 개만 표시한다 [본문으로]
공지사항
최근에 올라온 글
Total
Today
Yesterday