Chapter 01. 데이터베이스 기본
1. 트랜잭션
(3) 데이터 조작어 (DML; Data Manipulation Language)
- 데이터 조작어는 데이터베이스에 저장된 자료들을 입력, 수정, 삭제, 조회하는 언어
* Create, Read, Upate, Delete 앞 글자 따서 CRUD
> CRUD는 데이터베이스 기본 연산
[1] DML 명령어
- DML 유형
1. SELECT - 조회
: 테이블 내 칼럼에 저장된 데이터 조회
2. INSERT - 삽입
: 테이블 내 칼럼에 데이터 추가
3. UPDATE - 갱신
: 테이블 내 칼럼에 저장된 데이터 수정
4. DELETE - 삭제
: 테이블 내 칼럼에 저장된 데이터 삭제
데이터베이스 DML
세인업데
SELECT / INSERT / UPDATE / DELETE
> 내 친구 세인이 집에 업데 (....업데..)
[3] SELECT (데이터 조회) 명령어
- SELECT 명령어는 데이터 내용 조회할 때 사용하는 명령어
- SELECT 절, FROM절, WHERE 절, GROUP BY 절, HAVAING 절, ORDER BY 절로 구성
SELECT [ ALL | DISTINCT] 속성명1, 속성명2...
FROM 테이블명1, ...
[WHERE 조건]
[GROUP BY 속성명1, ...],
[HAVING 그룹 조건]
[ORDER BY 속성 [ASC | DESC] ];
SELECT 명령문
셀프 웨 구해오
SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY
> 셀프 웨이터를 구해오라
- SELECT 절
- 검색하고자 하는 속성명, 계산식 기술
- 속성명 별칭은 'AS' 사용, 생략 가능
- 2개 이상 테이블 대상 검색 시, '테이블명.속성명' 으로 표현
- 술어 부분은 ALL 이 기본값
1. ALL
- 모든 튜플 검색 시 사용
- SELEC 뒤 별도 명시 없는 경우, ALL로 인식
2. DISTINCT
- 중복된 속성 조회 시, 그중 한 개만 검색 (SELECT 뒤 명시된 속성 중복될 경우 한 개만 검색)
DISTINCT
SELECT 명령문에서 'DISTINCT' 는 중복된 튜플이 있을 경우, 그 중 첫 번째 한 개만 검색
- FROM 절
- 질의에 의해 검색될 데이터들을 포함하는 테이블명 기술
- WHERE 절
- 검색 조건 기술
- GROUP BY 절
- 속성값 그룹으로 분류하려 할 때 사용
- HAVING 절
- GROUP BY에 의해 분류된 그룹에 대한 조건 지정
- ORDER BY 절
- 속성값 정렬에 사용, 기본값은 오름차순 정렬
> ASC : 오름차순, DESC : 내림차순
1. SELECT 절
- 테이블에서 출력할 칼럼 명시하기 위해 사용
[성적 테이블]
이름 | 과목 | 학점 |
김철수 | C언어 | A |
한유리 | 자료구조 | A |
신짱구 | 자료구조 | A |
이훈이 | 알고리즘 | B |
[ 쿼리 & 쿼리 결과 ]
#1
SELECT 과목
FROM 성적;
과목 |
C언어 |
자료구조 |
자료구조 |
알고리즘 |
- 성적 테이블에서 과목 열 모두 출력
#2
SELECT DISTINCT 과목
FROM 성적;
과목 |
C언어 |
자료구조 |
알고리즘 |
- 성적 테이블의 과목 열 중 중복된 값은 맨 첫번째 값만 출력
#3
SELECT 과목
FROM 성적
WHERE 학점 ='A'
과목 |
C언어 |
자료구조 |
자료구조 |
- 과목 테이블의 성적 열 중에서 학점 값이 'A'인 과목만 모두 출력
#4
SELECT DISTINCT 과목
FROM 성적
WHERE 학점 ='A'
과목 |
C언어 |
자료구조 |
- 성적 테이블의 과목 열에서 중복값은 제거하고 학점 값이 'A'인 것만 모두 출력
#5
SELECT COUNT(DISTINCT 과목)
FROM 성적;
COUNT(DISTINCT 과목) |
3 |
- 성적 테이블의 과목 열에 중복값을 제외한 튜플의 갯수 출력 > C언어, 자료구조, 알고리즘 3개
#6
SELECT DISTINCT 과목, 학점
FROM 성적;
과목 | 학점 |
C언어 | A |
자료구조 | A |
알고리즘 | B |
- 성적 테이블에서 과목과 학점 두 칼럼 값이 모두 동일한 튜플은 삭제하여 출력 > 자료구조 A 학점이 2행이므로 하나만 출력
2. WHERE 절
- 비교, 범위, 집합, 패턴, NULL, 복합조건 존재
✔ 비교
= : 값이 같은 경우 조회
<>, != : 값이 다른 경우 조회
<, <=, >, >= : 비교 연산 데이터 조회
✔ 범위
BETEWEEN > 컬럼명 BETWEEN 값1 AND 값2
: 값1보다 크거나 같고, 값2보다 작거나 같은 데이터 조회
컬럼명 >= 값1 AND 컬럼명 <= 값2 조회 결과와 동일
✔ 집합
IN > 컬럼명 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 조건: 조건에 해당하지 않는 데이터 조회
[ 쿼리 예제 ]
-- BETWEEN
SELECT *
FROM PRODUCT
WHERE PRICE BETWEEN 50000 AND 80000;
- 상품 테이블에서 가격 칼럼의 값이 5000 이상 80000 이하인 튜플 조회
-- IN
SELECT *
FROM PRODUCT
WHERE PRICE IN (40000, 50000, 60000);
- 상품 테이블에서 가격 칼럼 값이 4000 또는 5000 또는 6000인 튜플 조회
-- LIKE
SELECT *
FROM PRODUCT
WHERE NAME LIKE '정보%'
- 상품 테이블에서 NAME(이름) 칼럼 값이 '정보'로 시작하는 문자열인 튜플 조회
--LIKE
SELECT *
FROM PRODUCT
WHERE NAME LIKE '[ABCD]%';
- 상품 테이블에서 NAME(이름) 칼럼 값이 'A' 또는 'B' 또는 'C' 또는 'D'인 문자열과 일치하는 튜플 조회
-- IS NULL
SELECT *
FROM PRODUCT
WHERE PRICE IS NULL;
- 상품 테이블에서 가격 칼럼 값이 NULL 인 튜플 조회
3. GROUP BY 절
- 속성값을 그룹으로 분류할 때 사용
[ 급여 테이블 ]
이름 | 직책 | 부서 | 급여 |
김철수 | 차장 | 마케팅 | 5000 |
한유리 | 차장 | 전산 | 4800 |
신짱구 | 사원 | 마케팅 | 2500 |
이훈이 | 사원 | 마케팅 | 2700 |
[ 쿼리 & 쿼리결과 ]
#1
SELECT 직책,
COUNT(직책),
SUM(급여)
FROM 급여
GROUP BY 직책;
- 급여테이블에서 GROUP BY 절에 명시된 직책을 기준으로 그룹을 분류했을 때, 직책별 튜플 수(COUNT)와 급여 합계(SUM) 조회
직책 | COUNT(직책) | SUM(급여) |
차장 | 2 | 9800 |
사원 | 2 | 5200 |
#2
SELECT 부서,
SUM(급여) AS 급여합계
FROM 급여
GROUP BY 부서;
부서 | 급여합계 |
마케팅 | 10200 |
전산 | 4800 |
- 급여 테이블에서 GROUP BY 절에 명시된 부서를 기준으로 그룹을 분류하여 부서별 급여 합계(SUM)를 '급여합계' 칼럼으로 조회
#3
SELECT 직책,
부서,
SUM(급여) AS 급여합계
FROM 급여
GROUP BY 직책, 부서;
직책 | 부서 | 급여합계 |
차장 | 마케팅 | 5000 |
차장 | 전산 | 4800 |
사원 | 마케팅 | 5200 |
- 급여 테이블에서 GROUP BY 절에 명시된 직책과 부서를 기준으로 그룹을 분류했을 때, 각 직책과 부서에 따른 급여 합계(SUM) 조회
#4
SELECT COUNT(*)
FROM 급여;
COUNT(*) |
4 |
- 급여 테이블에서 * (전체 값) 즉 전체 테이블의 총 튜플의 수(COUNT) 조회 > GROUP BY 절이 없으므로 전체 테이블을 하나의 그룹으로 취급
SELECT 절 - '컬럼명 AS 별칭'
SELECT 절에서 컬럼명 AS 별칭 형태로 작성 시,
쿼리 결과 조회에 컬럼명이 AS 뒤 별칭으로 표기되며 AS는 생략 가능함
4. HAVING 절
- GROUP BY 절에 의해 분류된 그룹에 대한 조건 지정 시 사용
[ 급여 테이블 ]
이름 | 직책 | 부서 | 급여 |
김철수 | 차장 | 마케팅 | 5000 |
한유리 | 차장 | 전산 | 4800 |
신짱구 | 사원 | 마케팅 | 2500 |
이훈이 | 사원 | 마케팅 | 2700 |
[ 쿼리 조회 및 결과 ]
SELECT 직책,
부서,
SUM(급여) AS 급여합계
FROM 급여
GROUP BY 직책, 부서
HAVING SUM(급여) >= 5000;
직책 | 부서 | 급여합계 |
차장 | 마케팅 | 5000 |
사원 | 마케팅 | 5200 |
5. ORDER BY 절
- 속성값 정렬 시에 사용
[ 성적 테이블 ]
이름 | 과목 | 학점 |
김철수 | C언어 | A |
한유리 | 자료구조 | A |
신짱구 | 자료구조 | A |
이훈이 | 알고리즘 | B |
[ 쿼리 및 결과 ]
#1
SELECT *
FROM 성적
ORDER BY 이름;
이름 | 과목 | 학점 |
김철수 | C언어 | A |
신짱구 | 자료구조 | A |
이훈이 | 알고리즘 | B |
한유리 | 자료구조 | A |
- 성적 테이블에서 모든 값(*)을 조회
- ORDER BY 절 뒤에 ASC/DESC 가 명시되지 않은 경우, DEFAULT 값은 ASC (오름차순)
- 이름 칼럼에 대해 오름차순 정렬 > 가나다순 정렬
#2
SELECT *
FROM 성적
ORDER BY 과목, 이름;
이름 | 과목 | 학점 |
김철수 | C언어 | A |
이훈이 | 알고리즘 | B |
신짱구 | 자료구조 | A |
한유리 | 자료구조 | A |
- 성적 테이블의 모든 값을 조회(*)
- ORDER BY 절에 과목, 이름 2가지 컬럼 존재 > 앞에 있는 속성으로 정렬 후, 같은 값일 경우 다음 속성으로 정렬
- 과목 기준으로 정렬 한 후, 동일 과목일 경우 이름을 기준으로 재정렬
#3
SELECT *
FROM 성적
ORDER BY 학점 DESC, 이름 ASC;
이름 | 과목 | 학점 |
이훈이 | 알고리즘 | B |
김철수 | C언어 | A |
신짱구 | 자료구조 | A |
한유리 | 자료구조 | A |
- 성적 테이블의 모든 값(*) 조회
- 학점을 기준으로 내림차순 조회 > 동일 학점인 경우, 이름 기준으로 오름차순 정렬
- 알파벳은 오름차순이 ABC, 내림차순 ZYX...
- 조인 (JOIN)
- 두 개 이상의 테이블을 연결하여 데이터를 검색하는 방법
- 두 릴레이션으로부터 관련 튜플을 결합하여 하나의 튜플로 만드는 가장 대표적인 데이터 연결 방법
- 논리적 조인 유형
1. 내부 조인 (Inner Join)
: 공통 컬럼 값이 같은 경우를 추출
2. 외부 조인 (Outer Join)
: 왼쪽 외부 조인, 오른쪽 외부 조인, 완전 외부 조인
- 왼쪽 외부 조인(Left Outer Join) : 왼쪽 테이블 모든 데이터와 오른쪽 테이블 동일 데이터 추출
- 오른쪽 외부 조인 (Right Outer Join) : 오른쪽 테이블 모든 데이터와 왼쪽 테이블 동일 데이터 추출
- 완전 외부 조인 (Full Outer Join) : 양쪽 모든 데이터 추출
3. 교차 조인 (Cross Join)
: 조인 조건이 없는 모든 데이터 조합 추출
4. 셀프 조인 (Self Join)
: 자기 자신의 별칭 지정한 후, 다시 조인
1. 내부 조인
SELECT A.칼럼1, A.칼럼2, ...,
B.칼럼1, B.칼럼2, ...
FROM 테이블1 A [INNER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
- 같은 이름의 컬럼이 여러 테이블에 있는 경우, ' 별칭.컬럼명' 형태로 명시
- INNER 키워드 생략해도 내부 조인
- 검색 조건 추가할 경우, 조인된 값에서 해당 조건에 맞는 결과만 출력
2. 왼쪽 외부 조인
SELECT A.칼럼1, A.칼럼2, ...,
B.칼럼1, B.칼럼2, ...,
FROM 테이블1 A LEFT [OUTER] JOIN
테이블2 B
ON 조인조건
WHERE 검색조건;
- OUTER 키워드 생략해도 왼쪽 외부 조인
- 검색조건 추가 시, 조인된 값에서 해당 조건 맞는 결과만 출력
3. 오른쪽 외부 조인
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...,
FROM 테이블1 A RIGHT [OUTER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건;]
- OUTER 키워드 생략해도 오른쪽 외부 조인
- 검색조건 추가 시, 조인 값에서 해당 조건에 맞는 결과만 출력
4. 완전 외부 조인
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...,
FROM 테이블1 A FULL [OUTER] JOIN
테이블2 B
ON 조인조건
[WHERE 검색조건];
- OUTER 키워드 생략해도 완전 외부 조인
- 검색조건 추가 시, 조인 값에서 해당 조건 맞는 결과만 출력
5. 교차 조인
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...
FROM 테이블1 A CROSS JOIN 테이블2 B;
- 조인 조건이 없는 모든 데이터 조합 추출로 ON 절 없음
6. 셀프 조인
SELECT A.컬럼1, A.컬럼2, ...,
B.컬럼1, B.컬럼2, ...,
FROM 테이블1 A [INNER] JOIN 테이블1 B
ON 조인조건
[WHRER 검색조건];
- 같은 테이블 쓰고 별칭만 A, B와 같이 다르게 함
- 검색조건 추가 시, 조인된 값에서 해당 조건에 맞는 결과만 출력되게 설정
- 조인 예시
[ 도서 테이블 ]
책번호 | 책명 |
111 | 운영체제 |
222 | 자료구조 |
555 | 컴퓨터구조 |
[ 도서 가격 테이블 ]
책번호 | 가격 |
111 | 20000 |
222 | 25000 |
333 | 10000 |
444 | 15000 |
#1 내부 조인
SELECT A.책번호, A.책명, B.가격
FROM 도서 A JOIN 도서가격 B
ON A.책번호=B.책번호;
A.책번호 | A.책명 | B.가격 |
111 | 운영체제 | 20000 |
222 | 자료구조 | 250000 |
- '도서' 테이블은 A, '도서가격' 테이블은 B 별칭으로 설정
- A와 B의 책번호가 같은 튜플끼리 조인
- A는 111, 222, 555 / B는 111, 222, 333, 444 > 각 테이블의 111과 222 튜플 연결해서 조인
#2 왼쪽 외부 조인
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A LEFT JOIN 도서가격 B
ON A.책번호 = B.책번호;
A.책번호 | A.책명 | B.책번호 | B.가격 |
111 | 운영체제 | 111 | 20000 |
222 | 자료구조 | 222 | 25000 |
555 | 컴퓨터구조 | NULL | NULL |
- '도서' 테이블은 A, '도서가격' 테이블은 B 별칭으로 설정 > 왼쪽의 도서 테이블 기준으로 왼쪽 외부 조인
- A와 B가 동일하게 가지는 컬럼인 책번호를 기준으로 조인
- A와 B 모두 111, 222 튜플은 가지고 있으나 B는 555 튜플을 가지고 있지않으므로 NULL 값 기입
#3 오른쪽 외부 조인
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A RIGHT JOIN 도서가격 B
ON A.책번호 = B.책번호;
A. 책번호 | A.책명 | B.책번호 | B.가격 |
111 | 운영체제 | 111 | 20000 |
222 | 자료구조 | 222 | 25000 |
NULL | NULL | 333 | 10000 |
NULL | NULL | 444 | 15000 |
- '도서' 테이블은 A, '도서가격' 테이블은 B 별칭 설정 > 오른쪽에 있는 '도서가격' 테이블 기준으로 오른쪽 외부 조인
- A와 B 테이블 동일하게 가지는 책번호 컬럼 기준으로 조인
- A와 B 모두 111, 222 튜플은 가지고 있으나 B가 가지고 있는 333, 444 튜플은 A에 없으므로 NULL 값 기입
#4 완전 외부 조인
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A FULL JOIN 도서가격 B
ON A.책번호=B.책번호;
A.책번호 | A.책명 | B.책번호 | B.가격 |
111 | 운영체제 | 111 | 20000 |
222 | 자료구조 | 222 | 25000 |
NULL | NULL | 333 | 10000 |
NULL | NULL | 444 | 15000 |
555 | 컴퓨터구조 | NULL | NULL |
- '도서' 테이블은 A, '도서가격' 테이블은 B로 별칭 > 완전 외부 조인
- A와 B의 책번호 컬럼에 공통인 111,222 외에도 A에만 있는 555 튜플과 B에만 있는 333, 444 튜플까지 완전 조인
- 각각의 테이블에 없는 값들은 NULL로 설정하여 기입
#5 교차 조인
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A CROSS JOIN 도서가격 B;
A.책번호 | A.책명 | B.책번호 | B.가격 |
1111 | 운영체제 | 1111 | 20000 |
1111 | 운영체제 | 2222 | 25000 |
1111 | 운영체제 | 3333 | 10000 |
1111 | 운영체제 | 4444 | 15000 |
2222 | 자료구조 | 1111 | 20000 |
2222 | 자료구조 | 2222 | 25000 |
2222 | 자료구조 | 3333 | 10000 |
2222 | 자료구조 | 4444 | 15000 |
5555 | 컴퓨터구조 | 1111 | 20000 |
5555 | 컴퓨터구조 | 2222 | 25000 |
5555 | 컴퓨터구조 | 3333 | 10000 |
5555 | 컴퓨터구조 | 4444 | 15000 |
- '도서' 테이블은 A, '도서가격' 테이블은 B 별칭 설정 > 조건 없이 교차 조인
- A테이블은 2열 3행 , B테이블은 2열 4행 > 2*2=4열, 3*4= 12행 이므로 4열 12행 테이블 생성
- 조건 없으므로 ON 절 없음
- A 테이블의 첫번째 행인 책번호 111, 책명 운영체제 튜플에 B 테이블 전체 붙이기 (4행) > A 테이블 튜플 수만큼 반복
#6 셀프 조인
[ 도서 테이블 ]
책번호 | 책명 | 선수과목_책번호 |
111 | 운영체제 | 222 |
222 | 자료구조 | 555 |
555 | 컴퓨터구조 | NULL |
SELECT A.책번호, A.책명, B.책번호, B.책명
FROM 도서 A JOIN 도서 B
ON A.선수과목_책번호 = B.책번호;
A.책번호 | A.책명 | B.책번호 | B.책명 |
111 | 운영체제 | 222 | 자료구조 |
222 | 자료구조 | 555 | 컴퓨터구조 |
- '도서' 테이블 하나의 테이블에 대해 A, B라는 별칭 별도 설정
- '도서' 테이블(A)의 '선수과목_책번호' 컬럼과 '도서' 테이블(B)의 '책번호' 컬럼을 기준으로 셀프 조인
- A의 선수과목_책번호 컬럼과 B의 책번호 컬럼이 기준 > 선수과목_책번호 컬럼 중 책번호에 값이 있는 222, 555 튜플만 결합
- 조인 조건인 선수과목 책번호 컬럼이 아닌 A.책번호 컬럼을 조회 > 선수과목_책번호가 222인 책번호 111 튜플 & 선수과목_책번호가 555인 책번호 222 튜플 조회
- A 테이블의 선수과목_책번호 컬럼의 값과 B 테이블의 책번호 컬럼의 값이 같은 결과값을 조회 > A 테이블 책번호 111 튜플의 선수과목 책번호 컬럼값인 222를 붙이고 책명에는 222 튜플의 책명인 자료구조 붙이기 > A 테이블 책번호 222 튜플의 선수과목 책번호 컬럼값인 555를 붙이고 책명에는 555 튜플 책명인 컴퓨터 구조 붙이기
- 서브쿼리 (Sub-Query)
- 서브쿼리는 SQL 문 속에 포함된 또 다른 SQL문
- 서브쿼리는 알려지지 않은 기준을 위한 검색에 사용
- 메인쿼리와 서브쿼리는 주종 관계, 서브쿼리의 컬럼 정보는 메인쿼리 컬럼 정보를 사용할 수 있으나 역은 성립 X
- 서브쿼리 유형 (위치 기준)
1. FROM 절 서브쿼리
- 서브쿼리가 FROM 절 안에 들어있는 형태
- 인라인 뷰 (Inline Views) 로 불림
- 뷰(View) 처럼 결과가 동적으로 생성된 테이블 형태로 사용할 수 있음
2. WHERE 절 서브쿼리
- 서브쿼리가 WHERE 절 안에 들어있는 형태
- 중첩 서브쿼리 (Nested Sub-Query)로 불림
[ 도서 테이블 ]
책번호 | 책명 |
111 | 운영체제 |
222 | 자료구조 |
555 | 컴퓨터구조 |
[ 도서가격 테이블 ]
책번호 | 가격 |
111 | 20000 |
222 | 25000 |
333 | 10000 |
444 | 15000 |
[ 서브쿼리 & 결과 ]
# FROM 절 서브쿼리
SELECT MAX(가격) AS 가격
FROM 도서가격 A,
(SLEECT 책번호
FROM 도서
WHERE 책명='자료구조') B
WHERE A.책번호=B.책번호;
- SELECT 책번호 FROM 도서 WHERE 책명 = '자료구조' => 서브 쿼리 결과 값을 B로 명명하여 'B' 테이블로 사용
- 도서 테이블에서 책명이 '자료구조' 여야 하므로 책번호 222 - 책명 자료구조 튜플이 B
- 도서가격의 A 테이블과 서브쿼리에 따른 B 테이블에서 A의 책번호 값과 B 책번호 값이 같은 데이터를 조회
- A 책번호는 111, 222, 333, 444 / B 책번호 222 > 책번호 222 튜플만 조회
- 조회된 데이터의 가격 칼럼에서 최대값을 조회 > 222 밖에 없으므로 222의 책 가격 25000
가격 |
25000 |
# WHERE 절 서브쿼리
SELECT MAX(가격) AS 가격
FROM 도서가격
WHERE 책번호 IN (SELECT 책번호
FROM 도서
WHERE 책명='자료구조');
가격 |
25000 |
- SELECT 책 번호 FROM 도서 WHERE 책명 = '자료구조' > 서브쿼리 결괏값과 책번호가 동일한 데이터 조회
- 도서 테이블에서 책명이 자료구조인 책 번호는 222 > 도서가격 테이블에서 책번호가 222인 데이터 조회
- 책 번호가 222인 데이터 중 가격이 최대인 것 > 25000 출력
- 집합 연산자 (Set Operator)
- 테이블을 집합 개념으로 보고, 두 테이블 연산에 집합 연산자 사용
- 집합 연산자는 여러 질의 결과 연결하여 하나로 결합하는 방식 사용
- 2개 이상의 질의 결과를 하나의 결과로 변경
1. UNION
- 중복 레코드 제외
- 중복 행이 제거된 쿼리 결과 반환
2. UNION ALL
- 중복 레코드 허용
- 중복 행이 제거되지 않은 쿼리 결과 반환
3. INTERSECT
- 중복 레코드만 포함
- 두 쿼리 결과에 공통적으로 존재하는 결과를 반환
4. MINUS
- 비교 레코드 제외
- 첫 쿼리에 있고 두 번째 쿼리에는 없는 결과 반환
[ EMP 테이블 ]
EMPNO | ENAME | JOB | SAL |
1001 | 홍길동 | 대리 | 1000 |
1002 | 임꺽정 | 과장 | 1500 |
1003 | 장길산 | 차장 | 2000 |
1004 | 강은미 | 부장 | 2500 |
[ 쿼리 & 결과 ]
#1 UNION
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
UNION
SELECT ENAME
FROM EMP
WHERE SAL>=1500;
ENAME |
홍길동 |
임꺽정 |
장길산 |
강은미 |
- 두 개 쿼리 결과를 집합 연산자 UNION을 사용 중복 제거하여 조회
- 첫 번째 쿼리는 EMP 테이블에서 SAL 칼럼이 2000 이하인 튜플 중 이름 조회 > 홍길동(1000), 임꺽정(1500), 장길산(2000)
- 두 번째 쿼리는 EMP 테이블에서 SAL 칼럼이 1500 이상인 튜플 중 이름 조회 > 임꺽정(1500), 장길산(2000), 강은미(2500)
- 두 개의 결과를 합하고 중복 제거하므로 둘 다에 있는 임꺽정과 장길산은 한 개만 남기고 삭제 > 홍길동, 임꺽정, 장길산, 강은미 출력
#2 UNION ALL
SELECT ENAME
FROM EMP
WHERE SAL <=2000
UNION ALL
SELECT ENAME
FROM EMP
WHERE SAL >=1500;
ENAME |
홍길동 |
임꺽정 |
장길산 |
임꺽정 |
장길산 |
강은미 |
- 두 개의 쿼리 결과를 집합 연산자 UNION ALL을 사용하여 중복 허용 결과 조회
- 첫 번째 쿼리 결과는 EMP 테이블에서 SAL 칼럼 값이 2000 이하인 데이터의 ENAME 조회 > 홍길동, 임꺽정, 장길산
- 두 번째 쿼리 결과는 EMP 테이블에서 SAL 칼럼 값이 1500 이상인 데이터 ENAME 조회 > 임꺽정, 장길산, 강은미
- UNION ALL은 중복을 허용 > 순서대로 홍길동, 임꺽정, 장길산, 임꺽정, 장길산, 강은미 출력
#3 INTERSECT
SELECT ENAME
FROM EMP
WHERE SAL <= 2000
INTERSECT
SELECT ENAME
FROM EMP
WHERE SAL >=1500;
ENAME |
임꺽정 |
장길산 |
- 두 쿼리 결괏값을 집합 연산자 INTERSECT를 이용하여 교집합 결과만 반환
- 첫 번째 쿼리 결과 > 홍길동, 임꺽정, 장길산 조회
- 두 번째 쿼리 결과 > 임꺽정, 장길산, 강은미 조회
- INTERSECT는 두 결과의 중복된 값인 교집합 값을 반환하므로 임꺽정, 장길산 반환
#4 MINUS
SELECT ENMAE
FROM EMP
WHERE SAL <= 2000
MINUS
SELECT ENAME
FROM EMP
WHERE SAL >= 1500;
ENAME |
홍길동 |
- 두 쿼리 결괏값을 집합 연산자 MINUS를 이용하여 첫 쿼리 결과에 있고 두 번째 쿼리 결과에는 없는 결괏값만 반환
- 첫 번째 쿼리 결과값 > 홍길동, 임꺽정, 장길산
- 두 번째 쿼리 결과값 > 임꺽정, 장길산, 강은미
- 홍길동, 임꺽정, 장길산 중 두 번째 쿼리 결과값과 겹치는 임꺽정, 장길산은 제거하고 홍길동만 반환
[4] INSERT (데이터 삽입) 명령어
- INSERT는 데이터 내용 삽입 시 사용
INSERT INTO 테이블명 ( 속성명1, ... )
VALUES (데이터1, ... )
- 데이터를 삽입할 속성과 삽입 데이터의 데이터 개수, 데이터 타입이 일치해야 함
- 속성명 생략 가능
- 속성 타입이 숫자인 경우, 데이터에 따옴표 X
- 속성 타입이 문자열인 경우, 데이터에 따옴표 O
Ex. [ 학생 ] 테이블에 학번이 6677, 성명 '장길산', 학년 3학년, 수강과목은 '수학'인 학생 삽입
INSERT INTO 학생 (학번, 성명, 학년, 수강과목)
VALUES (6677, '장길산', 3, '수학')
- INSERT 명령어
인인벨
INSERT INTO / VALUES
[5] UPDATE (데이터 변경) 명령어
- UPDATE는 데이터 내용 변경 시, 사용
UPDATE 테이블명
SET 속성명 = 데이터, ...
WHERE 조건;
- WHERE 절을 통한 조건 만족할 경우만, 특정 컬럼값 수정하는 용도로 자주 사용
Ex. [ 학생 ] 테이블에 장길산 주소 인천으로 수정
UPDATE 학생
SET 주소 = '인천'
WHERE 성명 = '장길산';
- UPDATE 명령어
업셋웨
UPDATE / SET / WHERE
[6] DELETE (데이터 삭제) 명령어
- DELETE는 데이터 내용 삭제 시 사용
DELETE FROM 테이블명
WHERE 조건;
- 모든 레코드 삭제 시, WHERE 절 없이 DELETE FROM 만 사용
- 레코드 삭제해도 테이블 구조는 남기 때문에 디스크에서 테이블을 완전히 삭제하는 DROP 명령과 다름
- DELETE 명령어
델프웨
DELETE FROM / WHERE
(4) 데이터 제어어 (DCL; Data Control Language)
- 데이터 제어어는 데이터베이스 관리자(DBA) 가 데이터 보안, 무결성 유지, 병행 제어, 회복을 위해 사용하는 제어용 언어
1. GRANT - 사용 권한 부여
: 관리자(DBA)가 사용자에 데이터베이스에 대한 권한을 부여하는 명령어
2. REVOKE - 사용 권한 취소
: 관리자(DBA)가 사용자에 부여했던 권한 회수하는 명령어
- GRANT (권한 부여) 명령어
- 데이터베이스 관리자 (DBA; Data Base Administrator)가 사용자에 데이터베이스에 대한 권한 부여하는 명령어
GRNAT 권한 ON 테이블 TO 사용자;
- 관리자가 사용자에 테이블에 대한 권한 부여
Ex. 관리자가 사용자 장길산에 '학생' 테이블에 대해 UPDATE 할 수 있는 권한 부여
GRANT UPDATE ON 학생 TO 장길산;
- GRANT 명령어
그온투
GRANT / ON / TO
- REVOKE (권한 회수) 명령어
- 데이터베이스 관리자(DBA)가 사용자에 부여했던 권한 회수하는 명령어
REVOKE 권한 ON 테이블 FROM 사용자;
- 관리자가 사용자에 부여했던 테이블에 대한 권한 회수
Ex. 관리자가 사용자 장길산에 '학생' 테이블에 대해 UPDATE 할 수 있는 권한 회수
REVOEK UPDATE ON 학생 FROM 장길산;
- REVOKE 명령어
리온프
REVOKE / ON / FROM
'WorkOut > 정보처리기사' 카테고리의 다른 글
SQL 활용 및 최적화 (0) | 2024.04.09 |
---|---|
응용 SQL | 집계성 SQL (0) | 2024.04.09 |
SQL 응용 | 데이터베이스 기본 _DDL (2) | 2024.04.04 |
SQL 응용 | 데이터베이스 기본_트랜잭션 (0) | 2024.04.04 |
파이썬 | 함수와 클래스 (4) | 2024.03.29 |