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

SQL의 SELECT문에 대하여(3)

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

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

► 범위를 사용한 검색

원하는 투플들의 조건을 명시하기 위해서 WHERE절에 범위를 나타내는 연산자인 BETWEEN을

사용할 수 있습니다. BETWEEN의 장점은 SQL문의 WHERE절을 좀 더 읽기 쉽게 만들어준다는 것입니다.


► 리스트를 사용한 검색

IN은 리스트 내의 값과 비교합니다. [IN]의 부정은 [NOT IN]입니다.

다음의 WHERE절은 DNO의 값이 (1,2,3)에 속하는지를 검사합니다.

 

WHERE     DNO     IN  (1,2,3)

 

따라서 이 WHERE절은 OR를 사용하여 다음과 같이 표현할 수 있습니다.

IN을 사용하면 다수의 OR을 사용할 필요가 없습니다.

 

WHERE     DNO = 1   OR    DNO = 2   OR   DNO = 3

 

❶ IN

Q. 1번 부서나 3번 부서에 소속된 사원들에 관한 모든 정보를 검색하세요.

SELECT          ∗

FROM             EMPLOYEE

WHERE           DNO IN  (1,3) ;

 

EMPNO EMPNAME TITLE MANAGER SALARY DNO
1365 김상원 사원 3426 1500000 1
3011 이수민 부장 4377 4000000 3
3426 박영권 과장 4377 3000000 1
3427 최종철 사원 3011 1500000 1

► SELECT절에서 산술 연산자 ( +, -, ∗, / ) 사용

SELECT절에 산술 연산자를 사용하여 수식을 표현해도 실제로 데이터베이스 내의 값이 변경되는 것은

아닙니다. 데이터베이스 내의 값이 어떻게 바뀔 것인가 파악하기 위해서 사용합니다.

 

❶ 산술 연산자

Q. 직급이 과장인 사원들에 대하여 이름과, 현재의 급여, 급여가 10% 인상됐을 때의 값을 검색하세요.

SELECT          EMPNAME, SALARY, SALARY ∗ 1.1 AS NEWSALARY

FROM             EMPLOYEE

WHERE          TITLE  = '과장' ;

EMPNAME SALARY NEWSALARY
박영권 3000000 3300000
조민희 3000000 3300000

► 널값 ( NULL )

널값을 포함한 다른 값과 널값을 +, - 등을 사용하여 연산하면 결과는 널이 됩니다.

COUNT(∗)를 제외한 집단 함수들은 널값을 무시합니다. 부서번호가 널인 사원들을 검색하라는

다음의 질의는 DNO 애트리뷰트에 널값을 가진 투플이 EMPLOYEE 릴레이션에 하나 이상 존재하더라도

아무런 결과를 구하지 못합니다. 즉, 어떤 애트리뷰트에 들어 있는 값이 널값인가를 비교하기 위해

'DNO = NULL' 처럼 나타내면 안됩니다.

 

SELECT          EMPNO, EMPNAME

FROM             EMPLOYEE

WHERE          DNO = NULL ;

 

예를 들어, 다음과 같은 비교 결과는 모두 거짓입니다.

NULL   >   300

NULL   =   300

NULL   <>   300

NULL   =   NULL

NULL   <>   NULL

 

애트리뷰트의 값이 널인지 비교하려면 새로운 비교 연산자인 IS NULL이나 IS NOT NULL을

사용해야 합니다. 즉, 앞의 질의를 다음과 같이 표현하면 원하는 결과를 구할 수 있습니다.

 

SELECT          EMPNO, EMPNAME

FROM             EMPLOYEE

WHERE          DNO = NULL ;

 

SALARY가 널이 아닌 모든 투플들은 다음의 WHERE절을 만족하지만, 다음의 EMPLOYEE 릴레이션에

SALARY가 널인 투플들이 존재한다면 다음의 질의의 결과로 이런 투플들은 검색되지 않습니다

 

SELECT          ∗

FROM             EMPLOYEE

WHERE          SALARY   <   2000000   OR    SALARY   >=   2000000 ;

 

이 질의를 다음과 같이 표현하면 SALARY가 널인 투플들도 검색됩니다.

 

SELECT          ∗

FROM             EMPLOYEE

WHERE          SALARY   <   2000000   OR    SALARY   >=   2000000

                          OR    SALARY   IS NULL ;

 

이처럼 널이 프레디키트에 미치는 영향을 유의해야 합니다. 경험이 많은 SQL전문가들도 널을 포함한

복잡한 프레디키트를 작성할 때 흔히 실수를 저지를 수 있습니다.


► ORDER BY 절

질의 결과를 오름차순이나 내림차순으로 정렬하는 경우가 흔히 있습니다. 

사용자가 SELECT문에서 질의 결과의 순서를 명시하지 않으면 오라클에서는 릴레이션에 투플들이

삽입된 순서대로 사용자에게 제시됩니다.

 

ORDER BY절의 디폴트 정렬 순서는 오름차순(ASC)입니다. DESC를 지정하여 정렬 순서를

내림차순으로 지정할 수 있습니다. 널값도 정렬 결과에 표시됩니다. 널값은 오름차순에서는

가장 마지막에 나타나고, 내림차순에서는 가장 앞에 나타납니다.

 

ORDER BY

Q. 2번 부서에 근무하는 사원들의 급여, 직급, 이름을 검색하여 급여의 오름차순으로 정렬하세요.

SELECT          SALARY,  TITLE,  EMPNAME

FROM             EMPLOYEE

WHERE          DNO  =  2

ORDER BY     SALARY  ;

SALARY TITLE EMPNAME
2500000 대리 김창섭
3000000 과장 조민희
5000000 사장 이성래

 

여러 개의 애트리뷰트를 사용하여 정렬할 수도 있습니다. 다음의 SELECT문에서는 DNO 애트리뷰트에

대해 오름차순으로 정렬하고, DNO 애트리뷰트의 값이 같은 투플들에 대해서는 SALARY 애트리뷰트에 대해

내림차순으로 정렬합니다.

 

SELECT          ∙∙∙

FROM             ∙∙∙

WHERE          ∙∙∙

ORDER BY     DNO ,  SALARY  DESC  ;

 

 집단 함수

Q. 모든 사원들의 평균 급여와 최대 급여를 검색하세요.

SELECT          AVG ( SALARY ) AS  AVGSAL , MAX ( SALARY )  AS  MAXSAL 

FROM             EMPLOYEE. ;

AVGSAL MAXSAL
2928571 5000000

► 그룹화

GROUP BY절에 사용된 애트리뷰트에 동일한 값을 갖는 투플들이 각각 하나의 그룹으로 묶입니다.

이때에 사용된 애트리뷰트를 그룹화 애트리뷰트(grouping attribute)라고 합니다.

GROUP BY절에 사용되는 애트리뷰트는 집단 함수에 사용되지 않는 애트리뷰트여야 합니다.

각 그룹에 대하여 결과 릴레이션에 하나의 투플이 생성됩니다. 따라서 SELECT절에는 각 그룹마다

하나의 값을 갖는 애트리뷰트, 집단 함수, 그룹회에 사용된 애트리뷰트들만 나타날 수 있습니다.

만일 SELECT절에 집단 함수가 포함되어 있고, GROUP BY절이 없는 경우에는 SELECT절에 집단 함수에서

참조되지 않는 애트리뷰트가 나타날 수 없습니다.

 

예를 들어, 다음 질의는 그룹하를 하지 않은 채 EMPLOYEE 릴레이션의 모든 투플에 대해서

사원번호와 모든 사원들의 평균 급여를 검색하므로 잘못된 것입니다.

 

SELECT          EMPNO ,  AVG ( SALARY )

FROM             EMPLOYEE. ;

 

 [IT 공부하기/데이터베이스] - SQL의 데이터베이스 갱신의 세가지 명령어

 

SQL의 데이터베이스 갱신의 세가지 명령어

오라클의 SQL의 데이터 조작어에는 데이터베이스를 갱신하는 세 가지 명령이 있습니다. INSERT문은 릴레이션에 새로운 투플을 삽입하고, DELETE문은 릴레이션에서 기존의 투플을 삭제하며, UPDATE문

soonirism.tistory.com

 

 

 

 

 

 

 

 

반응형