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

SQL의 SELECT문에 대하여(2)

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

03. SELECT문의 여러 가지 검색과 연산

► 별칭(alias)

서로 다른 릴레이션에 동일한 이름을 가진 애트리뷰트가 속해 있을 때,

애트리뷰트의 이름을 구분하는 한 가지 방법은 애트리뷰트 이름 앞에 릴레이션의 이름을 붙이는 것입니다.

 

EMPLOYEE.DNO

 

또 다른 방법은 투플 변수(tuple variable)를 사용하는 것입니다. SQL에서 투플 변수는 한 릴레이션에

연관됩니다. 투플 변수는 FROM절에서 릴레이션의 이름 다음에 AS(생략 가능)와 함께 명시됩니다.

투플 변수를 별칭이라고도 부르며, 아래와 같이 표현합니다.

 

EMPLOYEE릴레이션을 E, DEPARTMENT릴레이션을 D로 표현합니다.

FROM EMPLOYEE AS E, DEPARTMENT AS D

 

투플 변수는 편리성과 질의의 이해도를 높이기 위해 언제든지 사용할 수 있으며, 릴레이션이

FROM절에 한 번만 나타난다면 그 릴레이션 이름을 투플 변수처럼 사용할 수 있습니다.


► 릴레이션의 모든 애트리뷰트나 일부 애트리뷰트들을 검색

SELECT절에서 애트리뷰트들의 리스트 대신에 *를 사용하면 릴레이션에 속하는 모든 애트리뷰트들을

검색할 수 있습니다. 릴레이션의 모든 애트리뷰트들을 필요로 하지 않는 경우에는 일반적으로 *를 사용하지

않는 것이 좋습니다. 왜냐하면 모든 애트리뷰트들을 찾아 사용자에게 제시하기 위해서는

그만큼을 처리하는 시간이 소요되기 때문입니다.

 

또한 *를 포함한 SELECT문이 응용 프로그램에 내포된 경우에 나중에 릴레이션에 애트리뷰트가 추가되면,

SELECT문에서 검색되는 애트리뷰트들의 개수가 변하게 되므로 응용 프로그램을 다시 컴파일해야 하기 때문입니다.

 

검색하려는 애트리뷰트들을 명시적으로 열거하는 경우에는 애트리뷰트들을 콤마(,)로 구분하고,

마지막 애트리뷰트 다음에는 콤마를 사용하지 않습니다.


► 상이한 값들을 검색

SELECT문의 결과에는 디폴트로 중복된 투플들이 준재할 수 있습니다.

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

DISTINCT절을 명시하면 검색된 투플들을 정렬하여 인접한 투플들의 중복 여부를 검사하고,

중복된 투플들이 존대한다면 제거한 후 사용자에게 결과를 제시해줍니다.


► 특정한 투플들의 검색

WHERE절의 프레디키트를 만족하는 투플들만 검색합니다.

여섯 개의 비교 연산자( =, <, <=, >, >=, <> )를 프레디키트에 사용하여 애트리뷰트와 애트리뷰트 또는

애트리뷰트와 상수를 비교할 수 있습니다. 프레디키트에 사용되는 숫자가 아닌 상수들은

'개발', '이홍근' 등과 같이 단일 인용기호(')로 에워싸야합니다. 모든 숫자 상수는 단일 인용 기호로

에워싸서는 안됩니다.

 

❶ WHERE절을 사용하여 검색 조건을 명시

Q. 2번 부서에서 근무하는 사원들에 대한 모든 정보를 검색하세요.

SELECT          ∗

FROM             EMPLOYEE

WHERE           DNO = 2;

 

EMPNO EMPNAME TITLE MANAGER SALARY DNO
1003 조민희 과장 4377 3000000 2
2016 김창섭 대리 1003 2500000 2
4377 이성래 사장 5000000 2

► 문자열 비교

LIKE 비교 연산자는 문자열의 일부에 대하여 비교 조건을 명시합니다.

LIKE 비교 연산자는 문자열 타입으로 선언된 애트리뷰트에 사용할 수 있으며, 숫자 데이터 타입을 갖는

애트리뷰트에는 적용할 수 없습니다. wild문자 '%'는 0개 이상의 문자열과 대치되고,

wild문자 '_'는 임의의 한 개의 문자와 대치됩니다. 영문자에 대해서는 대문자와 소문자를 구분합니다.

 

①  LIKE 'S%'는 첫 문자가 S이고, 그 당므에는 0개 이상의 임의의 문자열이 올 수 있습니다.

②  LIKE 'J____'는 첫 문자가 J이고, 그다음에 정확하게 4개의 문자가 올 수 있습니다.

③  LIKE '% x'는 0개 이상의 임의의 문자열이 먼저 오고, 마지막 문자는 x로 끝납니다.

④  LIKE '% DB%'는 중간에 DB를 포함한 임의의 길이의 문자열입니다.

⑤  LIKE '_A%'는 두 번째 문자가 A인 임의의 길이의 문자열입니다.

 

wild문자가 '_A%' 또는 '% A'처럼 문자열의 앞부분에 사용되면, 조건에 맞는 투플들을 검색하기 위해서

인덱스를 사용하지 못하고 모든 투플들을 하나씩 읽어야 하므로 수행 기간이 오래 걸릴 수 있습니다.

 

SQL 표준에서는 영문자에 대해서 대문자와 소문자를 구분합니다.

'MANAGER'는 'manager' 또는 'Manager'와는 같지 않습니다. 그러나 오라클 등에서

대문자와 소문자를 구분하지 않도록 할 수 있습니다. 또한 고정 길이 문자열로 선언된 애트리뷰트 내의

공백 문자들의 개수도 구분합니다. LIKE의 부정은 NOT LIKE입니다.

 

%를 사용하여 문자열 비교

Q. 이 씨 성을 가진 사원들의 이름, 직급, 소속 부서 번호를 검색하라.

SELECT          EMPNAME, TITLE, DNO

FROM             EMPLOYEE

WHERE          EMPNAME LIKE '이%' ;

 

EMPNAME TITLE DNO
이수민 부장 3
이성래 사장 2

► 다수의 검색 조건

WHERE절에 여러 조건들이 논리 연산자로 결합된 프레디키트를 포함할 수 있습니다.

아래와 같은 질의는 잘못된 것입니다. 왜냐하면 부서이름은 단일 값을 갖기 때문에 WHERE절을 만족하는

투플은 하나도 없습니다. 즉 부서이름이 영업부이면서 동시에 개발부인 투플은 없습니다.

따라서 결과 릴레이션은 빈 릴레이션입니다.

 

SELECT          FLOOR

FROM             DEPARTMENT

WHERE          DEPTNAME = '영업' AND DEPTNAME = '개발' ;

 

 부울 연산자를 사용한 프레디키트

Q. 직급이 과장이면서 1번 부서에서 근무하는 사원들의 이름과 급여를 검색합니다.

SELECT          EMPNAME, SALARY

FROM             EMPLOYEE

WHERE          TITLE = '과장' AND DNO = 1 ;

 

EMPNAME SALARY
박영권 3000000

► 부정 검색 조건

사용자가 원하지 않는 투플들을 배제하기 위해서 부정 연산자를 사용합니다.

 

 부정 연산자

Q. 직급이 과장이면서 1번 부서에 속하지 않은 사원들의 이름과 급여를 검색하세요.

SELECT          EMPNAME, SALARY

FROM             EMPLOYEE

WHERE          TITLE = '과장' AND DNO <> 1 ;

 

EMPNAME SALARY
조민희 3000000

 

 

 

 

 

반응형