💕IT 공부하기/데이터베이스

SQL의 SELECT문에 대하여(1)

수리즘 2022. 8. 25. 09:00
반응형

01. SELECT문이란?

관계 데이터베이스에서 정보를 검색하는 SQL문은 SELECT문입니다. 이 SELECT문은 관계 대수의

실렉션과는 의미가 완전히 다릅니다. SQL의 SELECT문은 관계 대수의 실렉션, 프로젝션, 조인, 카티션 곱 등을

결합한 것입니다. SELECT문은 관계 데이터베이스에서 가장 잘 사용됩니다.

 

질의를 작성할 때 가장 고려해야 할 것은

① 어떤 애트리뷰트들을 보고자 하는가,

② 이 애트리뷰트들이 어떤 릴레이션들에 속해 있는가,

③ 다수의 릴레이션이 사용될 때는 어떻게 릴레이션들이 조인되는가 등입니다.

 

EMPNO EMPNAME TITLE MANAGER SALARY DNO
2106 김창섭 대리 1033 2500000 2
3426 박영권 과장 4377 3000000 1
3011 이수민 부장 4377 4000000 3
1003 조민희 과장 4377 3000000 2
3427 최종철 사원 3011 1500000 3
1365 김상원 사원 3426 1500000 1
4377 이성래 사장 5000000 2
DEPTNO DEPTNAME FLOOR
1 영업 8
2 기획 10
3 개발 9
4 총수 7

02. 기본적인 SELECT문

SELECT문의 형식은 여섯 개의 절로 이루어집니다. 이들 중에서 SELECT절과 FROM절만 필수적인 절이고,

나머지는 선택 사항입니다. 이들의 순서는 바꿔서는 안 되며, 하나의 SQL문을 한 라인에 길게 입력하거나 여러 라인에

걸쳐 입력할 수 있습니다. 하나의 SQL문을 각 키워드(예, SELECT, FROM, WHERE)마다 새로운 라인에 입력하면서

적절하게 세로줄 맞추기를 하면 SQL문을 읽고 디버그 하기가 쉽습니다.

 

SQL 문의 대문자와 소문자를 구분하지 않습니다. 따라서 SELECT, select, Select 중에서 어떤 것을 사용해도

괜찮습니다. 그러나 흔히 SQL의 키워드는 대문자로 입력하고, 나머지 소문자나 혼합 형식으로 입력합니다.

SELECT문의 결과는 새로운 릴레이션입니다.

 

SELECT-FROM-WHERE 절로 이루어진 기본적인 SELECT문을 SELECT-FROM-WHERE 블록이라고 부릅니다.

아래 구문에서 '[]'에 들어있는 것은 선택 사항을 뜻하며, 'ㅣ'기호는 '또는'을 의미합니다.

각 절마다 번호를 붙이고, 이 번호를 참조하면서 차례대로 각 절의 기능을 설명합니다.

(1) SELECT절

SELECT절에는 질의 결과에 포함하려는 애트리뷰트들의 리스트를 열거합니다.

이는 관계 대수의 프로젝션 연산에 해당합니다. 관계 대수의 실렉션과 혼동하지 말아야 합니다.

질의의 결과에서 중복을 제거하기 위해서는 질의 결과를 먼저 정렬해야 하는데, 정렬 연산은 시간이

오래 걸릴 수 있으므로 DBMS는 자동적으로 질의 결과에서 중복을 제거하지는 않습니다.

또한 사용자가 중복된 투플들을 원할 수 있고, 집단 함수를 정확하게 적용하기 위해서는 중복된 투플들이

필요한 경우도 있습니다.

 

사용자가 DISTINCT 절을 사용해서 명시적으로 요청했을 때만 중복을 제거합니다.

SQL의 릴레이션은 디폴트로 투플들의 집합이 아니고, 투플들의 다중집합(multiset)을 허용합니다.

다중집합을 백(bag)이라고도 부릅니다. DISTINCT는 관계 대수와 SQL 간의 중요한 차이점을

나타냅니다.

(2) FROM절

FROM절에는 질의에서 필요로 하는 릴레이션들의 리스트를 열거합니다.

SELECT절에서 사용자가 검색하려는 애트리뷰트들을 포함하고 있는 릴레이션들뿐만 아니라

WHERE절의 프레디키트에 사용된 애트리뷰트들을 포함하고 있는 릴레이션들도 열거해야 합니다.

(3) WHERE절

WHERE 절은 관계 대수의 실렉션 연산의 프레디키트(실렉션 조건)에 해당합니다.

FROM절에 열거한 릴레이션에 속하는 애트리뷰트들만 사용해서 프레디키트를 표현해야 합니다.

WHERE절의 조건은 결과 릴레이션의 투플들이 만족시켜야 하는 조건입니다.

예를 들어, WHERE SALARY > 1500000은 결과 릴레이션의 투플들의 급여가 이보다 크다는 것입니다.

 

WHERE절의 프레디키트는 아래와 같은 사항들을 포함합니다.

비교 연산자          =, <>, <, <=, >, >=

부울 연산자          AND, OR, NOT

집합 연산자          IN, NOT, IN, ANY(SOME), ALL

 

프레디키트는 비교 연산자와 부울 연산자 등이 결합된 복잡한 형태도 가능하며 만일 WHERE 절을 생략하면

모든 투플들이 조건을 만족하는 것으로 간주합니다. WHERE절은 SELECT문뿐만 아니라 UPDATE문과

DELETE문에도 사용되는데, WHERE절의 구문은 모두 동일합니다.

(4) 중첩 질의

중첩 질의는 다른 질의의 WHERE절에 포함된 SELECT문입니다.

(5) GROUP BY절

질의 결과에서 GROUP BY 다음에 명시된 애트리뷰트에 동일한 값을 갖는 투플들을 한 그룹으로 묶습니다.

(6) HAVING절

HAVING절은 투플들의 그룹이 만족해야 하는 조건을 나타냅니다.

(7) ORDER BY절

ORDER BY절은 결과 투플들의 정렬 순서를 지정합니다. ORDER BY절을 생략한다면 SELECT문의 결과로

검색된 투플들의 순서는 기본 키의 순서나 투플들이 검색된 순서를 따릅니다.


여섯 개의 절이 모두 사용된 SELECT문이 수행되는 개념적인 순서는,

❶ FROM절에 열거된 릴레이션들의 카티션 곱을 구하고,

❷ WHERE절의 프레디키트를 적용하여 투플들을 골라내며,

❸ GROUP BY절에 의해 결과 투플들을 그룹화하고,

❹ 각 그룹에 HAVING절의 조건을 적용하여 일부 그룹의 걸러내고,

❺ 남은 각 그룹에 집단 함수를 적용하고,

❻ SELECT절에 열거된 애트리뷰트들만 프로젝션 해서 ORDER BY절에 명시한 순서대로 정리합니다.

 

 

 [IT 공부하기/데이터베이스] - SQL의 SELECT문에 대하여(2)

 

SQL의 SELECT문에 대하여(2)

03. SELECT문의 여러 가지 검색과 연산 ► 별칭(alias) 서로 다른 릴레이션에 동일한 이름을 가진 애트리뷰트가 속해 있을 때, 애트리뷰트의 이름을 구분하는 한 가지 방법은 애트리뷰트 이름 앞에

soonirism.tistory.com

 

 

 

 

 

반응형