정보처리기사 - SQL 응용 #121

2023. 8. 19. 12:43자격증/정보처리기사

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