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 : 속성 및 연산의 이름을 다른 제목으로 표시하기 위해 사용
- PRIDICATE : 불러올 튜플 수 제한할 명령어 기술
- 그룹함수 : 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를 참고하여 작성되었습니다
'정보처리기사 > 3과목' 카테고리의 다른 글
[정보처리기사 필기] SQL 활용(Procedure, Trigger, ORM 등) (0) | 2022.02.19 |
---|---|
[정보처리기사 필기] SQL 응용 (DDL, DCL, DML) (0) | 2022.02.19 |
[정보처리기사 필기] DCL 구문 정리 (0) | 2022.02.18 |
[정보처리기사 필기] DDL 구문 정리 (0) | 2022.02.18 |
[정보처리기사 필기] 물리 데이터베이스 설계 (0) | 2022.02.18 |
댓글