본문 바로가기
데이타베이스

SQL 고급 질의어 정리

by minimax95 2020. 5. 23.

이전 포스팅에서 SQL 기본 질의어에 대해 살펴보았습니다.

이번 포스팅에서는 여러 조건에 부합하는 데이터베이스 검색 결과를 도출해 낼 수 있는 SQL 고급 질의어에 대해 살펴보겠습니다.

 

먼저 복수의 테이블에 대한 SELECT 질의를 살펴보겠습니다.

데이터 모델링 단계에서 데이터 중복이나 종속을 제거하기 위해 정규화 과정을 통해서 여러 개의 테이블로 나뉠 수 있습니다. 사용자의 요청에 따라 다수의 테이블로부터 정보를 추출해야 하는 경우에는 아래와 같은 형식으로 질의문을 구성할 수 있습니다.

SELECT 컬럼1, 컬럼2, ···, 컬럼n

          FROM 테이블명1, 테이블명2, ···, 테이블명n

          WHERE 조건

 

예를 들어 설명하기 위해 임의의 교수 테이블과 학과 테이블을 아래와 같이 생성하였습니다.

교수 테이블
학과 테이블

위 예제 테이블을 이용하여 교수 이름, 소속 학과, 캠퍼스를 정보를 뽑아내려면 아래와 같이 질의어를 구성할 수 있다.

SELECT 성명, 교수.학과명, 캠퍼스

       FROM 교수, 학과

       WHERE 교수.학과명 = 학과.학과명;

참고로 위 그림에서 보듯 workbrench에서 작업할 때 스키마명 접근자를 추가해야 올바른 결괏값을 구할 수 있습니다.

 

다음으로 집합 연산이 포함된 SELECT 질의문입니다.

합집합, 교집합, 차집합에 대응하는 UNION, INTERSECT, EXCEPT 구분인데 주의할 점은 집합 연산을 적용할 때 반드시 두 SELECT문의 결과 스키마가 동일해야 한다는 것입니다. 즉, 컬럼의 개수와 데이터 타입이 일치해야 합니다.

 

합집합 연산에 해당하는 UNION 연산은 여러 SELECT문의 결과를 하나의 테이블로 합할 때 사용하며, 이때 중복되는  레코드들은 제거됩니다. 만일 모든 중복을 허용하고자 한다면 UNION 대신 UNION ALL을 사용할 수도 있습니다.

구문 형식은 아래와 같습니다.

SELECT문1 UNION SELECT문2

 

예제를 통해서 살펴보겠습니다. 아래와 같이 과목 테이블을 생성하고 공업수학을 개설한 학과와 데이터베이스를 개설한 학과를 모두 출력하고자 한다면 어떻게 질의어를 만들어야 할까요?

과목 테이블

(SELECT 학과명 FROM 과목 WHERE 과목명 = '공업수학')

UNION

(SELECT 학과명 FROM 과목 WHERE 과목명 = '데이터베이스');

다음은 교집합에 대해 알아보겠습니다.

INTERSECT 연산은 테이블들이 공통으로 가지고 있는 레코드들을 추출할 때 사용합니다.

사용 형식은 UNION과 유사하며 중복을 유지하고 싶은 경우에는 INTERSECT ALL을 사용합니다.

구문 형식은 아래와 같습니다.

SELECT문1, INTERSECT SELECT문2;

 

예제를 살펴보겠습니다.

컴퓨터학과와 물리학과에 모두 개설되어 있는 과목명을 추출하려면 질의문을 어떻게 작성해야 할까요?

(SELECT 과목명 FROM 과목 WHERE 학과명 = '컴퓨터학과')

INTERSECT

(SELECT 과목명 FROM 과목 WHERE 학과명 = '물리학과');

하지만 MySQL에서는 INTERSECT가 지원되지 않기 때문에 위 질의문과 동일한 결과를 반환할 수 있도록

아래와 같이 INNER JOIN을 사용하도록 하겠습니다.

 

마지막으로 차집합에 대해 알아보겠습니다.

EXCEPT 연산은 한 테이블에는 포함되지만 다른 테이블에는 포함되지 않는 레코드 집합을 추출할 때 사용합니다.

구문 형식은 아래와 같습니다.

SELECT문1, EXCEPT SELECT문2;

 

예제를 살펴보겠습니다.

컴퓨터학과에는 개설되어 있으나 물리학과에는 개설되지 않은 과목을 추출하려 한다면 어떻게 쿼리를 구성해야 할까요?

(SELECT 과목명 FROM 과목 WHERE 학과명 = '컴퓨터학과')

EXCEPT

(SELECT 과목명 FROM 과목 WHERE 학과명 = '물리학과')

INTERSECT와 마찬가지로 MySQL에서는 EXCEPT가 지원되지 않기 때문에 위 질의문과 동일한 결과를 반환할 수 있는 LEFT JOIN을 사용하도록 하겠습니다.

교집합 연산과 차집합 연산이 MySQL에서 지원되지 않기 때문에

위 예제에서 살펴본 INNER JOIN과 LEFT JOIN을 잘 알아두면 좋을 것 같습니다.

감사합니다.

댓글