테이블은 두 가지 집합을 포함한 그릇과도 같다. 두 가지 집합이 바로 필드와 레코드이다. 테이블을 필드 중심으로 설명하면 이는 테이블 스키마가 된다. 테이블을 레코드 중심으로 설명하면 테이블 인스턴스가 된다.
테이블을 생성하려면 먼저 필드를 정의하여 테이블 스키마를 생성한 후, 레코드를 추가하여 테이블 인스턴스를 만들어야 한다. 그러므로 테이블 스키마 생성과 테이블 인스턴스 생성의 SQL문은 다르다.
SQL의 종류
DDL(Data Definition Language)은 데이터 정의 언어라고 부르며, 이는 테이블 스키마와 관련된 SQL이다.
CREATE 테이블 생성, ALTER 테이블 수정, DROP 테이블 삭제
DML(Data Manipulation Language)은 데이터 조작 언어로, 이는 테이블 인스턴스와 관련된 SQL이다.
SELECT 레코드 검색, INSERT 레코드 삽입, UPDATE 레코드 수정, DELETE 레코드 삭제
SQL문과 관계대수
SQL은 관계대수와 관계해석을 기반으로 만들어져 있기 때문에 관계 질의어와 밀접한 관계를 가진다.
SELECT : 관계 대수의 추출연산
FROM : 관계 대수의 카디션 프로덕트 연산
WHERE : 관계 대수의 선택 연산
예를 들어 보겠다.
SELECT name,dept_name
FROM department, student
WHERE department.dept_id = student.dept_id;
*dept_name : 부서명, dept_id : 부서번호
SELECT : 학생이름과 부서이름 필드로 이루어진 레코드를 추출한다.
FROM : 부서테이블과 학생테이블을 카디션 프러덕트한다. (곱집합)
WHERE : 단, 카디션 프러덕트 결과 중, 부서번호가 같은 레코드만 출력한다.
FROM은 카디션 프러덕트 연산을 구현한다. 카디션 프러덕트란 두 테이블의 레코드가 만나, 만들어질 수 있는 모든 레코드를 출력하는 연산을 의미한다. 그러므로 WHERE로 동등조건을 제시하여 모든 레코드 중 기본키와 외래키가 같은 레코드만 출력하게 만들면, 이는 조인(JOIN)연산이 된다.
*distinct : 레코드에 중복된 값이 있으면 하나만 출력한다.
SELECT distinct address FROM student;
*ORDER BY : 정렬 방식 지정
디폴트는 오름차순이며 내림차순시 DESC를 붙여준다.
SELECT name FROM student WHERE year=3 OR year= 4
ORDER BY name DESC;
*재명명 연산
1) 테이블 재명명
SELECT s1.name FROM student s1;
2) 필드 재명명
SELECT name 이름 FROM student;
*LIKE 연산자
문자열 패턴으로 WHERE 조건을 달 때는 '=' 연산자 대신에 LIKE를 사용한다.
문자열 패턴 종류
_ : 임의의 한 개 문자
%: 임의의 여러개 문자
'%디비%' : 여러 개의 문자가 앞뒤로 나오고 중간에 '디비'라는 글자가 있다.
'%디비' : 여러 개의 문자가 앞에 나오고 뒤에 '디비'라는 글자가 있다.
'_ _ _' : 3개의 문자로 이루어져있다.
'_ _ _ %' : 최소 3개의 문자로 이루어져 있다.
SELECT name FROM student WHERE name LIKE '김%';
이항연산
추출(SELECT)하고 선택(WHERE)하고 재명명하는 연산은 관계대수에서 단항 연산이라 부른다. 피연산자(테이블)가 하나에서 일어나는 연산이다. 카디션 프러덕트(FROM)같은 곱집합은 관계 대수에서 이항 연산이라 부른다. 두 개의 테이블을 갖고 하는 연산이다. 추가적으로 이항 연산을 살펴보자.
UNION(합집합)
SELECT name FROM student
UNION
SELECT name FROM professor;
학생 이름 레코드와 교수 이름 레코드가 모두 표현된 하나의 테이블을 생성하는 SQL문이다. UNION ALL을 사용하면 중복되는 값을 제거하지 않고 그대로 출력한다.
INTERSECT(교집합)
SELECT stu_id
FROM student s, department d
WHERE s.dept_id = d.dept_id AND dept_name = '컴퓨터공학과'
INTERSECT
SELECT stu_id
FROM takes
WHERE grade = 'A+';
컴퓨터공학과 학생의 ID가 출력되는 SELECT 문과 A+ 학점을 받은 학생의 ID를 출력하는 SELECT문이 INTERSECT 한 것이다. 그러므로 A+학점을 받은 컴퓨터공학과 학생이 해당 SQL문을 통해 출력된다.
MINUS (차집합)
SELECT stu_id
FROM student s, department d
WHERE s.dept_id = d.dept_id AND dept_name = '컴퓨터공학과'
MINUS
SELECT stu_id
FROM takes
WHERE grade = 'A+';
컴퓨터공학과 학생 중 A+을 받지 못한 학생을 출력하는 SQL문이다.
조인(JOIN)
아까 우리는 FROM(카디션 프러덕트)과 WHERE 동등조건으로 조인을 구현해 보았다. 동등조건이 있기에, 외래키를 갖지 못한 레코드는 출력되지 못한다. 만약 조인 조건에 부합하지 않아도 출력시키려면 어떻게 해야할까?
OUTER JOIN
1) LEFT OUTER JOIN(왼쪽 외부 조인)
SELECT title, semester
FROM course LEFT OUTER JOIN class
USING (couse_id) ;
LEFT OUTER JOIN 연산자 기준 왼쪽에 있는 테이블에서 조인 조건에 부합하지 않는 레코드를 포함한다. 여기서 조인조건은 USING에 명시된다. course_id 는 course.course_id = class.course_id 를 의미한다.
2) RIGHT OUTER JOIN(오른쪽 외부 조인)
오른쪽 테이블에서 조인 조건에 부합하지 않는 레코드를 포함한다.
3)FULL OUTER JOIN(완전 외부 조인)
양쪽 테이블에서 조인조건에 부합하지 않는 레코드를 포함한다.
참고자료
Understanding of Database
저자 : 이상구, 장재영, 김한준, 정재헌
출판 : 이한미디어발매2012.08.20.
'DB > DB Basic' 카테고리의 다른 글
[DB] SQL3 (Oracle) (0) | 2021.06.25 |
---|---|
[DB] SQL2 (Oracle) (0) | 2021.06.25 |
[DB] Oracle의 구조 (0) | 2021.06.24 |
[DB] 관계해석(Relational Calculus) (0) | 2021.06.24 |
[DB] 관계형 데이터 모델 (0) | 2021.06.24 |