Database 카테고리는 아래의 도서를 참고하여 진행하고 있음을 밝힘. 간혹 나오는 Figure는 해당 도서의 강의용 Slide에서 인용함. 또한 이 도서에서 다루는 SQL은 SQLite용 쿼리문과는 관계가 없음. 해당 내용은 Programming 카테고리의 SQLite에 있는 내용을 확인하기 바람.


데이터베이스 시스템
국내도서>컴퓨터/인터넷
저자 : Abraham Silberschatz / 김형주역
출판 : 한국맥그로힐 2010.12.30
상세보기




예 1
select
name from instructor;

위의 질의문이 뜻하는 바는 instructor 테이블에서 name이라는 컬럼을 찾아 적는 것이다. 여기서 이름은 Primary key가 될 수 있기 때문에, 중복이 되는 일은 없겠지만 이름이 아니라 부서의 이름을 뽑아내는 아래의 예제는 어떻게 나올 것인가?

예 2
select
dept_name from instructor;


위의 보기는 부서 이름을 뽑아낼 것을 요청하기 때문에 동일한 이름이 중복되서 나타나는 문제점을 야기할 수 있다. 이는 컴퓨터의 자원적으로 보아도, 혹은 시간적으로 (실제 CPU 시간은 적게 걸린다고 하더라도, 사람이 걸러야 하는 작업에 들어가는 시간을 보더라도) 손실이 생긴다. 따라서 중복되는 자료가 있을 것으로 예상이 되는 경우에는 쿼리문을 아래와 같이 사용한다.

select distinct dept_name from instructor;



예 3
select
ID, name ,dept_name, salary/12 from instructor;


SQL에서는 산술 연산자 역시 사용이 가능하다. 위의 질의문은 연봉을 12로 나누어 월급이 얼마가 되는지로 표시해 줄 것이다.

예 4
select
name from instructor, where dept_name = 'Comp. Sci' and salary > 70000;


위의 쿼리문은 instructor 테이블에서 name을 뽑아내는데 있어 그 조건이 부서 명은 'Comp. Sci' (컴퓨터 과학)이며, 연봉은 70000이상인 사람들의 이름을 뽑아낼 것이다. (and 연산자이기 때문에 두 조건을 동시에 만족시키는 사람들의 이름만 뽑아낼 것이다.)

예 5
select
name, instructor.dept_name, building from instructor, department where instructor.dept_name == department.dept_name;


위의 질의문은 instructor와 department라는 2개의 테이블에서 select에 걸어놓은 조건을 표기하여 보여줄 것인데, 그 중에서 두 부서의 이름이 동일한 것만 보여줄 것이다.

이 내용이 무엇이냐면, 기본적으로 위의 질의문으로 질의를 한다면, 일단 Cartesian Product를 통하여 테이블을 생성하고 거기서 where 조건에 맞는 것들을 걸러내고 select로 원하는 컬럼들만 표기를 해 준다는 것이다.


Cartesian Product를 하게 되면, 위의 테이블처럼 대책없는 테이블이 하나 생성된다.

위의 테이블에서 실제로 쓸모있는 정보만을 취합한다면 아래의 이미지처럼 나와야 한다.




2개 이상의 테이블에서 질의를 하는 경우에는 복잡한 과정을 거치기 때문만 아니라 쿼리문 역시 굉장히 지저분해지기 때문에 Natural Join이라는 것을 사용한다. (책에 자연 조인이라고 되어있는데... 서울대 교수님이 번역하셔서 뭐라고 하기가 참... -_-)

예 6
select
name, course_id from instructor, teaches where instructor.ID == teaches.ID;
select name, course_id from instructor natural join teaches;


위의 두 쿼리문은 동일한 결과를 표시한다. natural join을 이용하였을 때, 쿼리문을 사용하기가 훨씬 편리해진다는 것을 볼 수 있다.

예 7
select
name, title from instructor natural join teaches, course, where teaches.course_id == course.course_id;
select name, title from (instructor natural join teaches) join course using (course_id);


3개 이상의 내츄럴 조인의 쿼리문은 위와 같은 방법을 이용하여 작성한다.

+ Recent posts