관계 데이터베이스 언어 정의 및 종류
관계 데이터베이스 언어 정의 및 종류
SQL의 개요
-
관계 데이터베이스 시스템의 표준 언어
-
데이터 정의어(DDL), 데이터 조작어(DML) 그리고 데이터 제어어(DCL)의 기능을 모두 제공함
-
뿐만 아니라 다양한 객체(시퀀스, 인덱스 등)을 생성 및 제어하는 역할을 함
-
데이터베이스 <=> SQL (Structured Query Language) <=> [조회,입력,수정,삭제하는 등의 조작, 다양한 객체(뷰,인덱스)를 생성 및 제어]
SQL의 역사
-
1974년, IBM 연구소에서 데이터베이스 시스템 개발
- 시스템 R을 질의하기 위해서 만들어진 구조화된 언어
-
SEQEL (Structured English Query Language)라고 이름을 지음
-
SQL은 이후 IBM의 DB2와 SQL/DS 데이터베이스 시스템에서도 구현
SQL의 특징
-
온라인 터미널을 통해 대화식 질의어로 사용가능 함
-
범용 프로그래밍 언어로 쓰여진 응용 프로그램에 삽입된 형태로도 사용이 가능함
- Java, COBOL, C, C++등..
-
개개의(각자의) 레코드 단위로 처리하기 보다는 레코드 집합 단위로 처리
-
SQL명령문에서 데이터 처리를 위한 접근 경로(Access Path)에 대한 명세가 필요하지 않으므로 선언적 언어임
-
릴레이션(Relation), 튜플(Tuple), 속성(Attribute)와 같은 관계 모델의 공식적 용어 대신
이에 대응하는 테이블(Table), 행(Row), 열(Column)과 같은 일반적인 용어를 사용
SQL의 유형
-
대화식 SQL (Interactive SQL)
- 화면에 명령을 넣고, 결과가 바로 화면으로 나오는 방식
- 대화식 SQL <=> 관계 DNMS <=> 데이터베이스
-
내포된 SQL (embedded SQL)
- Java, COBOL, C, C++ 등과 같은 고급 프로그래밍 언어 사이에 SQL문을 끼어 넣는 방식
- 호스트 언어 + 대화식 SQL <=> 관계 DNMS <=> 데이터베이스
유형 | 명령문 |
---|---|
DQL : Data Query Language (데이터 검색) | * SELECT (데이터 검색 시 사용) |
DML : Data Manipulation Language (데이터 조작어 - 데이터 변경시 사용) | * INSERT (데이터 입력) * UPDATE (데이터 수정) * DELETE (데이터 삭제) |
DDL : Data Definition Language (데이터 정의어 - 객체 생성 및 변경 시 사용) | * CREATE (데이터베이스 생성) * ALTER (데이터베이스 변경) * DROP (데이터베이스 삭제) * RENAME (데이터베이스 객체이름 변경) * TRUNCATE (데이터베이스 저장 공간 삭제) |
TCL : Transaction Control Language (트랜잭션 처리어) | * COMMIT (트랜잭션의 정상적인 종료처리) * ROLLBACK (트랜잭션 취소) * SAVEPOINT (트랜잭션 내에 임시 저장점 설정) |
DCL : Data Control Language (데이터 제어어) | * GRANT (데이터베이스에 대한 일련의 권한 부여) * REVOKE (데이터베이스에 대한 일련의 권한 취소) |
데이터 정의어 (DDL : Data Definition Language)
- CREATE : 데이터베이스에 객체를 생성
- DROP : 데이터베이스에 객체를 제거
- ALTER : 데이터베이스에 객체를 수정
테이블 생성1 - department 테이블을 생성
create table <테이블이름> (<필드리스트>)필드리스트>테이블이름>
-- 질의 1
-- dept_id는 필드명 (변수처럼 의미있는 네이밍 필요)
-- 테이블, 필드 이름에 공백 금지, 특수문자 ($, #, _ 제외), 30자 초과 X, 예약어 안됨
-- 한테이블안에 같은 테이블 같은 필드명 사용 금지
-- varchar()는 데이터 타입
-- not null은 해당 필드, NULL 값 X
create table department
{
dept_id varchar(10) not null,
dept_name varchar(14) not null,
office varchar(10)
}
필드 삭제 형식
drop table <테이블 이름="">테이블>
-
주의 사항
-
다른 테이블에서 외래키로 참조되는 경우에는 삭제할 수 없음
- foreign key 제약 조건, 외래키 제약 조건
-
class 테이블은 takes 태이블에서 외래키로 참조됨
-
takes 테이블을 삭제하기 전에는 class 테이블을 삭제할 수 없음
-
테이블 수정1 - 추가
-
기존 테이블에 새로운 필드를 추가하거나 기존 필드를 삭제
-
필드 추가 형식
-
alter table <테이블이름> add <추가할필드>추가할필드>테이블이름>
-
student 테이블에 age 필드를 추가
alter table student add age int
-
테이블 수정2 - 삭제
-
필드 삭제 형식
- alter table <테이블이름> drop column <삭제할필드>삭제할필드>테이블이름>
alter table student drop column age
데이터 정의어 : 기본키, 외래키 관련 주의사항 (테이블 삭제)
-
외래키가 필드로 갖는 테이블을 생성할 때 : 외래키가 참조하는 테이블을 먼저 생성
- 만일 department 테이블이 존재하지 않는 상태에서 student 테이블을 먼저 생성하면 오류 발생
-
테이블을 삭제할 때도 같은 문제가 발생함
-
member 테이블이 있는 한 dept 테이블을 삭제할 수 없음
-
dept 테이블을 삭제하려면 member 테이블을 먼저 삭제하던지, 외래키를 해제해야 함
데이터 조작어 (DML : Data Manipulation Language)
- 데이터베이스에 들어 있는 데이터를 조회하거나 검사하기 위한 명령어를 말함
- select (검색), insert (삽입), update (수정), delete (삭제)가 있음
레코드 삽입
insert into <테이블이름> (<필드리스트>) values (<값리스트>)값리스트>필드리스트>테이블이름>
- 필드리스트 : 삽입에 사용될 테이블의 필드들
- 값리스트 : 필드리스트의 순서에 맞춰 삽입될 값
- 필드리스트에 나열되지 않은 필드에 대해서는 널값이 입력됨
- 필드리스트를 생략할 경우 <값리스트>에는 테이블을 생성할 때 나열한 필들의 순서에 맞춰서 값을 나열값리스트>
- 삽입 명령문에 필드 이름을 나열할 경우 그 순서는 테이블을 생성할 때 지정한 순서와 반드시 일치할 필요는 없음
insert into department (dept_id, dept_name, office)
values ('920', '컴퓨터공학과', '201호')
insert into department (office, dept_id, dept_name)
values ('201호', '920', '컴퓨터공학과')
레코드 수정
update <테이블 이름="">
set <수정내역>
where <조건>
조건>수정내역>테이블>
-
수정내역
- 대상 테이블의 필드에 들어가는 값을 수정하기 위한 산술식
- ’,’를 이용해서 여러 필드에 대한 수정 내역을 지정
-
조건
- 대상이 되는 레코드에 대한 조건을 기술
- 관계대수에서 선택 연산의 조건식과 같은 의미
- 테이블의 모든 레코드에 대해 수정을 적용하려면 where 절을 생략
-- student 테이블에서 모든 학생들의 학년을 하나씩 증가
update student
set year = year + 1
-- professor 테이블에서 '고희석' 교수의 직위를 '교수'로 수정하고 학과번호를 '923'으로 수정
update professor
set position='교수', dept_id='923'
where name='고희석'
레코드 삭제
- where절에 지정된 조건을 만족하는 레코드를 삭제
- where절이 생략되면 테이블에서 모든 레코드를 삭제
delete from <테이블이름>
where <조건>
조건>테이블이름>
delete from professor
where name='김태석'
데이터 조작어 : 기본키, 외래키 관련 주의사항
-
외래키로 사용되는 필드에 대해 데이터를 삽입할 때
-
참조하는 테이블의 해당 필드에 그 값을 먼저 삽입해야 함
-
department 테이블이 생성되긴 헀지만 아직 레코드가 삽입되지 않은 상태에서 다음 질의의 실행 결과
insert into student values ('1292002', '900305-1730021', '김정현', 3, '서울', '920')
-> 무결성 제약 조건에 위배되었습니다. (부모키 X)
-
레코드 검색 - 기본구조
select <필드리스트>
from <테이블리스트>
where <조건>
조건>테이블리스트>필드리스트>
- select : 질의 결과로 출력할 필드들의 리스트, 관계대수의 추출연산에 해당
- from : 질의 실행과정에 필요한 테이블들의 리스트를 관계대수의 카티션 프로덕트
- where : 검색되어야 하는 레코드에 대한 조건, 관계대수의 선택연산에서 생략 가능
select name, dept_name
from department, student
where department.dept_id = student_dept_id
- from절에 나열된 department 테이블과 student 테이블을 카티션 프로덕트
- where 절에 지정된 조건식을 만족하는 레코드만 선택 : 같은 이름의 필드가 두 개 이상의 테이블을 나타낼 때
혼동을 피하기 위해 ‘테이블 이름.필드이름’으로 표현 - 최종적으로 name 필드와 dept_name 필드의 값만을 추출하라
- from 절에 나타난 테이블에서 모든 필드의 값을 추출할 경우에는 select 절에 모든 필드를 명시할 필요없이 ‘*‘를 사용
-- student 테이블에서 모든 레코드의 모든 필드 값을 추출
select *
from student
- select 절에 필드이름 외에 산술식이나 상수의 사용이 가능
-- professor 테이블에서 교수의 이름과 현재까지의 재직연수를 검색
select name, 2012-year_emp
from professor
- from 절에 두 개 이상의 테이블이 포함된 질의
-- select문은 학생들의 이름, 학번, 그리고 소속 학과의 이름을 검색
select student.name, student.stu_id, department.dept_name
from student, department
where student.dept_id = department.dept_id
레코드 검색 - 레코드의 순서 지정
-
검색 결과를 정렬하여 출력하는 기능 : select문 맨 마지막에 다음과 같은 order by절을 추가
- order by <필드리스트>필드리스트>
-
오름차순을 기본으로 하며 <필드리스트>에 여러 개의 필드를 나열할 경우 나열된 순서대로 정렬필드리스트>
-- student 테이블에서 3,4학년 학생들의 이름과 학번을 검색 (오름차순 정렬)
select name, stu_id
from student
where year=3 or year=4
order by name, stu_id
레코드 검색 - 재명명 연산
-- student 테이블과 department 테이블을 조인하여 학생들의 이름과 소속 학과 이름을 검색
select student.name, department.dept_name
from student, department
where student.dept_id = department.dept_id
select s.name, d.dept_name
from student s, department d
where s.dept_id = d.dept_id
레코드 검색 - like 연산자
-
문자열에 대해서는 일부분만 일치하는 경우를 찾아야 할 때 사용
-
’=’ 연산자 대신에 ‘like’ 연산자를 이용함
-
’=’는 정확히 일치하는 경우에만 사용
-
형식
-
where <필드이름> like <문자열패턴>문자열패턴>필드이름>
- <필드이름>에 지정된 <문자열패턴>이 들어 있는지를 판단 문자열패턴>필드이름>
-
-- student 테이블에서 김씨 성을 가진 학생들을 찾는 질의
select *
from student
where name like '김%'
-- student 테이블에서 여학생들만을 검색
select *
from student
where resident_id like '%-2%'
레코드 검색 - 집합 연산
-
관계대수의 집합 연산인 합집합, 교집합, 차집합에 해당하는 연산자
- Union
- Intersect
- Minus
-
형식
- where <필드이름> like <문자열패턴>문자열패턴>필드이름>
-
조건
<select문 1>
과<select문 2>
의 필드의 개수와 데이터타입이 서로 같아야 함
-- student 테이블의 학생 이름과 professor 테이블의 교수 이름을 합쳐서 출력
select name from student
union
select name from professor
-- 컴퓨터공학과 학생들 중에서 교과목에 상관없이 학점을 'A+' 받은 학생들의 학번을 검색
select s.stu_id
from student s, department d, takes t
where s.dept_id = d.dept_id and
t.stu_id = s.stu_id and
dept_name='컴퓨터공학과' and grade = 'A+'
레코드 검색 - 외부조인 : 완전 외부조인
- student 테이블에서 여학생들만을 검색
- 양쪽 테이블에서 서로 일치하는 레코드가 없을 경우, 해당 레코드들도 결과 테이블에 포함시키며
나머지 필드에 대해서는 모두 널을 삽입
select title, credit, year, semester
from course full outer join class
using (course_id)
레코드 검색 - 집계 함수
-
통계연산 기능 제공
-
count : 데이터의 개수를 구함
-- student 테이블에서 3학년 학생이 몇 명인지 출력 select count(*) from student where year = 3 -- student 테이블에서 dept_id 필드에 값이 몇 개인지를 출력 select count(dept_id) from student
-
sum : 데이터의 합을 구함 (sum (<필드이름>))필드이름>
-- 전체 교수들의 재직연수 합 select sum(2012 - year_emp) from professor
-
avg : 데이터의 평균 값을 구함 (avg (<필드이름>))필드이름>
-- 전체 교수들의 평균 재직연수를 출력 select avg(2012 - year_emp) from professor
-
max : 데이터의 최대 값을 구함 (max (<필드이름>))필드이름>
-
min : 데이터의 최소 값을 구함 (min (<필드이름>))필드이름>
-- 부서 이름이 'ACCOUNTING'인 직원들 중에서 최대 급여가 얼마인지 출력 select max(sal) from emp e, dept d where e.deptno = d.deptno and dname = 'ACCOUNTING'
-
group by : 지정된 필드의 값딩 같은 레코드들끼리 그룹을 지어 각 그룹별로 집계 함수를 적용한 결과를 출력 (group by (<필드리스트>))필드리스트>
- group by 절에 사용된 필드를 select 절에 추가하여 사용할 수 있음
-- student 테이블에서 학과번호(dept_id 필드)별로 레코드의 개수를 출력 select dept_id, count(*) from student group by dept_id
- having (having (<집계함수 조건="">))집계함수>
-- 평균 재직연수가 10년 이상인 학과에 대해서만 교수 숫자와 -- 평균 재직연수, 최대 재직연수를 출력 select dept_name, count(*), avg (2012 - year_emp), max(2012 - year_emp) from professor p, department d where p.dept_id = d.dept_id group by dept_name having avg(2012 - year_emp) >= 10
-
-
select 절과 having절에서만 사용가능
-
sum, avg는 숫자형 데이터 타입을 갖는 필드에만 적용가능
레코드 검색 - 중첩 질의
-
SQL문을 다른 SQL문 안에 중첩하여 사용하는 질의
-
복잡한 질의를 쉽게 표현할 수 있는 수단을 제공
-
내부질의 (Inner Query), 부질의 (Subquery) : 내부에 포함된 SQL 문
-
외부질의 (Outer Query) : 부 질의를 내부적으로 갖는 SQL 문
-
부 질의는 외부 질의의 from 절이나 where 절에 위치
-
종류
-
in, not in
-
=some, <= some, < some, > some, >= some, <>some
- some 대신 any를 사용해도 됨
-
=all, <=all, <all, >all, >=all, <>all
-
exist, not exist
-
-- 301호 강의실에서 개설된 강좌의 과목명을 출력
select title
from course
where course_id in
(select distinct course_id
from class
where classroom='301호')
select distinct title
from course c1, class c2,
where c1.course_id = c2.course_id and
classroom = '301호'
-
부 질의 검색 결과에 최소한 하나 이상의 레코드가 존재하는지의 여부를 표현
-
exists : 최소한 한 개의 레코드가 존재하면 참이 되고 그렇지 않으면 거짓
-
not exist : 부 질의의 결과가 레코드에 하나도 없으면 참이 되고 하나라도 존재하면 거짓
-
-- 301호 강의실에서 개설된 강좌의 과목명을 출력
select title
from course
where exists
(select *
from class
where classroom='301호' and
course.course_id = class.course_id)
데이터 제어어 (DCL : Data Control Language)
-
데이터베이스를 공동으로 사용하기 위한 데이터 제어를 정의하고 기술하는 언어
-
commit, rollback, revoke, grant가 있음
- 이 중 트랜잭션을 제어하는 commit, rollback 만을 TCL (Transaction Control Language)이라고 분리하기도 함
데이터 제어어 역할
구분 | 역할 |
---|---|
데이터 보안 (Security) | 불법적인 사용자로부터 데이터를 보호 |
무결성 (Integrity) | 데이터의 정확성 유지 |
회복 (Recovery) | 시스템 장애에 대비 |
병행수행제어 (Concurrency Control) | 여러 수행자가 DB에 동시 접근 가능 |
데이터 제어어 종류
-
grant
- grant 명령은 유저에게 오브젝트에 대한 사용권한 부여
-
revoke
- revoke 명령은 유저에게서 사용권한을 회수
-
deny
- 유저에게 사용권한을 거부하도록 할 때 사용함
- grant와 deny가 동시에 부여될 경우 deny가 우선
뷰 (View)
-
기존 테이블로부터 생성되는 가상의 테이블
- 테이블처럼 물리적으로 생성되는 것이 아니라 기존의 테이블들을 조합하여
사용자게에 실제로 존재하는 테이블인 것처럼 보이게 함
- 테이블처럼 물리적으로 생성되는 것이 아니라 기존의 테이블들을 조합하여
-
특정 사용자에게 테이블의 내용 중 일부를 숨길 수 있기 때문에 보안의 효과
-
복잡한 질의의 결과를 뷰로 만들어서 사용하게 되면 질의를 간단히 표현할 수 있음
-
생성된 뷰는 테이블과 동등하게 사용
-
형식
- create or replace view <뷰이름> as 뷰이름>
- or replace 키워드를 추가하면 <뷰이름>과 같은 뷰가 이미 존재하는 경우 기존의 뷰를 지우고 새로 생성뷰이름>
-- takes 테이블에서 grade 필드를 제외한 나머지 필드만으로 구성된 뷰를 생성
create or replace view v_takes as
select stu_id, classs_id
from takes
create or replace view cs_student as
select s.stu_id, s.resident_id, s.name, s.year, s.address, s.dept_id
from student s, department d
where s.dept_id = d.dept_id and
d.dept_name = '컴퓨터공학과'