Untitled_Blue

[SQL] WHERE 절, 연산자의 시작. 본문

Database/SQL

[SQL] WHERE 절, 연산자의 시작.

Untitled_Blue 2023. 5. 17. 21:25
반응형

안녕하세요. 이번 글은 WHERE 절에 대한 설명입니다.

- WHERE 절이란?

  • WHERE : 데이터를 조회할 때 특정 조건을 부여하는 방식으로 원하는 범위의 데이터만 조회가능하게 해주는 조건절

WHERE 절을 사용하면 조회하고자 하는 칼럼명을 언급하는 것보다 더 세밀하고 구체적으로 데이터를 조회가능하다.

예를 들어 EMP 테이블에서 JOB(직책 또는 직업)이 MANAGER인 사람만 추출해서 조회하고 싶으면 where 절을 어떻게 작성하면 될까? 이는 프로그래밍 언어의 제어자인 if문과 유사하다고 생각하면 된다.

select * from EMP where JOB = 'MANAGER';

다음과 같이 칼럼명 뒤에 = 을 붙이고 바로 뒤에 원하는 직책명을 입력하는 방식으로 원하는 부분만 골라서 조회할 수 있다. 이 외에도 DEPTNO처럼 다른 칼럼으로도 얼마든지 where 절에 적용할 수 있다.

- 2개 이상의 조건을 작성할 수 있는 AND, OR

where절에서 조건을 작성하는데 방금 전까지는 하나의 조건만 보여줬다. 그러나 조건문은 2개이상 작성할 수도 있다.

이때 조건들을 명시할 때는 이들을 분리해줄 필요가 있으며 이를 위해 AND와 OR을 사용한다.

  • AND : 여러 조건을 모두 성립하는 데이터 출력하나 없으면 아무것도 나오지 않는다.
  • OR : 여러 조건들 중 하나만 성립해도 조건에 성립하는 데이터를 출력한다.

이때 조건에 부합하는 데이터가 없으면 콘솔 (Console) 내지 CLI (Command Line Interface) 기반으로 실행하는 SQL*Plus에서는 no rows selected라고 출력해준다. (필자는 Oracle 사의 SQL Developer을 기준으로 실습 및 작성하고 있다.)

select * from EMP where SAL >= 1500 and JOB = 'MANAGER';

해당 소스코드를 보면 where 뒤에 and를 기점으로 두 개의 조건이 명시되어 있다. 이를 해석하면 SAL(급여)가 1500 이상이면서 JOB(직책)이 MANAGER인 행 단위 데이터를 출력하라는 뜻이다. 이는 곧 두 가지의 조건을 모두 성립하는 행만을 찾아서 출력하라는 뜻으로도 해석할 수 있다. 해당 코드를 실행해서 결과를 확인하면 사진처럼 SAL이 1500보다 크거나 같은 값을 보여주고 있는 동시에 JOB이 MANAGER인 데이터만 보여주고 있다는 점을 확인할 수 있다.

select * from EMP where DEPTNO = 20 or JOB = 'CLERK';

해당 소소코드 역시 where 뒤에 or을 기점으로 두 개의 조건이 명시되어 있는데 이는 EMP 테이블에서 DEPTNO (부서번호)가 20이거나 JOB (직책)이 CLERK 인 행 단위 데이터를 출력하라는 뜻이다. 이때 '이거나'라는 글자가 존재한다는 것은 곧 두 개의 조건 중 하나만 충족하는 데이터도 조회 가능하다는 뜻으로도 해석할 수 있다. 실행 후 결과를 확인해보면 부서번호가 20인 데이터가 출력된 것과 직책이 CLERK인 데이터가 조회되는 점을 알 수 있다. 이때 당장에 각 칼럼에 대한 조건과 다른 결과가 나왔다고 해서 잘못 나온 것이 아니다. 조건 하나만 충족해도 다른 조건이 부합되지 않은 칼럼도 나올 수 있기 때문이다. 프로그래밍 언어에서도 그랬듯이 OR 연산자는 또는 이라는 특성때문에 둘 중 하나라도 참이면 최종결과는 참이라는 점을 기억하자.

select * from EMP where hiredate >= '81/07/01' and (DEPTNO = 10 or DEPTNO = 20);

다음은 두 개의 연산자를 혼합해서 사용한 코드이다. 이런 비슷한 방식으로도 3개 이상의 조건을 설정할 수 있다.

해당 코드의 조건을 해석하면 HIREDATE (입사날짜)가 81년 7월 1일 이후이면서 DEPTNO (부서번호)가 10 또는 20인 데이터를 찾아서 출력하라는 뜻이다. 이렇게 보면 입사날짜에 대한 조건을 반드시 충족해야 되면서 부서번호 10, 20 중 반드시 하나가 성립되는 데이터만 조회될 수 있다는 점을 알 수 있다. 실행 결과를 보면 바로 알 수 있을 것이다. 부서번호가 10 또는 20, 그 외의 값은 나오지 않으면서 입사날짜가 81년 7월 1일 이후인 값이 출력됐다는 점을 확인할 수 있다.

- IN, NOT IN, BETWEEN 연산자

  • 칼럼명 IN (데이터1, 데이터2, ...) : OR 연산자를 간결하게 표현 가능한 연산자
  • 칼럼명 NOT IN (데이터1, 데이터2, ...) : IN 연산자의 반대이며 칼럼명을 기준으로 소괄호 안 데이터가 없는 행만 출력해주는 연산자
select * from EMP where DEPTNO IN (10, 30);

해당 코드는 DEPTNO의 값이 10이거나 30인 모든 칼럼에 대한 행을 출력하라는 뜻이다. OR로 해석하면 DEPTNO = 10 or DEPTNO = 30이다. 실제 결과에서도 10 또는 30인 조건을 충족하는 결과만 조회되는 점을 확인할 수 있다.

select * from EMP where DEPTNO NOT IN (10, 30);

해당 코드는 DEPTNO의 값이 10과 30 어느 것도 성립되지 않은 모든 칼럼에 대한 행을 출력하라는 뜻이다. 다르게 DEPTNO = 20이다. 코드 실행 후 실제 출력 결과를 보면 DEPTNO의 값이 10과 30 모두 해당되지 않는 20인 관련된 결과만 조회되는 점을 확인할 수 있다.

select * from EMP where HIREDATE BETWEEN '81/09/01' AND '81/12/31';

  • 칼럼명 BETWEEN 최소값 AND 최대값 : 최소값부터 최대값에 해당되는 데이터만 조회하는 연산자

다음은 BETWEEN 연산자이다. 이는 숫자 및 날짜의 범위를 지정할 때 사용한다. 해당 코드는 HIREDATE (입사날짜)가 81년 9월 1일부터 81년 12월 31일까지인 모든 칼럼에 대한 데이터를 출력하라는 뜻을 지니고 있다. 실제 실행 결과에서도 범위에 부합되는 선의 데이터를 조회할 수 있다는 점을 알 수 있다. BETWEEN 연산자를 범위 연산자와 AND를 활용하면 다음과 같다. 물론 결과는 동일하다.

select * from EMP where HIREDATE >= '81/09/01' and HIREDATE <= '81/12/31';
select * from EMP where SAL NOT BETWEEN 1000 AND 2000;
select * from EMP where SAL < 1000 OR SAL > 2000;

이는 NOT BETWEEN 연산자를 활용한 코드이다. 이는 SAL (급여)가 1000부터 2000까지에 해당되지 않는 데이터를 출력하는 뜻이다. 이를 범위 연산자와 OR를 사용하면 상단의 둘째 줄 코드와 같다. 출력 결과는 다음과 같다.

 

+ 범위 연산자

  • > : 초과 ( > 3000 이라고 하면 3000을 포함하지 않은 3001 부터의 값이 해당, 3000보다 큰 값)
  • < : 미만 ( < 2000 이라고 하면 2000을 포함하지 않은 1999, 1998, 1997 ... 의 값이 해당, 2000보다 작은 값)
  • >= : 이상 ( >= 5000 이라고 하면 5000보다 크거나 같은 값이 이에 해당, 5000도 해당 연산자에 포함됨)
  • <= : 이하 ( <= 6000 이라고 하면 6000보다 작거나 같은 값이 이에 해당, 6000도 해당 연산자에 포함됨)

다음 글은 SQL에서 제공하는 함수에 대한 설명입니다.

반응형

'Database > SQL' 카테고리의 다른 글

[SQL] 와일드 카드 (Wildcard)  (0) 2023.05.23
[SQL] IS NULL and IS NOT NULL 그리고 NVL and NVL2  (0) 2023.05.23
[SQL] SELECT  (1) 2023.05.16
[SQL] 데이터 모델  (0) 2023.05.05
[SQL] SQL과 데이터베이스에 대한 기본 이해  (0) 2023.05.03