본문 바로가기
Programming/데이터베이스 \ 오라클

오라클 데이터베이스 입문 (6) : SCOTT 계정 활용, DISTINCT, ALL, 별칭 AS, ORDER BY, WHERE, AND, OR, 논리연산자

by 오뚝오뚝 2022. 8. 2.

 

안녕하세요 오늘은 본격적으로 SCOTT 계정의 데이터를 활용해보는 시간을 가져보겠습니다.

 

먼저 DISTINCT 명령문 부터 배우겠습니다.

 

 

단어 뜻 그대로 DISTINCT 별개의 라는 의미로 SELECT와 함께 썼을때 중복된 값들은 제거하여 선택합니다.

 

 

위와 같이 DEPTNO 라는 field를 EMP 라는 테이블에서 조회하면, 30과 20 그리고 10의 값들이 포진한 것을 볼 수 있습니다. 그러면 어떤 고유값들만 있는지를 알고 싶을 수 있는데요, 아래와 같이 명령어를 실행하여 보면 3개의 고유값들만 조회되는 것을 알 수 있습니다. 

그러면 field를 추가해 볼까요? 아래의 경우는 DEPTNO 그리고 JOB 두개의 field에 DISTINCT를 적용한 경우입니다. 그러면 기존 10,20,30의 값들이 다시 고유의 JOB 값들과 함께 하나의 고유값을 이루게 되겠죠? 그래서 아래와 같이 CLERK, MANAGER, PRESIDENT, ANALYST 과 엮여서 나타나게 됩니다.  

다음은 ALL 이라는 명령어를 사용해 볼건데요, 사실 ALL이라는 명령어는 별도의 중복설정이 없는 경우에 자동으로 사용된다고 보시면 되겠습니다. 즉, SELECT JOB, DEPTNO FROM EMP; 그리고 SELECT ALL JOB, DEPTNO FROM EMP; 모두 같은 결과를 나타냅니다. 

 

이번에는 연산이라는 것을 함께 해보겠습니다. 

 

먼저 EMP 테이블 안에서 직원의 이름을 나타내는 ENAME과 그들의 월급 SAL 그리고 추가수당 CONN을 조회해 보겠습니다.

 

아래 화면을 보시면 오류가 나왔습니다. 아직 오류를 어떻게 처리하는지 어려울 수 있는데요, 당황하지 않고 먼저 나타나는 내용을 읽어보는게 좋습니다. Error at Line 23. 

 

라인 23번째에서 에러가 발생한 것인데요, 라인 23은 어디인 걸까요? 현재 저희의 WORKSHEET은 라인 번호가 나오도록 설정되어 있지 않습니다. 보이도록 설정해볼까요?

 

SQL Developer에서 라인 번호가 보이지 않을때에는 worksheet 좌측의 빈공간에 마우스 오른쪽을 클릭하시면 됩니다. 그러면 Toggle Line Numbers 라는 항목이 보이는데요 이를 클릭하시면 번호가 뜨는 것을 알 수 있습니다.

 

 

그럼 저희의 경우 라인 23은 SELECT ENAME, CONN, SAL  이었습니다. 

 

오류를 다시한번 자세히 보시면 "CONN": invalid identifer 라고 적혀있는 것을 알 수 있습니다.

 

즉, "CONN" 이라는 것이 식별할 수 없다라는 의미입니다. 다시 해석해보면 조회가 안된다는 의미이죠. 

DESC EMP; 를 통해 EMP 테이블의 attribute를 다시 확인하니 COMM 으로 되어 있네요, 즉 CONN으로 하였기에 오류가 나타난것이었습니다. 수정하여 명령어를 입력하니 조회가 됩니다.

 

 

보시면 (null)이라고 적혀있는 항목들이 보입니다. null은 비어있다는 뜻으로 공란이라는 의미이기도 합니다. null의 값 경우 테이블에서 field를 설정할때 null 값을 입력할 수 없도록 별도로 설정할수도 있었죠. 이 경우에는 허용이 되어 있는 것입니다. null 의 특성 중 하나는 null 에 어떠한 연산을 하는 경우 결과값은 마찬가지로 null이 된다는 사실입니다. 

 

그리고 또 한가지 언급하자면 여러가지 field를 조회할때, 명령어에서 언급한 순서대로 좌측에서부터 우측으로 나열되는 것을 알수 있습니다.

 

그러면 SAL이 월급이고 COMM이 커미션으로 급여 외 모든 수당일때 연봉은 얼마인지 알고 싶을수가 있습니다. 그러면 월급을 12로 곱하고 COMM 을 더해보면 연봉임을 알 수 있는데요, 이렇게 명령어에 그대로 넣어보겠습니다.

 

 

조회되는 것을 알 수 있습니다. 하지만, field의 이름, 즉 열 명칭이 마음에 안들 수 있는데요, 이 경우에는 AS 라는 명령어를 붙여 이름을 지어줄수 있습니다. 즉, SAL*12+COMM AS ANNSAL 로 변경하게 되면 attribute에 이름이 붙여집니다. 

 

 

다음은 ORDER BY 를 사용해보겠습니다. ORDER BY는 어떠한 기준(오름차순, 내림차순)을 가지고 정렬을 하여 조회를 하고 싶을떄 사용하는 것입니다. ORDER BY는 자주 사용하니 반드시 숙달 하시기 바랍니다. 저희가 앞서 조회하였던 연봉에서 연봉을 내림차순으로 조회해 보겠습니다. 

 

ORDER BY의 사용법은, FROM 테이블 뒤에 작성하는 것으로, ORDER BY 필드명 방법(DESC 내림 , ASC 오름) 순으로 명령어를 입력하시면 됩니다. 직접 아래 예제를 확인해 보시죠. 

 

보시면 저희가 임의로 만든 ANNSAL 이라는 field 명이 작동하는 것을 알수 있습니다. 특이한 것으로 NULL 값들이 가장 상위에 오는 것을 볼 수 있습니다. 그러면 이번에는 응용을 해볼까요? 만약 정렬하고 싶은 기준이 여러개라면 어떻게 할까요? 즉, 하나는 내림차순, 그리고 다음 어떤 열은 오름차순. 그럴때는 ORDER BY FIELD1 DESC, FIELD2 ASC; 와 같이 입력하시면 됩니다. 

 

 

다음은 WHERE 절을 배우겠습니다. WHERE 절은 여태까지 배운 명령어 중 가장 중요하니, 반드시 숙달하시기 바랍니다. WHERE 절은 말 그대로 어떤? 어디? 라는 의미로 조건을 달아주는 명령어입니다. 예를 들면 위에서 조회하였던 월급 값이 500이상인 경우만 알고 싶다. 혹은 부서 번호 DEPTNO 값이 30인 경우만 알고 싶다. 

 

마찬가지로 WHERE절도 FROM 테이블 뒤에 붙입니다. WHERE DEPTNO = 30; 혹은 WHERE SAL > 500; 하지만 여기서 저희가 앞서 정의한 ANNSAL을 기준으로 WHERE 절을 사용하게 되면 문제가 발생합니다. 그 이유로는 ANNSAL 열의 값은 저장되어 있는 데이터로 연산을 한 값이지 저장된 값은 아니기 때문입니다. 지금은 여기까지만 아시면 되겠습니다.

 

위에서 사용한 A>B 와 같은 조건은 비교연산입니다. 크거나 같다의 경우에는 >= 를 사용하시면 됩니다. 값이 일치하지 않는다는 !=를 사용하면 됩니다.  WHERE 절이 작동하는 방법은 어떠한 조건을 걸었을때 그 조건이 참의 결과를 보일때만 해당 record 를 조회하는 겁니다. WHERE 절이 중요한 이유는 이 조건을 복잡하게 만들수 있기 때문입니다, AND 와 OR 를 사용하여 말이죠.

 

예를 들어볼까요? 이번에는 EMP 테이블 모든 field 중에 DEPTNO 가 30이고 또 직업이 JOB = SALESMAN인 경우를 조회해보겠습니다. (asterisk * 은 가능한 모든을 의미합니다. 즉 SELECT * FROM EMP; 는 EMP 내 모든 필드를 조회)

 

여기서 주의할점은 SALESMAN을 명시할때 작은 따음표를 붙여주어야하는 점입니다. 프로그래밍에 익숙하지 않은경우 납득이 잘 되지 않으실수 있는데요, 프로그램과 대화하는 방식으로 보시면 되겠습니다. 문자열이라는 특성으로, EMP 안에 저장되어 있는 field 명 값이 아닌 record 저장값인 문자를 지칭하기 때문에 ' ' 을 붙인다고 보시면 됩니다. 

 

그러면 위와 같이 WHERE를 복잡하게 사용할수 있는데, 걸 수 있는 조건에 제한이 있나요? 없습니다. 앞에 AND, OR 을 붙여서 계속 다음 조건을 더 추가로 걸어갈수 있습니다.

 

 

조건 중에 특이한 조건을 걸수도 있는데요, 예를 들면 문자를 조건으로 들수도 있습니다. WHERE ENAME >= 'F' ; 라고 하는 경우에는 직원 이름 중 첫번째 글자가 F 순서보다 뒤에 있는 경우만 명시되게 됩니다. 즉 Andy 라면 A가 1번이니 생략되겠죠. 

 

댓글