본문 바로가기

Oracle/Oracle SQL

Database SQL_Select_문법&익숙해지기

Step 1. Select! 

- Sub : 문법&익숙해지기

 

문법이라고 생각하면 너무 어렵지만 꼭 알고 가야한다고 생각하기에 언급하고 가려고합니다.

Select는 간단히 두개의 부분으로 나눌 수 있습니다.

 

SELECT * | {[DISTINCT] column | expression [alias], ...}

FROM tables;

 

이것이 Select의 기본적인 문법입니다. 나중에 더 추가가 되긴 하겠지만 이정도가 기초적이죠ㅎ

SELECT는 하나 혹은 여러개의 컬럼들의 리스트 입니다. 주어에 해당한다고 보면되겠죠ㅎ

Select절의 조건을 하나하나 또 볼건데요. 간단합니다 ㅎ

* 는 보통 *를 쓰는 것에는 어떤것이 있을까요? 모두다 포함일때 쓰지 않나요? 제가 이상한건지..ㅎ 별표시는 모든 컬럼을 보기위한 것.

DISTINCT는 중복불가를 하기 위한 것.

column | expression은 테이블의 컬럼 이름이나 표현식 등을 말하는 것.

alias는 컬럼을 다른 이름으로 부르는 것

이렇게가 기본적인 Select절의 조건입니다. 꼭 알아두셔야 하구요 ㅎ 좀있다가 예제로 설명 ㅎ

FROM은 조회하고자 하는 테이블을 뜻하는 겁니다.

; 세미콜론은 SQL문장을 마치겠다는 마침표입니다. 꼭 써주시는게 좋아요 ㅎ 습관이 꼭 되어야 하구요

 

그러면 SELECT a FROM b 을 어떻게 해석하는 것이 좋을까요?

제 생각에는 B테이블로부터 A를 조회하겠다! 라고 오라클에게 말하는 것 아닐까요?ㅎ

이렇게 하면 잘 이해가 안가죠?ㅎ 저도 그럴거 같아요 ㅎㅎ 이제 예제로 설명을 하도록 하겠습니다.

SQL은 언어이기 때문에 수많은 연습이 결과물을 낳는다고 생각합니다.

제가하는 교수님은 백문이불여일견과 추가적으로 언어를 다룰때 백문이불여일타 라고 말하셨어요 ㅎㅎ

백번듣는것보다 한번 보는것이 낫다. 백번듣는것보다 한번 쳐보는 것이 낫다. 프로그래밍은 연습이라고 생각합니다 ㅎ

 

맨처음 SELECT의 * 부터 예를 들어보도록 하겠습니다.

Select * from emp; 라고 먼저 입력을 해볼께요

 

 

 

SELECT * FROM emp를 입력했을때의 화면은? emp테이블의 모든 것들이 나오게 됩니다.

Why? Why? *(별표) 때문에요 ㅎ 모든 Column들을 조회한댔으니까요 ㅎㅎ

여기서 하나 더 기본적인 것을 알려드리자면 SELECT와 FROM 은 ORACLE에서 정의된 키워드이기때문에 붙여서 입력해야합니다.

또한번 봐야겠죠?ㅎ

아래의 그림은 키워드를 엔터를 치더라도 붙여서 입력한 경우입니다. 똑같이 SELECT 구문이 잘 나왔습니다.

 

 

 

 

하지만 이경우는 어떨까요? SELECT는 잘 입력했지만 FROM은 따로 입력을 했습니다. 이경우는??

네 아래와 같이 에러가 뜹니다. ORA-00923 : FROM keyword not found where expected 라구요.

Keyword인 FROM을 찾을 수 없다는 거죠. 왜? FROM 은 FRO와 M으로 구분되어 있기 때문입니다.

어떠한 경우에도 키워드는 따로 따로 띄어서 쓰면 안된다는 것을 알 수 있습니다.


 

 

 

그럼 이번에는 *이 아닌 다른 옵션을 해볼까요? 컬럼 몇개를 선택해서 조회하는 것을 해보겠습니다.

하나의 컬럼을 조회하는 것은 아래와 같이 SELECT empno FROM emp; 라고 입력하면됩니다.

콤마도 필요없이 바로 FROM으로 넘어가는 것을 알 수 있습니다.

 

 

그럼 여러개의 컬럼을 조회하는 것은? 이것 또한 간단합니다 ㅎ

SELECT empno, ename, job FROM emp; 라고 하여 emp테이블의 empno, ename, job 이렇게 세개의 컬럼을 조회하겠다~ㅎ 하죠

 

 

 

하지만 컬럼명을 잘못입력하면 어떻게 될까요? 실수로 ename을 empname으로 입력을 해서 아래와 같이 에러가 났습니다.

에러가 나면? 에러명과 무엇이 잘못 되었는지를 보고 고치면 되지요 ㅎㅎ 에러는 참 고마운 것들입니다.


 



그 다음 옵션인 표현식!(expression)은 무엇일까요? 컬럼이외에 출력하기를 원하는 내용을 입력하는 것입니다.

이것 또한 어렵지 않아요 ㅎ  ' '(홑따옴표)에 문구를 넣으면 됩니다 ㅎ 벗어나면 아니되오 ㅎ

SELECT 'My Name is', ename FROM emp; 라고 해서 표현식을 넣어서 해봤습니다. 어색하네요 ㅎㅎ

 

 

 

이번에는 Alias라고 하는 것을 써볼텐데요. 별칭, 별명이라고 부릅니다.

크게 세가지로 할 수 있는데요. " "(쌍따옴표), as, 뒤에 붙이기. 또한번 직접 봐야겠죠?ㅎ

SELECT empno "사번", ename as "사원이름", sal 월급 FROM emp; 라고 해봤습니다. 어렵지않죠?

empno를 쌍따옴표 안의 사번으로 ename을 as의 쌍따옴표 안의 사원이름으로 sal을 뒤에 붙여서 월급

그냥 뒤에 붙여서 월급하지 왜 쌍따옴표로 할까요? 모르겠네요 @_@;; 보통은 쌍따옴표만 써서 alias를 표현 하는게 일반적입니다.

 

 

 

 

아직 설명 안한것이 있죠?ㅎ DISTINCT 입니다. 중복불가라는 것인데요. 원래는 성능이 급격히 떨어지는 원인으로 여겨서 사용에 유의해야했지만 10g부터는 Hash 알고리즘을 사용해서 성능이 향상되었습니다. 그래도 성능에 무리가 가긴 가겠죠?ㅎ

그림을 보고 비교를 해봅시당!

 

 

 

 좀 높낮이가 맞지 앉지만.. 비교를 해야겠죠..??ㅠㅠ

1번 SELECT deptno, job FROM emp;

2번 SELECT DISTINCT job FROM emp;

3번 SELECT DISTINCT deptno, job FROM emp;

이렇게 세개를 비교하겠습니다. 맨처음 1번의 경우 deptno, job 두 컬럼에 대해서 전체 조회를 하는 것입니다.

하지만 2번은 deptno을 빼고 DISTINCT job을 했습니다. 위에서 DISTINCT가 중복불가로 조회하는 명령어라고 했습니다.

1번과 2번을 보면 확연히 차이가 있죠?ㅎ 1번의 JOB에서는 수많은 중복값들이 존재하지만 2번의 job에서는 중복값이 없습니다.

3번을 보시게 되면 deptno에만 DISTINCT가 걸린 것 처럼 보이겠지만 DISTINCT는 한번만 쓰더라도 뒤에 있는 값들이 모두다 포함입니다. 그렇기 때문에 job까지 묶여서 중복값이 나오지 않는 것이죠. 결과값이 저렇게 나오는 이유는 그룹별로 묶어서 인데요.

DEPTNO을 20번을 갖는 애들중 JOB이 CLERK인 것이 여러개가 있지만 하나만 나오도록 되어있고 아래도 마찬가지입니다.

중요한건 DISTINCT와 나중에 설명드릴 Group by의 차이와 성능의 비교인데요. 한가지 말씀드리자면 Group by는 연산때 더 유용하다는것

 

이번 포스트에서는 간단하게 Select의 문법과 예제들로 설명을 했습니다. 다음 포스트에서는 연산자와 조건에 대해 말하겠습니다 이만 뿅!