관리 메뉴

나구리의 개발공부기록

CHAPTER 01 - 데이터베이스 기본(2) 본문

2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비)/실기 7강 - SQL 응용

CHAPTER 01 - 데이터베이스 기본(2)

소소한나구리 2024. 6. 30. 19:53

2024년도 수제비 실기책(6판) 내용 정리


3) DML

(1) 데이터 조작어(DML; Data Manipulation Languge)의 개념

 

  • 데이터 베이스에 저장된 자료들을 입력, 수정, 삭제, 조회하는 언어

(2) DML 명령어(세인업데)

유형 동작 설명
SELECT 조회 테이블 내 컬럼에 저장된 데이터를 조회
INSERT 삽입 테이블 내 컬럼에 데이터를 추가
UPDATE 갱신 테이블 내 컬럼에 저장된 데이터를 수정
DELETE 삭제 테이블 내 컬럼에 저장된 데이터를 삭제

 

(3) SELECT(데이터 조회) 명령어

 

[1] SELECT 명령어 개념

 

  • 데이터의 내용을 조회할 때 사용하는 명령어(셀프웨그해오)
  • SELECT 절, FROM 절, WHERE 절, GROUP BY 절, HAVING절, ORDER BY절로 구성
-- SELECT 구성
SELECT [ALL | DISTINCT] 속성명1, 속성명2 ... # DISTINCT는 중복된 튜플이 있으면 그 중 첫번째 한개만 검색
	FROM 테이블명1, ...
[WHERE 조건]
[GROUP BY 속성명1, ...]
[HAVING 그룹조건]
[ORDER BY 속성 [ASC | DESC]];
구분 설명
SELECT 절 검색하고자 하는 속성명, 계산식을 기술하고 속성명 별칭은 AS를 사용하며 생략 가능함
2개 이상의 테이블을 대상으로 검색할 때는 '테이블명.속성명'으로 표현
술어 부분은 ALL이 기본값
ALL
 - 모든 튜플을 검색할 때 사용
 - SELECT 뒤에 명시하지 않은 경우 ALL로 인식
DISTINCT
  - 중복된 속성이 조회될 경우 그중 한 개만 검색(SELECT 뒤에 명시된 속성이 중복될 경우 한 개만 검색)
FROM절 질의에 의해 검색될 데이터들을 포함하는 테이블명을 기술
WHERE절 검색할 조건을 기술
GROUP BY 절 속성값을 그룹으로 분류하고자 할 때 사용
HAVING 절 GROUP BY에 의해 분류한 후 그룹에 대한 조건 지정
ORDER BY 절 속성값을 정렬하고자 할 때  사용 (ASC : 오름차순, DESC : 내림차순, 기본값: ASC)

 

SELECT 절 예제

 

  • SELECT 절은 테이블에서 출력할 컬럼을 명시하기 위해 사용

[1-2] WHERE 절

 

  • WHERE 절 조건 비교, 범위, 집합, 패턴, NULL, 복합조건이 있음
구분 연산자 설명
비교 = 값이 같은 경우 조회
<>, != 같이 다른 경우 조회
<, <=, >, >= 비교 연산에 해당하는 데이터 조회
범위 BETWEEN 컬럼 BETWEEN 값1 AND 값2
 - 값1보다 크거나 같고 값2보다 작거나 같은 데이터 조회

컬럼 >= 값1 AND 컬럼 <= 값2; 와 동일한 결과
집합 IN 컬럼 IN (값1, 값2, ...)
 - 컬럼이 IN 안에 포함된 경우의 데이터 조회
  NOT IN 컬럼 NOT IN (값1, 값2, ...)
 - 컬럼이 IN 안에 포함되어 있지 않은 경우의 데이터 조회
패턴 LIKE 컬럼 LIKE 패턴
 - 컬럼이 패턴에 포함된 경우의 데이터 조회
% : 0개 이상의 문자열과 일치
[ ] : 1개의 문자와 일치
[^] : 1개의 문자와 불일치
_ : 특정 위치의 1개의 문자와 일치
NULL IS NULL 컬럼 IS NULL
 - 컬럼이 NULL인 데이터 조회
IS NOT NULL 컬럼 IS NOT NULL
 - 컬럼이 NULL이 아닌 데이터 조회
복합 조건  AND 조건1 AND 조건2
 - 조건1과 조건2를 모두 만족하는 데이터 조회
OR 조건1 OR 조건2
 - 조건1과 조건2 둘 중 하나를 만족하는 데이터 조회
NOT NOT 조건
- 조건에 해당하지 않는 데이터 조회

 

WHERE 절 예제

-- BETWEEN
-- 상품(PRODUCT) 테이블에서 가격(PRICE)이 50000보다 크거나 같고 80000보다 작거나 같은 튜플을 조회
SELECT * FROM PRODUCT WHERE PRICE BETWEEN 50000 AND 80000;

-- IN
-- 상품(PRODUCT) 테이블에서 가격(PRICE)이 40000또는 50000또는 60000인 튜플을 조회
SELECT * FROM PRODUCT WHERE PRICE IN (40000, 50000, 60000);

-- LIKE_1
-- 상품(PRODUCT) 테이블에서 이름(NAME)이 '정보'로 시작되는 문자열 조회
SELECT * FROM PRODUCT WHERE NAME LIKE '정보%';

-- LIKE_2
-- 이름(NAME)이 첫 번째 문자가 'A'또는 'B' 또는 'C'또는 'D'인 문자열과 일치하는 문자열 검색
SELECT * FROM PRODUCT WHERE NAME LIKE '[ABCD]%';

-- NULL
-- 상품(PRODUCT) 테이블에서 가격(PRICE)이 NULL값인 경우의 튜플을 조회
SELECT * FROM PRODUCT WHERE PRICE IS NULL;

 

[1-3] GROUP BY 절

 

  • 속성값을 그룹으로 분류하고자 할 때 사용

GORUP BY 절 예제

 

** SELECT 절에서 '컬럼명 AS 별칭' 형태로 쓰면 출력 시 컬럼명이 별칭으로 표기되며 AS는 생략이 가능함

예제를 위한 급여 테이블

SELECT 직책,
    COUNT(직책),
    SUM(급여)
FROM 급여 GROUP BY 직책;
GROUP BY 절에 명시된 직책을 기준으로 그룹을 묶었을 때,
직책별 건수(COUNT)와 급여의 합계(SUM)
SELECT 부서
    SUM(급여) AS 급여합계
FROM 급여
GROUP BY 부서; 
GROUP BY 절에 명시된 부서를 기준으로 그룹을 묶었을 때,
부서별 급여의 합계(SUM)를 급여합계로 출력
SELECT 직책, 부서
    SUM(부서) AS 급여합계
FROM 급여
GROUP BY 직책, 부서;
GROUP BY 절에 명시된 직책, 부서를 기준으로 그룹을 묶었을 때,
각 직책, 부서에 대한 급여 합계(SUM)
SELECT COUNT(*)
FROM 급여;
GROUP BY 절이 없을 경우 전체 테이블이 하나의 그룹이 되고,
그룹에 해당하는 총 튜플의 수(COUNT)를 출력

 

[1-4] HAVING 절

 

  • GROUP BY에 의해 분류한 후 그룹에 대한 조건을 지정할 때 사용

HAVING 절 예제

SELECT 직책, 부서
    SUM(급여) AS 급여합계
FROM 급여
GROUP BY 직책, 부서
    HAVING 급여합계 >= 5000;

또는 HAVING SUM(급여) >= 5000;
GROUP BY 절에 명시된 직책, 부서를 기준으로 그룹을 묶었을 때,
각 직책, 부서에 대한 급여합계가 5000 이상인 급여합계

 

[1-5] ORDER BY 절

 

  • 속성값을 정렬하고자 할 때 사용

ORDER BY 절 예제

 

예제를 위한 성적 테이블

SELECT * FROM 성적
ORDER BY 이름;
ORDER BY 절에 ASC와 DESC가 명시되어 있지 않은 경우 ASC가 기본값
문자열일 경우 가나다 순으로 정렬
이름에 대해 오름차순 정렬
SELECT * FROM 성적
ORDER BY 과목, 이름;
ORDER BY 절에 2개 이상의 속성이 있는 경우 먼저 선언 된 속성으로 정렬 후,
같은 값일 때 다음 속성으로 정렬
과목, 이름을 오름차순 정렬
SELECT * FROM 성적
ORDER BY 학점 DESC, 이름;
ORDER BY 절에 2개 이상의 속성에 대해서 오름차순과 내림차순을 섞어서 사용할 수 있음
학점을 내림차순으로 정렬하고 같은 값일 때 이름을 오름차순으로 정렬

 

[2] 조인 (Join)

 

  • 두 개 이상의 테이블을 연결하여 데이터를 검색하는 방법
  • 두 릴레이션으로부터 관련된 튜플들을 결합하여 하나의 튜플로 만드는 가장 대표적인 데이터 연결 방법
유형 설명
내부 조인(Inner Join) 공통 존재 컬럼의 값이 같은 경우를 추출하는 기법
외부 조인(Outer Join) 왼쪽 외부 조인(Left Outer Join)
 - 왼쪽 테이블의 모든 데이터오른쪽 테이블의 동일한 데이터를 추출하는 기법
오른쪽 외부 조인(Right Outer Join)
 - 오른쪽 테이블의 모든 데이터왼쪽 테이블의 동일한 데이터를 추출하는 기법
완전 외부 조인(Full Outer Join)
 - 양쪽의 모든 데이터를 추출하는 기법
교차 조인(Cross Join) 조인 조건이 없는 모든 데이터 조합을 추출하는 기법
셀프 조인(Self Join) 자기 자신에게 별칭을 지정한 후 다시 조인하는 기법
세타 조인(Theta Join) 비교조건 >, =, < 을 만족하는 조인
동등 조인(Equal Join) 비교조건 = 을 만족하는 조인, 내부조인, 외부 조인에서도 사용가능
자연 조인(Natural Join) 동등 조인 Equal Join 에서 중복 속성을 제거한 조인

 

[2-1] 내부 조인

SELECT A.컬럼1, A.컬럼2, ...,
               B.컬럼1, B.컬럼2, ...
    FROM 테이블1 A [INNER] JOIN 테이블2 B
         ON 조인조건
[WHERE 검색조건];
같은 이름의 컬럼이 여러 테이블에 있을 경우 '별칭.컬럼명' 형태로 표시
INNER라는 키워드는 생략해도 내부 조인이 됨
WHERE 절 추가 시 조인된 값에서 조건에 맞은 결과만 출력

 

[2-2] 왼쪽, 오른쪽, 완전 외부 조인

SELECT A.컬럼1, A.컬럼2, ...,
               B.컬럼1, B.컬럼2, ...
    FROM 테이블1 A LEFT [OUTER] JOIN
                테이블2 B
         ON 조인조건
[WHERE 검색조건];
OUTER 라는 키워드는 생략해도 왼쪽 외부 조인이 됨
WHERE 절 추가 시 조인된 값에서 조건에 맞은 결과만 출력
FROM 테이블1 A RIGHT [OUTER] JOIN
            테이블2 B
FROM 테이블1 A FULL [OUTER] JOIN
            테이블2 B

 

[2-3] 교차 조인

SELECT A.컬럼1, A.컬럼2, ...,
               B.컬럼1, B.컬럼2, ...
    FROM 테이블1 A CROSS JOIN 테이블2 B;
조인 조건이 없는 모든 데이터 조합을 추출하기 때문에 ON 절이 없음

 

[2-4] 셀프 조인

SELECT A.컬럼1, A.컬럼2, ...,
               B.컬럼1, B.컬럼2, ...
  FROM 테이블1 A [INNER] JOIN 테이블1 B
         ON 조인조건
[WHERE 검색조건];
같은 테이블명을 쓰고 별칭만 A, B와 같이 다르게 함
WHERE 절 추가시 조인된 값에서 조건에 맞는 결과만 출력

 

JOIN 예제

조인 예제를 위한 테이블

SELECT A.책번호, A.책명, B.가격
FROM 도서 A JOIN 도서가격 B
ON A.책번호 = B.책번호;
'도서' 테이블은 A라는 별칭으로 '도서가격' 테이블은 B라는 별칭으로 설정 후
책번호가 같은 것끼리 조인
  -> 공통된 값만 출력됨
SELECT A.책번호, A.책명,
               B.책번호, B.가격
FROM 도서 A LEFT JOIN 도서가격 B
ON A.책번호 = B.책번호;
각 테이블 별칭은 위와 동일
왼쪽에 위치한 '도서' 테이블 기준으로 왼쪽 외부 조인
  -> 없는 값이 NULL로 표시됨
SELECT A.책번호, A.책명, 
               B.책번호, B.가격
FROM 도서 A RIGHT JOIN 도서가격 B
ON A.책번호 = B.책번호;
각 테이블 별칭은 동일
오른쪽에 위치한 '도서가격 테이블 기준으로 오른쪽 외부 조인
 -> 없는 값이 NULL로 표시됨
SELECT A.책번호, A.책명,
              B.책번호, B.가격
FROM 도서 A FULL JOIN 도서가격 B
ON A.책번호 = B.책번호;
각 테이블 별칭은 동일, 완전 외부 조인
 -> A테이블의 NULL값이 먼저 출력
SELECT A.책번호, A.책명,
               B.책번호, B.가격
FROM 도서 A CROSS JOIN 도서가격 B;
각 테이블 별칭은 동일, 조건 설정 없이 교차 조인
 -> 교차곱(카티션 프로덕트)와 동일한 결과
SELECT A.책번호, A.책명
               B.책번호, B.책명
FROM 도서 A JOIN 도서 B
ON A.선수과목_책번호 = B.책번호
[도서]


해당 도서 테이블을 A,B라는 별칭으로 따로 설정
테이블 내의 다른 컬럼을 조건으로 두어 셀프 조인 수행
 -> NULL 값이 빠지고 출력됨

 

[3] 서브쿼리(Sub-Query)

 

  • SQL문 안에 포함된 SQL문
  • 알려지지 않은 기준을 위한 검색을 위해 사용됨
  • 메인쿼리와 서브쿼리 관계는 주종 관계로서 서브쿼리에 사용되는 컬럼 정보는 메인쿼리의 컬럼 정보를 사용할 수 있으나 역으로는 성립이 안됨

서브쿼리 개념

  • 서브쿼리 유형
서브쿼리 종류 설명
FROM 절 서브쿼리 서브쿼리가 FROM절 안에 들어있는 형태
인라인 뷰(Inline Views)라고 불림
뷰(View)처럼 결과가 동적으로 생성된 테이블 형태로 사용할 수 있음
WHERE 절 서브쿼리 서브쿼리가 WHERE 절 안에 들어있는 형태
중첩 서브쿼리(Nested Sub-Query)라고도 불림
SELECT 절 서브쿼리 셀렉트 절에서 서브쿼리를 사용할 수 있음
스칼라 서브쿼리라고 불림
각 행의 추가 정보를 가져올 때 사용됨

 

서브쿼리 예제

예제를 위한 테이블

 

  • FROM 절 서브쿼리
SELECT MAX(가격) AS 가격
FROM 도서가격 A,
    (SELECT 책번호
        FROM 도서
        WHERE 책명 = '자료구조') B
WHERE A.책번호 = B.책번호;
A라는 이름으로 바꾼 '도서 가격'의 '책번호'와 B라는 이름의 서브쿼리 결괏값(책이름이 자료구조인) 중 '책번호'가 같은 책의 최대 '가격'을 출력

(SELECT 책번호 FROM 도서 WHERE 책명 = '자료구조')라는 결과값을 B라는 이름으로 명명하면 B라는 테이블 처럼 사용할 수 있음

 

  • WHERE 절 서브쿼리
SELECT MAX(가격) AS 가격
FROM 도서가격
WHERE 책번호
        IN (SELECT 책번호
        FROM 도서
        WHERE 책명 = '자료구조') 
;
(SELECT 책번호 FROM 도서 WHERE 책명 = '자료구조') 서브쿼리에서 나온 '책번호'와 '도서가격 테이블에 있는 '책번호'와 같은 책의 최대 가격을 출력

* 책에서는 IN으로 되어있지만 하나의 책번호만 반환되므로 =이 맞다고 생각함

 

[4] 집합 연산자(Set Operation)

 

  • 테이블을 집합 개념으로 보고, 두 테이블 연산에 집합 연산자를 사용하는 방식
  • 여러 질의 결과를 연결하여 하나로 결합하는 방식을 사용함 (2개 이상의 질의 결과를 하나의 결과로 만들어 줌)
집합 연산자 구성도 설명
UNION

중복 레코드를 제외
중복 행이 제거된 쿼리 결과를 반환하는 집합 연산
UNION ALL

중복 레코드를 허용
중복 행이 제거되지 않은 쿼리 결과를 반환하는 집합 연산
INTERECT

중복 레코드만 포함
두 쿼리 결과에 공통적으로 존재하는 결과를 반환하는 집합 연산
MINUS

비교 레코드 제외
첫 쿼리에 있고 두 번째 쿼리에는 없는 결과를 반환하는 집합 연산

 

집합 연산자 예제

예제를 위한 테이블

  • UNION
SELECT ENAME
FROM EMP
WHERE SAL <= 2000

UNION

SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
EMP 테이블에서 SAL이 2000보다 작거나 같은 직원의 이름과 EMP 테이블에서 SAL이 1500보다 크거나 같은 직원의 이름의 합집합을 중복을 제거한 후 결과를 반환

 

  • UNIONALL
SELECT ENAME
FROM EMP
WHERE SAL <= 2000

UNION ALL

SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
EMP 테이블에서 SAL이 2000보다 작거나 같은 직원의 이름과 EMP 테이블에서 SAL이 1500보다 크거나 같은 직원의 이름의 합집합을 중복을 포함하여 결과를 반환

 

  • INTERSPECT
SELECT ENAME
FROM EMP
WHERE SAL <= 2000

INTERSPECT

SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
EMP 테이블에서 SAL이 2000보다 작거나 같은 직원의 이름과 EMP 테이블에서 SAL이 1500보다 크거나 같은 직원의 이름의 교집합 결과를 반환


 

  • MINUS
SELECT ENAME
FROM EMP
WHERE SAL <= 2000

MINUS

SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
EMP 테이블에서 SAL이 2000보다 작거나 같은 직원의 이름과 EMP 테이블에서 SAL이 1500보다 크거나 같은 직원의 이름의 차집합 결과를 반환

데이터 집합을 기준으로 다른 데이터 집합과 공통 항목을 제외한 결과를 추출

 

(4) INSERT (데이터삽입) 명령어

 

  • 속성과 데이터 개수, 데이터 타입이 일치해야함
  • 속성명은 생략 가능(입력 데이터의 개수가 속성의 개수와 일치할 경우)
  • 속성의 타입이 숫자인 경우 데이터는 따옴표를 붙이지 않아도 되며, 문자열인 경우 따옴표를 붙여야 함
-- INSERT
INSERT INTO 테이블명(속성명1, ...) VALUES (데이터1, ...);

-- 예시 : 학생 테이블에 학번이 6677, 이름이 장길산, 학년이 3학년, 수강과목은 수학인 학생을 삽입
INSERT INTO 학생(학번, 이름, 학년, 수강과목) VALUES (6677, '장길산', 3, '수학');

 

(5) UPDATE(데이터 변경) 명령어

 

  • WHERE 절을 통해 어떤 조건이 만족할 경우에만 특정 컬럼의 값을 수정하는 용도로 자주 사용됨
-- UPDATE
UPDATE 테이블명 SET 속성명 = 데이터, ... WHERE 조건;

-- 예시 : 학생 테이블에 장길산의 주소를 인천으로 수정
UPDATE 학생 SET 주소 = '인천' WHERE 이름 = '장길산';

 

(6) DELETE(데이터 삭제)

 

  • 모든 레코드를 삭제할 때는 WHERE 절 없이 DELETE만 사용
  • 레코드를 삭제해도 테이블 구조는 남아 있어서 디스크에서 테이블을 완전히 삭제하는 DROP명령과는 다름
-- DELETE
DELETE FROM 테이블명 WHERE 조건;

-- 예시 : 학생 테이블에 장길산에 대한 튜플을 삭제
DELETE FROM 학생 WHERE 이름 = '장길산';

4) DCL

(1) 데이터 제어어(DCL; Data Control Language)의 개념

 

  • 데이터베이스 관라자가 데이터 보안, 무결성 유지, 병행 제어, 회복을 위해 관리자(DBA)가 사용하는 제어용 언어
  •  
유형 동작 설명
GRANT 사용 권한 부여 관리자(DBA)가 사용자에게 데이터베이스에 대한 권한을 부여하는 명령어
REVOKE 사용 권한 취소 관리자(DBA)가 사용자에게 부여했던 권한을 회수하기 위한 명령어

 

[1] GRANT(권한 부여)명령어 (그온투)

-- GRANT
GRANT 권한 ON 테이블 TO 사용자;

-- 예시 : 관리자가 사용자 장길산에게 학생 테이블에 대해 업데이트 할 수 있는 권한 부여
GRANT UPDATE ON 학생 TO 장길산;

 

[2] REVOKE(권한 회)명령어 (리온프)

-- REVOKE
REVOKE 권한 ON 테이블 FROM 사용자;

-- 예시 : 관리자가 사용자 장길산에게 학생 테이블에 대해 업데이트 할 수 있는 권한을 회수
REVOKE UPDATE ON 학생 FROM 장길산;