본문 바로가기
  • Always Awake
정보처리기사/3과목

[정보처리기사 필기] DML 구문 정리

by NerdyBoy 2022. 2. 18.

DML(Data Manipulation Language, 데이터 조작어)의 개념

DML(데이터 조작어)은 데이터베이스 사용자가 응용 프로그램이나 질의어를 통해 저장된 데이터를 실질적으로 관리하는데 사용되는 언어

  • 사용자와 시스템간 인터페이스 제공
  • DML 명령문으로 SELECT, INSERT, DELETE, UPDATE 가 있음

 

 

삽입문(INSERT INTO~)


기본 테이블에 새로운 튜플을 삽입할 때 사용한다.

INSERT INTO 테이블명([속성명1, 속성명2, ...])
VALUES (데이터1, 데이터2, ... );
  • 대응하는 속성과 데이터는 개수와 데이터 유형이 일치해야 한다.
  • SELECT 통해 다른 테이블의 검색 결과 삽입 가능

예시 1) <사원> 테이블에 (이름-홍승현, 부서-인터넷)을 삽입

INSERT INTO 사원(이름, 부서) VALUES('홍승현', '인터넷');

예시 2) <사원> 테이블에 있는 편집부의 모든 튜플을 편집부원(이름, 생일, 주소, 기본급) 테이블에 삽입

INSERT INTO 편집부원(이름, 생일, 주소, 기본급)
SELECT 이름, 생일, 주소, 기본급
FROM 사원
WHRER 부서 = '편집';

 

 

삭제문(DELETE FROM~)


기본테이블에 있는 튜플들 중 특정 튜플 삭제

DELETE
FROM 테이블명
[WHERE 조건];
  • 모든 레코드 삭제할 때는 WHERE 절 생략
  • 모든 레코드 삭제해도 구조가 남아 DROP 과 다르다

예시) <사원> 테이블에서 "임꺽정" 에대한 튜플 삭제

DELETE
FROM 사원
WHERE 이름 = '임꺽정';

 

 

 

갱신문(UPDATE~ SET~)


기본 테이블에 있는 튜플 중 특정 튜플의 내용을 변경할 때 사용

UPDATE 테이블명
SET 속성명 = 데이터[, 속성명=데이터, ...]
[WHERE 조건];

 

예시 1) <사원> 테이블에서 "홍길동" 의 주소를 "수색동"으로 수정

UPDATE 사원
SET 주소 = '수색동'
WHERE 이름 = '홍길동';

예시 2)<사원> 테이블에서 "황진이"의 부서를 "기획부" 로 변경하고 '기본급'을 5만원 인상

UPDATE
SET 부서 = '기획', 기본급 = 기본급 + 5
WHERE 이름 = '황진이';

 

 

 

선택문(SELECT)


일반형식

SELECT [PREDICATE][테이블명.]속성명 [AS 별칭][, [테이블명.]속성명, ...]
[, 그룹함수(속성명) [AS 별칭]]
[, Window함수 OVER (PARTITION BY 속성명1, 속성명2, ...
             ORDER BY 속성명3, 속성명4, ...)]
FROM 테이블명[, 테이블명, ...]
[WHERE 조건]
[GROUP BY 속성명, 속성명, ...]
[HAVING 조건]
[ORDER BY 속성명 [ASC | DESC]];
  • SELECT절
    • PRIDICATE : 불러올 튜플 수 제한할 명령어 기술
      • ALL : 모든 튜플. 주로 생략
      • DISTINCT : 중복 튜플 있으면 그중 첫번째 한 개만
      • DISTINCTROW : 중복된 튜플 제거하고 한 개만 검색하지만 선택 속성 값이 아닌, 튜플 전체 대상
    • 속성명 : 검색하여 불러올 속성 또는 속성을 이용한 수식 지정
    • AS : 속성 및 연산의 이름을 다른 제목으로 표시하기 위해 사용
  • 그룹함수 : GROUP BY절에 지정된 그룹별로 속성의 값을 집계할 함수를 기술
  • ORDER BY절 : 특정 속성기준으로 정렬하여 검색할 때 사용
  • GROUP BY절 : 특정 속성기준으로 그룹화 하여 검색할 때 사용
  • WINDOW 함수 : GROUP BY절 이용않고 속성 값 집계할 함수 기술
  • HAVING 절 : GROUP BY절과 함께 사용하며 그룹에 대한 조건 지정

 

*예시에 사용될 기본 테이블

 

<사원>

이름 부서 생일 주소 기본급
홍길동 기획 ... 망원동 120
임꺽정 인터넷 ... 서교동 80
황진이 편집 ... 합정동 100
김선달 편집 ... 망원동 90
성춘향 기획 ... 대흥동 100
장길산 편집 ... 상암동 120
일지매 기획 ... 연남동 110
강건달 인터넷 ...   90

<여가활동>

이름 취미 경력
김선달 당구 10
성춘향 나이트댄스 5
일지매 태껸 15
임꺽정 씨름 8

 

1. 기본 검색

예시 1) <사원> 테이블의 모든 튜플을 검색

SELECT * FROM 사원;
SELECT 사원.* FROM 사원;
SELECT 이름, 부서, 생일, 주소, 기본급 FROM 사원;
SELECT 사원.이름, 사원.부서, 사원.생일, 사원.주소, 사원.기본급 FROM 사원

<결과>

사원테이블 전체를 그대로 출력

 

예시 2) <사원> 테이블에서 '주소' 만 검색하되 같은 '주소'는 한번만

SELECT DISTINCT 주소
FROM 사원;

<결과>

주소
대흥동
망원동
상암동
서교동
연남동
합정동

 

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

SELECT 부서+'부서의' AS 부서2, 이름+'의 월급' AS 이름2, 기본급 + 10 AS 기본급2
FROM 사원;

<결과>

부서2 이름2 기본급2
기획부서의 홍길동의 월급 130
인터넷부서의 임꺽정의 월급 90
... ... ...

 

 

2. 조건 지정 검색

WHERE 절에 조건지정하여 만족하는것만 검색



예시1) <사원> 테이블에서 '기획'부서에 근무하면서 '대흥동' 에 사는 사람의 튜플을 검색

SELECT *
FROM 사원
WHERE 부서 = '기획' AND 주소 = '대흥동';

<결과>

이름 부서 생일 주소 기본급
성춘향 기획 ... 대흥동 100

 

예시 2) <사원> 테이블에서 성이 '김' 인사람 모두 검색

SELECT *
FROM 사원
WHERE 이름 LIKE "김%";

 

예시 3) <사원> 테이블에서 '생일'이 '01/01/69' 에서 '12/31/73' 사이 인 튜플 모두 검색

SELECT *
FROM 사원
WHERE 생일 BETWEEN #01/01/69# AND #12/13/73#;

 

 

3. 정렬 검색

ORDER BY 절에 특정 속성을 지정하여 지정된 속성으로 자료 정렬 검색

 

예시 1) <사원> 테이블에서 '주소'기준 내림차순 정렬시켜 상위 2개 튜플만 검색

SELECT TOP 2 *
FROM 사원
ORDER BY 주소 DESC;

 

예시 2) <사원> 테이블 에서 '부서' 기준 오름 차순, '이름' 기준 내림차순 정렬

SELECT *
FROM 사원
ORDER BY 부서 ASC, 이름 DESC;

 

 

4. 하위 질의

주어진 조건절에 주어진 질의를 먼저 수행하여 그 검색 결과를 조건절의 피연산 자로 사용

 

예시 1) '취미'가 "나이트 댄스" 인 사원의 '이름'과 '주소'를 검색

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

 

예시 2) 취미활동 하지 않는 사원 검색

SELECT *
FROM 사원
WHERE 이름 NOT IN (SELECT 이름 FROM 여가활동);

NOT IN 반대는 EXISTS 사용

 

 

5. 복수 테이블 검색

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

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

 

*예시에 사용될 테이블

<상여금>

부서 이름 상여내역 상여금
기획 홍길동 연장근무 100
기획 일지매 연장근무 100
기획 최준호 야간근무 120
인터넷 강건달 특별근무 90
인터넷 서국현 특별근무 90
인터넷 박인식 연장근무 30
편집 김선달 특별근무 80
편집 황종근 연장근무 40
편집 성춘향 야간근무 80

 

6. WINDOW 함수 이용 검색

GROUP BY 절 사용않고 함수의 인수로 지정한 속성을 범위로 하여 속성의 값을 집계

 

예시) <상여금> 테이블에서 '상여내역'별로 '상여금'에 대한 일련번호를 구하시오. 이때 순서 내림차순, 속성명 'NO'

SELECT 상여내역, 상여금
  ROW_NUMBER() OVER (PARTITION BY 상여내역 ORDER BY 상여금 DESC) AS NO
FROM 상여금;

<결과>

상여내역 상여금 NO
야간근무 120 1
야간근무 80 2
연장근무 100 1
연장근무 100 2
연장근무 40 3
연장근무 30 4
특별근무 90 1
특별근무 90 2
특별근무 80 3

 

 

7. 그룹 지정 검색

GROUP BY 지정 속성 기준 자료 그룹화 검색

 

예시 1) <상여금> 테이블에서 '부서' 별 '상여금'의 평균

SELECT 부서, AVG(상여금), AS 평균
FROM 상여금
GROUP BY 부서;

 

예시 2) <상여금> 테이블에서 '상여금'이 100 이상인 사원이 2명 이상인 '부서'의 튜플 수

SELECT 부서, COUNT(*) AS 사원수
FROM 상여금
WHERE 상여금 >= 100
GROUP BY 부서
HAVING COUNT(*) >= 2;

<결과>

부서 사원수
기획 3

 

예시 3) <상여금> 테이블의 '부서', '상여내역', 그리고 '상여금'에 대해 부서별 상여내역별 소계와 전체 합계를 검색하시오.(속성명은 '상여금 합계', ROLLUP 함수 사용)

SELECT 부서, 상여내역, SUM(상여금) AS 상여금합계
FROM 상여금
GROUP BY ROLLUP(부서, 상여내역);
  • ROLLUP 함수에 넣은 속성이 2개이므로 2+1 개의 레벨이 집계된다
    • 3레벨 : 부서별 상여내역별 '상여금' 합계
    • 2레벨 : 부서별 '상여금' 합계
    • 1레벨 : 전체 '상여금' 합계

예시 4) <상여금> 테이블의 '부서', '상여내역' 그리고 '상여금'에 대해 부서별 상여내역별 소계와 전체 합계 검색(CUBE함수 사용)

SELECT 부서, 상여내역, SUM(상여금) AS 상여금합계
FROM 상여금
GROUP BY CUBE(부서, 상여내역);
  • CUBE 함수는 속성 2개 의 제곱인 4개의 레벨로 구성. 가장 상위인 1레벨 부터 표시된다.
    • 1레벨 : 전체 '상여금' 합계
    • 2레벨 : 상여내역별 '상여금' 합계
    • 3레벨 : 부서별 '상여금' 합계
    • 4레벨 : 부서별 상여내역별 '상여금' 합계

 

8. 집합 연산자를 이용한 통합 질의

SELECT 속성명1, 속성명2, ...
FROM 테이블명
UNION | UNION ALL | INTERSECT | EXCEPT
SELECT 속성명1, 속성명2, ...
FROM 테이블명
[ORDER BY 속성명 [ASC | DESC]];
  • UNION : 합집합. 중복은 한번만
  • UNION ALL : 합집합. 중복 그대로
  • INTERSECT : 교집합
  • EXCEPT : 차집합(첫번째 조회 결과 - 두번째)

예시) <사원> 테이블과 <직원> 테이블을 통합하는 질의문 작성(중복되지않게)

SELECT *
FROM 사원
UNION
SELECT *
FROM 직원

 

 

 

결합문(JOIN)


JOIN의 개념

2개의 테이블에 대해 연관된 튜플들을 결합하여 하나의 새로운 릴레이션 반환

 

1. INNER JOIN

EQUI JOIN 과 NON-EQUI JOIN으로 구분.

조건이 없는 INNER JOIN 수행하면 CROSS JOIN과 같은 결과

 

EQUI JOIN

공통 속성을 기준으로 '='(equal) 비교에 의해 같은 값을 가지는 행을 연결하여 결과 생성

  • WHERE절 이용
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1, 테이블명2, ...
WHERE 테이블명1.속성명 = 테이블명2.속성명;

 

  • NATURAL JOIN절 이용
  • 중복된 속성 제거
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 NATURAL JOIN 테이블명2;

 

  • JOIN ~ USING 절 이용
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 JOIN 테이블명2 USING(속성명);

 

NON-EQUI JOIN

조건에 '=' 이 아닌 비교연산자 사용

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1, 테이블명2, ...
WHERE (NON-EQUI JOIN 조건);

 

2. OUTER JOIN

JOIN조건에 만족하지 않는 튜플도 결과로 출력하기 위함

LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 이 있다.

 

LEFT OUTER JOIN

INNER JOIN 결과 구한 후, 우측 항 릴레이션의 어떤 튜플과도 맞지 않는 좌측 항 릴레이션에 있는 튜플들에 NULL

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 LEFT OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명 = 테이블명2.속성명(+);

 

RIGHT OUTER JOIN

INNER JOIN 결과 구한 후, 좌측 항 릴레이션의 어떤 튜플과도 맞지 않는 우측 항 릴레이션에 있는 튜플들에 NULL

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 RIGHT OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명(+) = 테이블명2.속성명(+);

 

FULL OUTER JOIN

LEFT OUTER JOIN, RIGHT OUTER JOIN 합친것

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
FROM 테이블명1 FULL OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;

 

 

3. SELF JOIN

같은 테이블에서 2개의 속성을 연결하여 EQUI JOIN

SELECT [별칭1.]속성명, [별칭1.]속성명 ...
FROM 테이블명1 [AS] 별칭1 JOIN 테이블명1 [AS] 별칭2
ON 별칭1.속성명 = 별칭2.속성명;

SELECT [별칭1.]속성명, [별칭1.]속성명 ...
FROM 테이블명1 [AS] 별칭1, 테이블명1 [AS] 별칭2
WHERE 별칭1.속성명 = 별칭2.속성명;

 

 


 

출처

자료 참고: 

시나공 정보처리기사 필기 2022를 참고하여 작성되었습니다

표지

 

댓글