샘플 스키마 : HR

설명하는 과정에서 예제로 주어진 문장은 눈으로 보지만 말고 직접 실행시켜 보길 권한다.


행의 조건을 기술함으로써 테이블 내의 원하는 결과만 검색하는 WHERE 절에 대해 배워본다.



No. 01

 

 

WHERE 절을 이용한 검색 조건


기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 조건;

  • WHERE 절은 FROM 절 바로 뒤에 쓴다.
  • 조건을 통해 컬럼 내에 데이터를 제한한다.
  • 검색 조건이 문자이거나 날짜인 경우 반드시 단일 인용 부호를 사용해야 한다.
  • 조건에 사용되는 비교 연산자

연산자

의 미

 

=

같다

 

>

크다

 

<

작다

 

>=

크거나 같다

 

<=

작거나 같다

 

<>, !=, ^=

같지 않다

 



◈ 예제

▶ 이름이 'Ellen'인 사원의 사원번호, 메일, 직업, 급여 정보

select first_name, employee_id, email, job_id, salary

from employees

where first_name = 'Ellen';


※ 조건의 내용이 영문일 경우 대소문자를 구별해야 한다.


▶ 100번 부서에 속한 사원들의 사원번호, 이름 정보

select employee_id, first_name

from employees

where department_id = 100;



널 값의 비교 연산

널 값을 검색하는 경우 널 값은 일반 연산, 비교 연산이 불가능하기 때문에 다음의 연산자를 사용한다.

IS NULL : 널 값을 검색

IS NOT NULL :  널이 아닌 값을 검색


◈ 예제

▶ 보너스를 받지 못하는 사원의 이름, 월급, 전화번호를 검색

select first_name, salary, phone_number

from employees

where commission_pct is null;




No. 02

 

 

논리 연산자


기본 구조

SELECT * | {DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 조건 [논리연산자 조건 …];

  • 논리 연산자는 여러 개의 조건을 사용할 때 쓰인다.
  • AND, OR, NOT의 논리 연산자를 이용한다.
  • 두 개 이상의 논리연산을 할 때는 반드시 괄호로 연산의 우선순위를 결정하는 것이 좋다.
  • AND 연산자가 OR 연산자보다 우선순위가 높다.

연산자

설 명

 

AND

 조건을 모두 만족해야만 검색

 

OR

 조건 중 하나만 만족해도 검색

 

NOT

 조건을 만족하지 않아야 검색

 사용 NOT IN, NOT BETWEEN, NOT LIKE, NOT NULL



◈ 예제

▶ 60번 부서원들 중 급여가 5000 이상인 사원의 이름, 사원번호, 메일, 직업, 상사번호 정보

select first_name, employee_id, email, job_id, manager_id

from employees

where department_id = 60

and salary >= 5000;


▶ 부서 번호가 60이거나 급여가 5000 이상인 사원의 이름, 사원번호, 메일, 직업, 상사번호 정보

select first_name, employee_id, email, job_id, manager_id

from employees

where department_id = 60

or salary >= 5000;


60번 부서원들과 급여가 5000 이상인 사원이 모두 검색 되었다.


▶ 부서 번호가 60이 아닌 사원의 이름, 사원번호, 메일, 직업, 상사번호 정보

select first_name, employee_id, email, job_id, manager_id

from employees

where not department_id = 60;


NOT 연산자는 보통 위의 예제처럼 단일로 쓰이지 않는다.

NOT 연산자를 사용할 경우 아직 배우지 않았지만 위에 명시한 연산자들과 자주 쓰인다.



※ 주의



▶ JOB_ID가 'IT_PROG' 또는 'FI_ACCOUNT' 이면서 급여가 7000 이상인 사원을 검색하려 할 때


A

select first_name, job_id, salary

from employees

where job_id = 'IT_PROG'

or job_id = 'FI_ACCOUNT'

and salary >= 7000;


B

select first_name, job_id, salary

from employees

where (job_id = 'IT_PROG'

or job_id = 'FI_ACCOUNT')

and salary > = 7000;


두 문장은 괄호를 제외하고 완전히 같은 문장이지만 결과는 다르다.

결과가 다른 이유는 AND 연산자가 OR 연산자보다 우선순위가 높기 때문이다.

A 문장은 job_id가 'FI_ACCOUNT' 이면서 급여가 7000 이상인 사원들과 job_id가 'IT_PROG'인 사원들을 검색한 문장이고,

B 문장은 job_id가 'IT_PROG'와 'FI_ACCOUNT'인 사원들 중에서 급여가 7000 이상인 사원들을 검색한 문장이다.

한마디로 논리 연산자를 두 개 이상 사용할 경우 괄호를 사용하여 우선순위를 정해주어야 정확한 결과를 얻을 수 있다.





No. 03

 

 

기타 연산자 (BETWEEN, IN, LIKE)


BETWEEN 연산자 기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 컬럼 BETWEEN 값1 AND 값2;

  • 컬럼의 값이 값1 이상 값2 이하인 값을 검색한다.
  • 값1은 반드시 값2보다 작아야 한다.
  • AND 연산자를 사용하여 대체가능 하지만, 가독성을 위해 'BETWEEN ~ AND ~'를 사용


◈ 예제
▶ 급여가 5000에서 7000이내인 사원의 이름, 급여 정보

select first_name, salary

from employees

where salary between 5000 and 7000;



IN 연산자 기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 컬럼 IN (값1, 값2, …);

  • 지정한 값 중 일치하는 값이 하나라도 있으면 검색한다.
  • OR 연산자 = 연산자로 대체 가능하다.


◈ 예제
▶ 10, 60번 부서에 속한 사원의 이름, 사원번호, 급여 정보

select first_name, employee_id, salary

from employees

where department_id in (10, 60);



LIKE 연산자 기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 컬럼 LIKE '비교 문자열';

  • 문자 전용 비교 연산자이다.
  • 문자열의 일부만으로 검색 할 수 있다.
  • 와일드 문자를 사용한다.
    1. '_' : 반드시 한 개의 문자를 대체한다.
    2. '%' : 문자열을 대체하며, 문자가 없는 경우도 포함된다.
  • 와일드 문자 자체를 검색할 때는 ESCAPE 절(ESCAPE '지정할 문자')을 사용한다.

와일드 문자 사용 예

 예 문

설 명 

 

 '%s'

 's'로 끝나는 모든 문자열

 

's%'

 's'로 시작하는 모든 문자열

 

'%s%'

 's'를 포함하는 모든 문자열

 

'_s'

 's'로 끝나는 두 글자 단어

 

's__'

 's'로 시작하는 세 글자 단어

 

'%s!_%'

 ESCAPE '!'으로 지정한 경우, 's_'가 포함된 문자열

 

'__!%'

 ESCAPE '!'으로 지정한 경우, '%'로 끝나는 세 글자 단어

 


◈ 예제
▶ 이름이 'J'로 시작하는 사원의 이름, 사원번호, 부서번호 정보

select first_name, employee_id, department_id

from employees

where first_name like 'J%';


▶ 이름의 두 번째 알파벳이 'o'인 사원의 이름, 사원번호, 부서번호 정보

select first_name, employee_id, department_id

from employees

where first_name like '_o%';


▶ 이름에 '%'가 포함된 사원의 이름, 사원번호, 부서번호 정보

select first_name, employee_id, department_id

from employees

where first_name like '%!%%' escape '!';

이 예제에서는 결과는 나오지 않는다.

SQL문이 잘못된 것이 아니라 이름에 '%가 포함된 사원이 없기 때문이다.

escape 문자로 지정한 '!' 문자 뒤에 쓰여진 '%'나 '_'는 와일드 문자가 아니라 일반 문자로 인식된다.



'SQL' 카테고리의 다른 글

[SQL 06] 단일 행 함수 - 문자 함수  (0) 2017.12.03
[SQL 05] ORDER BY 절  (0) 2017.12.03
[SQL 03] SELECT 문  (0) 2017.11.30
[SQL 02] SQL Developer 간단 사용법 & SQL 언어  (0) 2017.11.29
[SQL 01] HR schema 구조  (0) 2017.11.29

+ Recent posts