SQL(Structed Query Language)은 DBMS에서 자료의 검색과 관리, 데이터베이스 스키마 생성 및 수정, 데이터베이스 객체 접근 조정을 위해 사용된다. 쉽게 말해 데이터베이스 언어인 셈이다. SQL은 아래와 같이 세가지로 분류된다.
① relation의 이름을 명시한다.
Create Table Employee
② attribute의 이름, Domain Constraints, Null Constraints를 명시한다.
Create Table Employee
(FName VARCHAR(15) Not NUll,
MInit CHAR,
LName VARCHAR(15) Not NUll,
Ssn CHAR(9) Not Null,
BDate Date,
Address VARCHAR(30),
Gender Char,
Salary Decimal(10, 2),
SupperSsn CHAR(9),
DNo Int Not Null
③ Key Constraints, Entity Integrity Constraints, Referential Integrity Constraints를 명시한다.
Create Table Employee
(FName VARCHAR(15) Not NUll,
MInit CHAR,
LName VARCHAR(15) Not NUll,
Ssn CHAR(9) Not Null,
BDate DATE,
Address VARCHAR(30),
Gender CHAR,
Salary DECIMAL(10, 2),
SupperSsn CHAR(9),
DNo INT Not Null,
Primary Key(Ssn),
Foreign Key(SuperSsn) References Employee(Ssn),
Foreign Key(DNo) References Department(DNumber));
아직 Department 테이블이 만들어지지 않았기 때문에 위의 Create Table 명령은 실행되지 않는다. 하지만, Department도 Employee의 pk를 필요로 하기 때문에(순환 참조) Department를 먼저 만드는 것도 불가능하다. 이럴 때에는 둘 중 아무 테이블이나 일단 외래키 부분을 뺀 상태로 Create하고, 나중에 Alter Table 명령으로 fk를 연결해야 한다.
위에서 배운 사용법대로, 아래의 스키마를 참조하여 Create Table 문을 작성해보자.
① Department
Create Table Department
(DName VARCHAR(15) Not Null,
DNumber INT Not Null,
MgrSsn CHAR(9) Not Null,
MgrStartDate DATE,
Primary Key(DNumber),
Unique(DName),
Foreign Key(MgrSsn) References Employee(Ssn));
② Dept_Locations
Create Table Dept_Location
(DNumber INT Not Null,
DLocation VARCHAR(15) Not Null,
Primary Key(DNumber, DLocation),
Foreign Key(DNumber) References Department(DNumber));
③ Project
Create Table Project
(Pname VARCHAR(15) Not NUll,
PNumber INT Not Null,
PLocation VARCHAR(15),
DNum INT Not Null,
Primary Key(PNumber),
Unique(PName),
Foreign Key(DNum) References Department(DNumber));
④ Works_On
Create Table Works_On
(ESsn CHAR(9) Not Null,
PNo INT Not Null,
Hours DECIMAL(3,1) Not Null,
Primary Key(ESsn, PNo),
Foreign Key(ESsn) References Employee(Ssn),
Foreign Key(PNo) References Project(PNumber));
⑤ Dependent
Create Table Depedent
(ESsn CHAR(9) Not Null,
DependentName VARCHAR(15) Not Null,
Gender CHAR,
BDate DATE,
Relationship VARCHAR(8),
Primary Key(ESsn, DependentName),
Foreign Key(ESsn) References Employee(Ssn));
Select {attribute 이름} From {테이블 명} Where {조건}의 형태로 쓰이며, 이 때 각 중괄호에는 여러 개의 값이 들어갈 수 있다. 이 내용을 바탕으로 이름이 John B. Smith인 사원의 BDate와 Address를 검색하는 쿼리를 작성해보자.
Select Bdate, Address
From Employee
Where FName='John' And MInit='B' And LName='Smith';
실행 결과는 아래와 같다.
Employee의 Dno와 Department의 DNumber가 같은 모든 튜플을 검색해보자. 이 쿼리의 결과는 사원의 소속 부서에 대한 정보를 함께 보고 싶을 때 용이할 수 있다.
① Implicit Notation(암시적 표현)
Select *
From Employee e, Department d
where e.Dno = d.DNumber;
② Explicit Notation(명시적 표현)
Select *
From Employee e
Inner Join Department d
On e.Dno = d.DNumber;
보다시피 조금 더 간단한 암시적인 표현이 더 일반적으로 사용된다. 참고로, From 뒤에 나오는 테이블의 순서를 바꾸면 결과 테이블의 순서도 뒤바뀐다.
① 교차 조인(Cross Join)
② 내부 조인(Inner Join)
③ 외부 조인(Outer Join)
④ 안티 조인(Anti Join)
⑤ 세미 조인(Semi Join)
⑥ 셀프 조인(Self Join)
Join으로 생성되는 임시 테이블에 Join 연산을 수행하는 것을 중첩 조인이라 한다. 문법은 별로 어렵지 않지만, 주어진 요구 사항을 이해하는 게 매우 어렵고, 쿼리를 해석하는 것도 간단하지가 않다.
선택 조건과 조인 조건을 잘 구분해내는 것이 무엇보다 중요하다. 선택 조건은 테이블에서 특정 튜플을 골라내는 것이고, 조인 조건은 두 테이블 간의 연결 관계를 동등 조인으로 나타내는 것이다. 쉽게 말해 하나의 테이블에 적용되는 조건은 선택 조건, 두 테이블 사이에 적용되는 조건은 조인 조건이다.
① Research 부서에서 일하는 사원의 FName, LName과 Address를 검색하는 쿼리
select e.FName, e.LName, e.Address
from Employee e, Department d
where d.DName='Research' // Department에서 DName이 Research인 행을 선택
and
d.DNumber = e.Dno; // 선택한 Department 행의 DNumber를 Employee의 Dno와 비교한다.
② Stafford에 위치한 프로젝트에 대해 PNumber, DNumber, 부서 관리자의 LName과 Address, BDate를 검색하는 쿼리
select p.PNumber, d.DNumber, e.LName, e.Address, e.BDate
from Project p, Department d, Employee e
where p.PLocation='Stafford' // 선택 조건
and d.Mgr_Ssn=e.Ssn // 조인 조건 1
and p.DNum=d.DNumber; // 조인 조건 2
③ 사원에 대해 FName, LName을, 직속 감독자의 FName, LName을 검색하는 쿼리
select e.FName, e.LName, s.FName, s.LName
from Employee e, Employee s
where e.Super_Ssn=s.Ssn;
④ Research 부서에서 일하는 모든 사원들에 대해 Employee의 모든 attribute와 Department의 모든 attribute를 검색하는 쿼리
select * from Employee e, Department d
where d.DName='Research' // Department에서 DName이 Research인 행을 선택
and
e.DNo = d.DNumber; // 선택한 Department 행의 DNumber를 Employee의 Dno와 비교한다.
⑤ 모든 사원의 구별되는 Salary를 검색하는 쿼리
select distinct salary from employee;
① 집합 연산자
② Like + 와일드카드
select FName, LName
from Employee
where Address like '%Houston TX%';
// 또는 where Address like '*Huston TX*';
select FName, LName
from Employee
where BDate like '__6_______';
// 또는 where BDate like '??6???????';
③ 산술 연산
select e.FName, e.LName, 1.1*e.salary as Increased_Salary
from Employee e, Project p, Works_on w
where p.PName='ProductX' // 선택 조건
and p.PNumber=w.Pno // 조인 조건 1
and e.ssn=w.Essn; // 조인 조건 2
④ between-and 연산자
select *
from Employee
where (salary between 30000 and 40000) and Dno=5;
⑤ order by
select DName, LName, FName, PName
from Employee e, Department d, Project p, Works_on w
where w.Essn=e.Ssn // 프로젝트에 참여하는 사원
and d.DNumber=e.Dno // 그 사원의 부서
and p.PNumber=w.Pno // 사원이 진행하는 프로젝트
order by DName, LName, FName;
테이블의 attribute 순서대로 값을 삽입하거나, 임의의 순서대로 또는 원하는 값만 골라 삽입하는 두 가지 방법이 존재한다.
① 동일한 순서로 삽입
insert into Employee
values ('Richard', 'K', 'Marini', '653298653', '1980-12-24',
'98 Oak Forest Katy TX', 'M', 37000, '987654321', 4);
② 임의 순서로 삽입(원하는 값만 골라 삽입)
insert into Employee(FName, LName, DNo, Ssn)
values (FName='Richard', LName='Marini', DNo=4, Ssn='653298653';
// 또는 values ('Richard', 'Marini', 4, '653298653');
DDL에서 정의한 무결성 제약 조건을 만족해야 한다. 아래와 같은 경우에는 삽입 연산이 진행될 수 없다.
① 2번 부서가 없는 경우
insert into Employee(FName, LName, Ssn, DNo)
values ('Robert', 'Hatcher', '980760540', 2);
② 기본키(Ssn)에 Null이 들어가는 경우
insert into Employee(FName, LName, DNo)
values ('Robert', 'Hatcher', 5);
쿼리의 결과로 생성된 임시 테이블을 다른 테이블에 삽입하려는 경우에 Select와 Insert를 결합하여 사용할 수 있다. (이 때에는 values 키워드는 사용하지 않는다.) 아래와 같이 가공된 결과를 새로운 테이블로 저장하는 경우에 유용할 수 있다.
CREATE TABLE WORKS_ON_INFO
( EMP_NAME VARCHAR(15),
PROJ_NAME VARCHAR(15),
HOURS_PER_WEEK DECIMAL(3,1) );
INSERT INTO WORKS_ON_INFO
SELECT E.LNAME, P.PNAME, W.HOURS
FROM PROJECT P, WORKS_ON W, EMPLOYEE E
WHERE P.PNUMBER=W.PNO AND W.ESSN=E.SSN;
① 기본 사용법
Delete From {테이블 명} Where {조건};
② 활용
delete from Employee where LName='Brown';
delete from Employee where DNo=5;
① 기본 사용법
Update {테이블 명} Set {attribute 이름 = 값} Where {조건};
② 활용
update Prject
set PLocation='Bellaire', Dnum=5
where PNumber=10;
update Employee
set salary=salary*1.1
where Dno=5;