DB/Oracle

WHERE절과 연산자

2022. 1. 27. 12:00
목차
  1. WHERE절
  2. 여러 개 조건식을 사용하는 AND, OR 연산자
  3. AND
  4. OR
  5. 산술 연산자
  6. 비교 연산자
  7. LIKE 연산자와 와일드 카드
  8. IS NULL 연산자
  9. 집합 연산자

WHERE절

 SELECT문에서 테이터를 조회할 때 특정 조건, 기준으로 행을 출력하기 위해 'WHERE절'을 사용한다. 만약 부서 번호가 30인 데이터만 출력하고 싶다면 다음과 같은 SQL문과 함께 출력된다.

 

 

SELECT * FROM EMP
WHERE DEPTNO = 30;

 

 

 

WHERE절의 기본 형식은 다음과 같다.

 

SELECT [조회할 열 1 이름]. [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하기 위한 조건식];

 

 

여러 개 조건식을 사용하는 AND, OR 연산자

AND

 두 개의 조건식을 동시에 사용할 때 AND연산자를 사용한다. 예를 들어 부서(DEPTNO)가 '30'이면서, 직업(JOB)이 'SALESMAN'인 조건식을 만든다면 AND연산자를 사용하여 다음과 같이 작성할 수 있다.

 

SELECT * FROM EMP WHERE DEPTNO = 30
AND JOB = 'SALESMAN';

 

 

 

OR

 AND연산자는 모든 조건이 만족해야지만 출력되지만 OR연산자는 조건 중 하나만 조건이 충족돼도 출력된다. 부서(DEPTNO)가 30 '혹은' 직업(JOB)이 'CLERK'인 쿼리문을 출력해보자.

 

SELECT * FROM EMP WHERE DEPTNO = 30
OR JOB = 'CLERK';

 

 

 

 쿼리문의 조건에서는 직업(JOB)을 'CLERK'인 데이터를 출력하기로 했다. 그런데 출력된 결과물을 보면, 'SALESMAN', 'MANAGER'이 포함된 데이터도 출력된 걸 볼 수 있다. 그 이유는 OR조건식에서 부서가 30인 데이터도 출력하기로 했기 떄문이다. 즉, 쿼리의 조건식에서 'CLERK'문을 만족하지 못해도 부서(DEPTNO)에서 30인 조건을 만족되면 데이터가 출력된다. 

 

산술 연산자

 산술 연산자는 사칙연산 더하기(+), 빼기(-), 곱하기(*), 나누기(-)를 사용한다. 대표적으로 곱셈 산술 연사자를 사용된 쿼리를 살펴보자.

 

SELECT * FROM EMP
WHERE SAL * 12 = 36000;

 

 

 

 

비교 연산자

대소 비교 연산자

연산자 사용법 설명
> A > B A값이 B값을 초과하는 경우 true
>= A >= B A값이 B값 이상일 경우 true
< A < B A값이 B값 미만일 경우 true
<= A <= B A값이 B값 이하일 경우 true

 

 비교 연산자는 SQL문을 작성할 때 연산자 앞뒤에 있는 데이터 값을 비교할 때 사용한다. 대표적으로 월급(SAL)이 3000이상인 값을 출력해보겠다.

 

SELECT * FROM EMP
WHERE SAL >= 3000;

 

 

등가 비교 연산자

등가 비교 연산자는 연사자 양쪽 항목이 같은 값인지 아닌지 비교하는 연산자다. 등가 비교 연산자는 아래와 같다.

 

연산자 사용법 의미
= A = B A 값이 B값과 같을 경우 true, 다를 경우 false 변환
!= A != B A 값과 B 값이 다를 경우 true, 같을 경우 false 반환
<> A <> B -
^= A ^= B -

 

SELECT * FROM EMP
WHERE SAL != 3000;

 

 

SELECT * FROM EMP
WHERE SAL <> 3000;

 

 

SELECT * FROM EMP
WHERE SAL ^= 3000;

 

 등가 비교 연사자중에서 특히 '!='와 '<>'를 많이 사용한다.

 

 

논리 부정 연산자

 비교 연산자는 아니지만, 비교 연산자 중 부정하는 연산자(^=, !=, <>)와 같은 연산자를 논리 부정 연산자(NOT 연산자)라 한다. 보통 NOT 연산자를 IN, BETWEEN, IS NULL 연산자와 함께 복합적으로 사용하며 복잡한 여러 개 조건식이 AND, OR로 묶여 있는 상태에서 정반대 결과를 얻고자 할 떄 유용하게 사용한다. 예시로 급여(SAL)가 3000이 아닌 데이터들을 출력해보겠다. 

 

SELECT * FROM EMP
WHERE NOT SAL = 3000;

 

 

 

 

IN 연산자

 다양한 직업(JOB)의 데이터들을 뽑고싶다. 예를 들어 'MANAGER', 'SALESMAN', 'CLERK'가 포함된 데이터를 뽑고 싶다. 기존의 우리가 배운 연산자를 사용하면 다음과 같이 쿼리문을 작성할 수 있다.

 

SELECT * FROM EMP
WHERE JOB = 'MANAGER'
  OR  JOB = 'SALESMAN'
  OR  JOB = 'CLERK';

 

 하지만 'OR'과 'JOB'을 반복해야 한다는 번거로움이 있다. 이러한 문제를 해결하기 위해 특정 열을 해당하는 조건을 여러개 출력할 수 있는 'IN 연산자'를 사용한다.

 

SELECT * FROM EMP
WHERE JOB IN ('MANAGER', 'SALESMAN', 'CLERK');

 

 IN 연산자와 논리 부정 연산자를 함께 사용할 수 있다. 

 

SELECT * FROM EMP
WHERE JOB NOT IN ('MANAGER', 'SALESMAN', 'CLERK');

 

BETWEEN A AND B 연산자

 급여(SAL) 열 값이 2000이상 3000이하를 갖는 사원 데이터를 조회해보자. 앞에서 배운 대소 비교연산자와 AND 연산자를 사용하면 다음과 같이 쿼리문을 짤 수 있다.

 

SELECT * FROM EMP
WHERE SAL >= 2000
  AND SAL <= 3000;

 

 하지만 조건 사이의 값을 구할 때 비교 연산자와 AND연산자를 사용한다면 AND가 반복되고 일일이 비교연산자를 넣어줘야 한다는 불편함이 있다. SQL에서는 이러한 문제를 해결하기 위해 'BETWEEN A AND B' 연산자를 제공한다. 기본 형식은 아래와 같다.

 

SELECT [조회할 열 1 이름], [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 BETWEEN 최솟값 AND 최댓값;

 

 대소 비교 연사자와 AND연산자를 사용하지 않고 BETWEEN연산자로만 사원의 급여 값이 2000이상 3000이하인 데이터를 구해보자.

 

SELECT * FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;

 

 

 

 IN 연산자와 마찬가지로 NOT 연산자를 앞에 붙이면 급여의 값이 2000~3000사이 이외의 값을 가진 데이터를 출력할 수 있다.

 

SELECT * FROM EMP
WHERE SAL NOT BETWEEN 2000 AND 3000;

 

 

 

 

LIKE 연산자와 와일드 카드

 LIKE 연산자는 일부 문자열이 포함된 데이터를 조회할 떄 사용한다. 만약 직원의 이름(ENAME)중에 맨 앞에 'S'로 시작되는 데이터들을 출력한다면, LIKE 연산자를 통하여 다음과 같이 SQL문을 작성한다.

 

SELECT * FROM EMP
WHERE ENAME LIKE 'S%';

 

 

 

 SQL출력된 데이터를 보면 사원의 이름(ENAME)이 모두 맨 앞에 'S'가 붙어있는 걸 확인할 수 있다. LIKE연산자는 홀로 쓰이지 않고 와일드 카드와 함께 사용할 수 있다. 와일드 카드는 '_'와 '%'이다. 앞에서 '%'의 사용에 대해 알아봤으니 '_'의 사용에 대해 알아보자.

 

 

종류 의미
_ 어떤 값이든 상관없이 한 개의 문자 데이터를 의미
% 길이와 상관없이(문자 없는 경우도 포함) 모든 문자 데이터를 의미

 

 

SELECT * FROM EMP
WHERE ENAME LIKE '_L%';

 

 

 

 

 쿼리문에 와일드 카드를 사용하여 위와 같은 결과물이 출력된다. 데이터 첫 번째 문자가 와일드 카드(_)이기 때문에 문자 종류와 상관없이 L앞에는 단 하나의 문자가 오는 것을 의미한다. 두번째 글자가 L이고 L 이후 와일드 카드(%)를 지정했기 때문에 L 뒤에 올 문자는 어떤 종류의 문자가 몇 개가 오든 상관없다.

 

 어떤 단어가 포함된 제목 또는 본문 검색과 같은 기능을 구현할 때는 원하는 문자열 앞뒤 모두 와일드 카드(%)를 붙여줄 수 있다. 앞뒤에 어떤 종류의 문자가 오건 상관없이 사원이름(ENAME) 중간에 'AM'이 포함되는 쿼리를 짤 떄는 다음과 같다.

 

SELECT * FROM EMP
WHERE ENAME LIKE '%AM%';

 

 

 

 

 

IS NULL 연산자

 NULL은 데이터 값이 완전히 '비어 있는' 상태를 말한다. NULL을 이해할 때 유의해야 할 점은 숫자 0은 값 0이 존재한다는 뜻이므로 값 자체가 존재하지 않는다는 NULL과 혼동하지 말아야 한다. 따라서 NULL은 '현재 무슨 값인지 확정되지 않은 상태'이거나 '값 자체가 존재하지 않는 상태'를 나타내는 데이터에 사용한다.

 

 

의미 예
값이 존재하지 않음 통장을 개설한 적 없는 은행 고객의 계좌 번호
해당 사항 없음 미혼인 고객의 결혼기념일
노출할 수 없는 값 고객 비밀번호 찾기 같은 열람을 제한해야 하는 특정 개인 정보
확정되지 않은 값 미성년자의 출신 대학

 

 NULL값을 사용할 때는 SQL문에 'NULL'을 사용하지 않는다. NULL을 사용하면 산술 연사자와 비교 연산자로 비교해도 결과 값이 NULL이 되기 떄문이다. 어떤 값인지 모르는 값에 숫자를 더해도 어떤 값인지 알 수 없고, 어떤 값인지 모르는 값이 특정 값보다 큰지 작은지 알 수 없는 것과 같은 이치다. 

 

 

SELECT * FROM EMP
WHERE COMM = NULL;

 

 

 

 NULL로는 값을 출력할 수 없기 때문에 쿼리문에는 'NULL'대신 'IS NULL'을 사용한다.

 

 

SELECT * FROM EMP
WHERE COMM IS NULL;

 

 

 

 

집합 연산자

관계형 데이터베이스 개념은 집합론에서 시작됐다. 그래서 합집합, 차집합, 교집합을 SQL문으로 표현할 수 있다.

 

UNION

'UNION'은 합집합을 의미한다. 10분 부서에 근무하는 사원과 20번 부서에 근무하는 사원 정보를 UNION으로 합쳐보자. UNION을 사용할 때 하는 SELECT문의 열 개수와 각 자료형이 순서별로 일치해야한다.

 

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 10

UNION

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 20;

 

 

 

 

UNION ALL

'UNION ALL'은 두 SELECT문의 중복된 값이 함께 출력된다.

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 10

UNION ALL

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 10;

 

 

 

 

 

MINUS

 MINUS 연산자는 차집합을 의미한다. 두 SELECT문을 MINUS 연산자로 묶어 주면 두 SELECT문의 결과 값이 같은 데이터는 제외하고 첫 번째 SELECT문의 결과 값이 출력된다. EMP 테이블 전체 행을 조회한 첫 번째 SELECT문의 결과에서 10번 부서에 있는 사원 데이터를 제외한 결과값이 출력해보자.

 

 

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP

MINUS

SELECT EMPNO, ENAME, SAL, DEPTNO FROm EMP
WHERE DEPTNO = 10;

 

 

 

 

INTERSECT 

 'INTERSECT' 연산자는 교집합을 의미하므로 두 SELECT문의 결과 값이 같은 데이터만 출력된다.

 

 

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP

INTERSECT

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP
WHERE DEPTNO = 10;

 

 

 

 


출처:Do it! 오라클 배우는 데이터베이스 입문(저자:이지훈, 출판사:이지스퍼블리싱)

'DB > Oracle' 카테고리의 다른 글

[오라클 함수] NULL 처리 함수  (0) 2022.02.10
[오라클 함수] 형 변환 함수  (0) 2022.02.09
[오라클 함수] 날짜 함수  (0) 2022.02.09
[오라클 함수] 문자함수  (0) 2022.02.07
SELECT문의 기본 형식  (0) 2022.01.25
  1. WHERE절
  2. 여러 개 조건식을 사용하는 AND, OR 연산자
  3. AND
  4. OR
  5. 산술 연산자
  6. 비교 연산자
  7. LIKE 연산자와 와일드 카드
  8. IS NULL 연산자
  9. 집합 연산자
'DB/Oracle' 카테고리의 다른 글
  • [오라클 함수] 형 변환 함수
  • [오라클 함수] 날짜 함수
  • [오라클 함수] 문자함수
  • SELECT문의 기본 형식
각시탈코더
각시탈코더
각시탈코더
각시탈코더
각시탈코더
전체
오늘
어제
  • 분류 전체보기 (203)
    • java (46)
      • 객체지향 (20)
      • 기본문법 (8)
      • 자바의 정석 연습문제 오답노트 (9)
      • 백준 알고리즘 (9)
    • Spring (17)
      • SpringMVC (8)
      • Spring DI와 AOP (5)
      • REST API와 Ajax (1)
      • Spring 프로젝트 (1)
      • Spring Security (0)
    • DB (47)
      • Oracle (15)
      • SQL오답노트 (25)
      • 튜닝 (0)
      • ERD (1)
      • DB 모델링 (5)
    • Servlet & JSP (3)
    • JDBC (2)
      • 기본 (1)
      • 스프링JDBC (1)
    • MyBatis (2)
    • JavaScript (2)
      • 코딩애플 (0)
      • 문법 (1)
    • React (0)
      • 코딩애플 (0)
    • HTML (0)
      • 모던 웹을 위한 HTML5+CSS3 바이블 (0)
    • CSS (0)
      • 모던 웹을 위한 HTML5+CSS3 바이블 (0)
    • Linux (0)
    • Git & GitHub (2)
      • Git (1)
    • CS (19)
      • 네트워크 (6)
      • HTTP (7)
      • 컴퓨터구조 (0)
      • 자료구조와 알고리즘 (2)
      • 기타 (4)
    • 개발설정 (2)
    • 기술면접 (0)
      • JAVA (0)
      • Spring (0)
      • DB (0)
      • 네트워크 (0)
      • 공통 (0)
    • 프로젝트 (2)
      • 게시판만들기 (2)
    • 기혁씨의 삽질표류기 (28)
    • 참고자료 (2)
      • 국비수업 (0)
      • 당당 프로젝트 (1)
    • 뉴렉처 (17)
      • 자바 (11)
      • 자바스크립트 (3)
      • 키워드 (0)
      • 숙제 (0)
      • CSS (0)
      • DB (3)
      • 서블릿 (0)
      • 스프링 (0)
      • DOM (0)
    • 내가 만든 학습그림 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 객체지향
  • Java
  • Oracle
  • 에러
  • 백엔드
  • 백준
  • 서브쿼리
  • 프로그래머스
  • It
  • 자바의정석
  • 웹프로그래밍
  • spring
  • 오라클
  • 네트워크
  • 모두의네트워크
  • 알고리즘
  • db
  • 배열
  • 스프링
  • SQL
  • 공부
  • 뉴렉처
  • 오류
  • 개발자
  • 국비수업
  • 코딩
  • 연습문제
  • 쿼리
  • 자바의정석기초편
  • 자바

최근 댓글

최근 글

hELLO · Designed By 정상우.
각시탈코더
WHERE절과 연산자
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.