SQL3: DML SQL
이 글에서는 University Database가 사용된다.
Data Manipulation language는 데이터베이스의 데이터를 조작하는 언어로 4개의 연산을 제공한다.
- Select: 데이터베이스에 있는 테이블에서 어떤 조건을 만족시키는 데이터를 검색하기 위해서 사용한다.
- Insert: 테이블에 데이터를 추가할 수 있게 해준다.
- Delete: 조건을 만족시키는 tuple을 찾아 삭제한다.
- Update: 조건을 만족시키는 tuple을 찾아 값을 경신하고 싶을 때 사용한다.
Insertion
테이블에 tuple을 추가할 수 있게 해주는 명령이다.
Insert into course values('437', 'Advanced Databases', 'CS', 4);
Course라는 테이블에 튜플을 추가하는 SQL문이다. 튜플을 표현할 때는 values를 사용한다.
또한 다음과 같이 각각의 column명에 대응해서 튜플을 삽입할 수도 있다.
Insert into course (cID, title, deptName, credit)
values('427', 'Advanced Databases', 'CS', 4);
column값으로 null값을 줄 수도 있다.
Insert into course values (’777’, ’undecided’, ’CS’, null);
Deletion
조건을 만족시키는 tuple을 삭제하는 명령이다.
Delete from professor;
조건을 따로 명시하지 않을 때는 prefessor 테이블의 모든 tuple을 삭제한다.
Delete from professor where deptName = 'EE'
조건을 주게 되면 해당 조건에 맞는 튜플을 삭제해 준다. 위 SQL문에서는 prefessor 테이블의 deptName 속성 값이 'EE'인 튜플을 삭제한다.
ex) Vision Hall에서 근무하는 학과에 있는 교수 테이블(professor)의 tuple을 삭제하라.
Delete from professor
where deptName in ( select deptName
from department
where building = ’Vision Hall’);
다음과 같이 SQL조건문 안에 집계 함수가 사용된 경우, 계산된 값을 매번 구하지 않고 한 번만 계산해 튜플이 삭제된다고 해도 집계 함수의 결과가 갱신되지 않도록 데이터베이스 시스템이 똑똑하게 동작한다.
Delete from professor
where salary < (select avg (salary) from professor);
Update
조건을 만족시키는 테이블의 column값을 경신하는 명령이다.
ex1) 연봉이 7000보다 클 경우에는 연봉을 3% 인상, 아니라면 5% 인상하라
Update professor
set salary = salary*1.03
where salary > 7000;
Update professor
set salary = salary*1.05
where salary <= 7000;
두 개의 Update문을 사용해서 먼저 연봉이 7000보다 넘는 교수의 연봉을 3% 인상시키고, 그 후 7000보다 낮은 연봉을 받는 교수의 연봉을 5% 인상시켰다. 그런데 만약 연봉이 7000보다 낮은 연봉을 받은 교수의 업데이트를 먼저 수행했다면, 업데이트 후에 연봉이 7000이 넘게 되어 연봉이 두 번 인상되는 경우가 발생할 수 있다. 이러한 순서로 인해 발생하는 실수를 막기 위해서 다음과 같이 case 문을 이용하여 작성할 수도 있다.
Update professor
set salary = case
when salary <= 7000 then salary*1.05
else salary*1.03
end;
ex2) 모든 학생의 현재까지 이수한 학점을 갱신하라.
Update student S
set S.totalCredit = ( select sum(credit)// scalar subquery
from takes natural join course
where S.sID takes.sID and grade <> 'F' and grade is not null);
Update Student S는 Student 테이블을 앞으로 S라는 변수로 사용한다는 것을 의미한다.
Select 문을 제외한 나머지 Insert, Update, Delete DML SQL 문법에 대해서 살펴보았다. Select문은 다른 것들과 함께 설명할 것이 많아 다른 글에서 설명하기로 한다.