Oracle SQL # 3. WHERE

Su Yeon·2021년 3월 21일

Oracle SQL

목록 보기
3/6

WHERE

조건에 맞는 데이터만 조회하기 위해 사용합니다.
WHERE 절에 기술한 조건을 참(TRUE)으로 만족하는 행들만 필터링해 조회합니다.


1. 연산자 종류

논리 연산자

  • AND : 두 조건 모두 만족하는지 확인. (많아지면 데이터 건수 감소)
    - OR : 두 조건 중 하나라도 만족하는지 확인. (많아지면 데이터 건수 증가)
    - NOT : 부정형 논리연산자. 다른 연산자와 결합해, 특정 조건을 부정
    (IS NOT, NOT IN, NOT LIKE)

비교 연산자

  1. = : 같은 값

  2. !=, <> : 다른 값

  3. > : 클때

  4. >= : 크거나 같을때

  5. < : 작을때

  6. <= : 작거나 같을때

  • emp 테이블에서 부서번호가 20번 부서에 속하지 않은 직원 조회
SELECT * 
FROM emp
WHERE deptno != 20;
  • users 테이블에서 이름이 brown인 직원만 조회
SELECT *
FROM users
WHERE userid = 'brown';	
  • 입사일이 1981년 3월 1일 이후인 직원 조회
SELECT * 
FROM emp
WHERE hiredate >= TO_DATE('1981/03/01', 'YYYY/MM/DD');
  • 언제나 참인 조건으로 필터링하면 모든 결과가 출력
SELECT * 
FROM emp
WHERE 1=1;
  • 언제나 거짓인 조건으로 필터링하면 아무것도 출력되지 않음
SELECT * 
FROM emp
WHERE 2=1;

BETWEEN AND

대상자 BETWEEN 시작값 AND 종료값

대상자, 시작값, 종료값이 필요한 삼항 연산자입니다.
포함(이상, 이하)의 개념으로, 시작값과 종료값 사이의 데이터를 조회합니다.

  • 부서번호가 10번에서 20번 사이에 속한 데이터
SELECT *
FROM emp
WHERE deptno BETWEEN 10 AND 20;

IN

대상자 IN (비교할 값1, 값2, 값3....)

비교값으로 여러 개가 올 수 있지만, 비교 값들을 하나의 항으로 묶어서 보기에 이항 연산자로 분류합니다.

  • 부서번호가 10번이나 20번인 데이터
SELECT * 
FROM emp
WHERE deptno IN(10, 20);
  • 논리 연산자 OR를 사용해 같은 결과를 출력
SELECT * 
FROM emp
WHERE deptno = 10 OR deptno = 20;	

NOT IN 연산자 사용 시 주의점
: INNOT을 붙여 부정형을 만들 수 있습니다.
단, 비교값 중 NULL이 포함되면 데이터가 조회되지 않습니다.

SELECT *
FROM emp
WHERE mgr IN (7698, 7839, NULL);

-->> WHERE mgr = 7698 OR mgr = 7839 OR mgr IS NULL;
NULL인 값은 조회되지 않을 겠지만
IN(OR)에서는 나머지 값들이 참인 값이 출력
 
SELECT *
FROM emp
WHERE mgr NOT IN (7698, 7839, NULL);

-->> mgr != 7698 AND mgr != 7839 AND mgr != NULL
NULL항과 AND으로 묶인 상태이기에 무조건 FALSE
에러는 나지 않지만 값이 나오지도 않음

LIKE

대상자 LIKE ‘비교할 문자열%’
대상자 LIKE ‘비교할 문자열_’

대상자와 비교할 문자열이 필요한 이항 연산자입니다.
문자열 패턴 매칭 결과를 조회합니다.
검색 기능을 구현할 때 쓰입니다.

% : 문자열 뒤에 0개 이상의 문자가 있을 때 (몇 개의 문자가 오는지 모를 때)
_ : 문자열 뒤에 1개의 문자가 있을 때 (몇 개의 문자가 오는지 알 때, _를 여러 개 사용해 지정해줌)

  • 첫 글자가 c고, 뒤에 0개 이상의 문자가 오는 사용자
SELECT *
FROM users
WHERE userid LIKE 'c%';
  • userid에 l이 들어가는 모든 사용자
SELECT *
FROM users
WHERE userid LIKE '%l%';	
  • 첫 글자가 c고, 뒤에 3개의 문자가 오는 사용자
SELECT *
FROM users
WHERE userid LIKE 'c___';

IS

NULL 비교 값

NULL 값은 =, != (비교연산자) 쓸 수 없기 때문에 IS를 사용합니다.

  • emp 테이블에서 상여급 컬럼의 값이 존재하지 않는 직원
SELECT *
FROM emp
WHERE comm IS NULL;
  • emp 테이블에서 상여급 컬럼의 값이 존재하는 직원
SELECT *
FROM emp
WHERE comm IS NOT NULL;

2. 연산자 우선순위

  1. 연산자
  2. 산술연산
  3. 문자열결합
  4. 비교연산
  5. IS, [NOT]
  6. [NOT] BETWEEN
  7. NOT
  8. AND
  9. OR
    *. ()

연산은 위의 우선순서를 따라 실행됩니다.
모두 외울 필요는 없고, AND가 OR 보다 먼저 실행된다는 것 정도만 알아둡니다.
헷갈리는 경우 ()를 사용해 우선순위를 조정할 수 있으니까요.

  • 이름이 ALLEN 이면서 job이 SALESMAN 이거나 이름이 SMITH인 직원
SELECT *
FROM emp
WHERE ename = 'SMITH' OR ename = 'ALLEN' AND job = 'SALESMAN';
  • 이름이 ALLEN 이거나 SMITH 이면서 job이 SALESMAN 인 직원
SELECT *
FROM emp
WHERE (ename = 'SMITH' OR ename = 'ALLEN') AND job = 'SALESMAN';

0개의 댓글