[데이터베이스] 중급 SQL
2025-04-22
4분 분량
데이터베이스
1. 조인 표현식
1.1 자연 조인 (Natural Join)
- student 릴레이션과 takes 릴레이션을 조인
- 공통 속성인 ID를 기준으로 조인
sql
select name, course_id
from student natural join takes;- student와 takes를 ID 속성으로 자연 조인
- 두 릴레이션에서 속성명이 같은 경우 한 번만 출력
1.2 조인 순서와 동작
- student natural join takes를 먼저 계산한 후
sql
select name, title
from student natural join takes, course
where takes.course_id = course.course_id;- 자연 조인을 연속으로 사용할 수도 있음
sql
select name, title
from student natural join takes natural join course;- 이 경우, 공통 속성인 dept_name, course_id도 일치해야 함
1.3 join ... using 구문
- 조인 속성을 명시적으로 지정
sql
select name, title
from (student natural join takes) join course using (course_id);- dept_name과 같은 다른 속성은 일치하지 않아도 됨
1.4 on 조건을 이용한 조인
- 조인 조건을 on 절로 명시
sql
select *
from student join takes on student.ID = takes.ID;- 결과에 ID 속성이 두 번 나타남 (student.ID, takes.ID)
- 자연 조인과 유사하지만 중복 속성 제거 차이 존재
1.5 외부 조인 (Outer Join)
- 내부 조인: 일치하는 튜플만 결과에 포함
- 외부 조인: 일치하지 않는 튜플도 널 값으로 결과에 포함
1) 왼쪽 외부 조인 (Left Outer Join)
sql
select *
from student natural left outer join takes;- student 릴레이션의 모든 튜플을 보존
- 수강하지 않은 학생 정보도 출력
- 수강하지 않은 학생 찾기:
sql
select ID
from student natural left outer join takes
where course_id is null;2) 오른쪽 외부 조인 (Right Outer Join)
sql
select *
from takes natural right outer join student;- takes 릴레이션 기준으로 모든 튜플을 보존
3) 전체 외부 조인 (Full Outer Join)
sql
select *
from (select * from student where dept_name = 'Comp. Sci.')
natural full outer join
(select * from takes where semester = 'Spring' and year = 2017);- 두 릴레이션의 모든 튜플을 보존
- 일치하지 않는 튜플은 널 값으로 채움
2. 뷰
2.1 뷰 개념
- 가상 릴레이션: 실제 데이터를 저장하지 않고 질의 결과로 구성
- create view 명령어로 생성
sql
create view faculty as
select ID, name, dept_name
from instructor;- 뷰를 기반으로 또 다른 뷰 생성 가능
sql
create view physics_fall_2017 as
select course.course_id, sec_id, building, room_number
from course, section
where course.course_id = section.course_id
and course.dept_name = 'Physics'
and section.semester = 'Fall'
and section.year = 2017;2.2 뷰 사용 예시
- 뷰를 릴레이션처럼 사용 가능
sql
select course_id
from physics_fall_2017
where building = 'Watson';- 뷰 속성 이름 명시:
sql
create view departments_total_salary (dept_name, total_salary) as
select dept_name, sum(salary)
from instructor
group by dept_name;2.3 실체화 뷰
- 뷰 결과를 미리 계산하여 저장
- *뷰 관리(view maintenance)**를 통해 최신 상태 유지
- 수정 시마다 또는 주기적으로 갱신
2.4 뷰의 갱신
- 뷰를 통한 삽입/수정/삭제는 문제 발생 가능
- 예: salary 속성이 없는 faculty 뷰에 삽입 시
sql
insert into faculty values ('30765', 'Green', 'Music');- instructor 릴레이션의 salary 값을 입력하지 않아 오류 발생
- 해결 방법:
3. 트랜잭션
3.1 트랜잭션 개념
- 질의와 갱신문의 순차적 실행 단위
- 자동으로 시작, 다음 명령어로 종료:
- commit work: 변경 내용 영구 반영
- rollback work: 변경 내용 취소
- 시스템 장애 발생 시 rollback으로 복구
4. 무결성 제약 조건
4.1 기본 제약 조건
- not null: 속성에 널 값 금지
- unique: 속성 값 유일성 보장
- check: 조건을 만족하는지 검사
sql
create table department (
dept_name varchar(20),
building varchar(15),
budget numeric(12,2) check (budget > 0),
primary key (dept_name)
);4.2 참조 무결성
- foreign key: 다른 릴레이션의 주 키 참조
sql
create table course (
course_id varchar(8),
title varchar(50),
dept_name varchar(20),
credits numeric(2,0) check (credits > 0),
primary key (course_id),
foreign key (dept_name) references department
);참조 동작:
- on delete cascade: 참조되는 튜플 삭제 시 연쇄 삭제
- on delete set null: 참조 필드를 널 값으로 설정
- on update cascade: 갱신 시 참조 필드도 갱신
5. SQL의 데이터 타입과 스키마
5.1 날짜와 시간 타입
- date:
YYYY-MM-DD - time(p):
HH:MM:SS(초의 소수점 p자리) - timestamp(p):
YYYY-MM-DD HH:MM:SS.ssssss - extract(field from d): 특정 연월일/시간 추출
5.2 타입 변환과 서식 함수
- cast(e as t): 데이터 타입 변환
sql
select cast(ID as numeric(5)) as inst_id
from instructor
order by inst_id;- coalesce: 널 값 처리
sql
select ID, coalesce(salary, 0) as salary
from instructor;6. 인덱스
6.1 인덱스 생성
- create index:
sql
create index dept_index on instructor (dept_name);- unique index: 후보 키 선언 가능
sql
create unique index dept_index on instructor (dept_name);- drop index index_name: 인덱스 제거
7. 권한
7.1 권한 부여와 취소
- grant:
sql
grant select on department to Amit, Satoshi;
grant update (budget) on department to Amit, Satoshi;- revoke:
sql
revoke select on department from Amit, Satoshi;7.2 역할
- create role instructor
- grant select on takes to instructor
- 역할 간 계층:
sql
create role dean;
grant instructor to dean;
grant dean to Satoshi;7.3 특권 양도
- grant ... with grant option:
sql
grant select on department to Amit with grant option;- revoke grant option for select:
sql
revoke grant option for select on department from Amit;- cascade와 restrict 옵션 사용 가능
함께 읽으면 좋은 글
CS2025-04-22
[데이터베이스] 고급 SQL
SQL은 선언형 질의어로 데이터 처리에 강력하지만 동적 SQL (Dynamic SQL): 내장 SQL (Embedded SQL): Java에서 데이터베이스 접근을 위한 표준 API DriverManager.getConnection() 사용 매개변수: Statement 객체로…
CS2025-04-22
[데이터베이스] SQL
1970년대 초: IBM이 Sequel이라는 SQL 초기 버전 개발 SQL (Structured Query Language)로 명칭 변경 1986년: ANSI와 ISO가 SQL-86 표준 발표 이후 SQL-89, SQL-92, SQL:1999, SQL:2003,…
CS2025-04-22
[데이터베이스] 관계형 모델 소개
상업용 데이터 처리 응용을 위한 주요 데이터 모델 네트워크 모델이나 계층형 모델에 비해 프로그래머 작업을 쉽게 해주는 단순성으로 널리 사용됨 객체 지향 특징 지원: 복잡한 데이터 타입, 저장형 프로시저 XML 데이터 및 반구조형 데이터 지원 관계형 데이터베이스:…
CS2025-04-22
[데이터베이스] 데이터베이스 기본 개념
서로 관계 있는 데이터들의 모임과 그 데이터에 접근하기 위한 프로그램의 집합으로 구성됨 DBMS의 목적: 데이터베이스에 정보를 저장하고 이를 검색하기 위한 편리하고도 효율적인 환경 제공 1960년대: 상업용 데이터 관리 목적으로 개발 초기 응용: 단순하고 구조화된…