Oracle SQL

[SQL] WHERE 절

YoonJuHan 2023. 4. 5. 19:07

WHERE

  1. WHERE 절을 사용하여 쿼리에 반환되는 행을 제한
    1. FROM 절 다음에서 조건을 표현하기 위해 열 이름, 표현식, 비교 연산자 및 상수로 구성
    2. 단일 SELECT 문장에서 WHERE 절은 한 번만 사용 가능
    3. WHERE 절에 여러 조건을 지정하기 위하여 AND, OR과 같은 논리 연산자를 사용
  2. WHERE 절의 기본 사용법
    1. 열 이름, 비교 조건, 상수 또는 값 목록 등 세 가지 요소로 구성
    2. 문자열 및 날짜는 단일 인용부호로 묶어야 하며 대소문자 구분
    3. 날짜는 기본 날짜 형식을 사용
  • 100번 부서에서 근무하는 사원에 대한 사번, 이름, 직급, 부서번호를 나열
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE dept_id = 100;

 

  • 직급이 부사장인 직원의 사번, 이름, 직급, 부서번호를 출력
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '부사장';

 

  • 2001년 3월 19일에 입사한 사원의 사원번호, 이름, 급여, 입사일을 조회
SELECT emp_id, emp_name, salary, hiredate
FROM y_emp
WHERE hiredate = '01/03/19';

 

  • 결과가 나오지 않거나 오류가 발생하는 경우
-- 결과가 나오지 않음(오류는 아님) : 공백을 포함하고 있어서 같은 이름이 없음
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE emp_name = '김 혜수';

-- 오류 : 문자열을 작은 따옴표 '' 로 묶어야 함
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = 부사장;

 

일반 비교 연산자의 사용

  1. 주로 표현식을 다른 값이나 표현식과 대소비교를 하기 위해 사용
일반적인 비교 연산자의 종류
연산자 의미
= 같다
> 보다 크다
< 보다 작다
>= 보다 크거나 같다
<= 보다 작거나 같다
<>, !=, ^= 같지 않다

 

  • 급여가 400 이하인 사원의 이름과 급여를 검색
SELECT emp_id, emp_name, salary
FROM y_emp
WHERE salary <= 400;

 

  • WHERE 절에서 salary * 12 처럼 표현식에 대한 비교를 할 수도 있다. 연봉이 8000보다 많은 직원을 검색
SELECT emp_name, salary*12 annsal
FROM y_emp
WHERE salary * 12 > 8000;

 

  • 2017년 1월 1일 이후에 입사한 사원을 검색
SELECT emp_id, emp_name, position, hiredate
FROM y_emp
WHERE hiredate > '17/01/01';

 

  • 별칭을 비교 조건으로 하면 오류 발생
SELECT emp_name, salary * 12 annsal
FROM y_emp
WHERE annsal > 8000;

 

기타 SQL 연산자

  1. SQL에서만 사용되는 비교 연산자
  2. 모든 데이터 유형에 적용
SQL 연산자 종류
연산자 의미
BETWEEN a AND b a와 b의 값 사이
IN (list...) 괄호 안의 값 목록 중 하나와 일치
LIKE 문자의 패턴 일치
  1. BETWEEN a AND b
    1. BETWEEN 범위 조건을 사용하면 값의 범위에 따라 행을 표시
    2. 하한값과 상한값도 지정된 범위에 포함
    3. BETWEEN 조건으로 지정한 값은 하한값을 먼저 지정
  2. IN(list...)
    1. IN 연산자 다음의 괄호 안에 원하는 값의 리스트를 명시
    2. 리스트에 포함된 값중 하나와 일치되는 값을 포함하는 행이 결과로 반환
  3. LIKE
    1. 검색할 값을 정확하게 알지 못하는 경우 LIKE 조건을 사용하여 문자 패턴이 일치하는 행을 선택
    2. 검색 문자열은 % 또는 _ 이 두 가지 기호를 사용하여 구성
      1. %는 0개 이상의 문자 대체
      2. _는 하나의 문자만 대체
    3. %나 _가 포함된 데이터의 검색 방법
      1. %나 _앞에 ESCAPE 문자로 지정
      2. ESCAPE문자는 사용자 임의로 지정 가능

 

  • 급여가 600 이상 700 이하인 사원 검색
SELECT emp_name, salary
FROM y_emp
WHERE salary BETWEEN 600 AND 700;

 

  • 관리자의 사원 번호가 1001, 1002, 1003인 모든 사원의 사원 번호, 이름, 급여 및 관리자의 사원 번호를 검색
SELECT emp_id, emp_name, salary, mgr_id
FROM y_emp
WHERE mgr_id IN (1001, 1002, 1003);

 

  • 단일 인용 부호를 사용하여 직급이 부장 또는 차장인 사원을 검색
SELECT emp_name, position
FROM y_emp
WHERE position IN ('부장', '차장')

 

  • 김씨인 모든 사원의 사원번호와 이름을 검색
SELECT emp_id, emp_name
FROM y_emp
WHERE emp_name LIKE '김%';

 

  • 이름의 두 번째 문자가 '승'인 사원을 검색
SELECT emp_id, emp_name
FROM y_emp
WHERE emp_name LIKE '_승%';

 

  • PAY_LEVEL이 "_B"인 정보를 검색
SELECT *
FROM pay_grade
WHERE pay_level LIKE '%\_B' ESCAPE '\';

 

NULL 조건

  1. NULL 값은 어떤 값과도 동일성 여부를 판별 불가
    1. = NULL을 사용하여 비교 불가능
    2. NULL 여부를 테스트하기 위한 비교 연산자를 사용
    3. NULL인 데이터를 보기 위해서 IS NULL 연산자를 사용
    4. NULL이 아닌 데이터를 조회하기 위해서는 IS NOT NULL 연산자를 사용
  • 부서 정보가 NULL인 사원을 검색
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE dept_id IS NULL;

 

  • COMM이 NULL이 아닌 사원 즉 회사에서 Commission을 받는 사원을 검색
SELECT emp_id, emp_name, comm
FROM y_emp
WHERE comm IS NOT NULL;

 

논리 연산자 [AND, OR, NOT]

  1. 단일 SELECT 문에 WHERE 절은 한 번만 사용
  2. WHERE 절에 여러 조건을 조합하여 출력될 행을 더욱더 제한하기 위하여 논리 연산자를 사용
  3. 논리 연산자의 종류 : AND, OR, NOT
  4. AND
    1. WHERE 절의 조건을 모두 만족하는 데이터를 반환
    2. 조건 가운데 어느 한 가지 조건에 대한 결과라도 거짓 또는 NULL일 경우 해당 행은 포함되지 않는다.
  5. OR
    1. OR 연산자는 조건 중 하나만 만족하면 레코드를 선택
    2. 조건 가운데 어느 한 가지 조건에 대한 결과가 거짓 또는 NULL일 경우에도 해당 행은 결과에 포함된다.
  6. NOT
    1. NOT 연산자 다음에 오는 조건에 대해 거짓인 행이 반환
    2. NOT 연산자는 BETWEEN, LIKE, IN 등 다른 SQL 연산자와 함께 사용
    3. 쉽게 말해 거짓은 참으로 참은 거짓으로 결과를 뒤집는 것
    4. 사용 예시 : NOT IN, NOT LIKE, NOT BETWEEN, IS NOT NULL

 

  • 직급이 '사원'이고 400번 부서에 속하는 사원을 검색
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '사원' AND dept_id = 400;

 

  • 직급이 '사원'이거나 400번 부서에 속하는 사원을 검색
SELECT emp_id, emp_name, position, dept_id
FROM y_emp
WHERE position = '사원' OR dept_id = 400;

 

  • 직급이 과장, 대리, 사원이 아닌 사원을 검색
SELECT emp_id, position, dept_id
FROM y_emp
WHERE position NOT IN ('과장', '대리', '사원');

 

연산자 우선 순위 규칙

  1. 표현식을 평가하고 계산하는 순서를 결정
  2. 괄호를 사용하여 우선순위 변경 가능
기본 우선 순위 순서
순위 연산자
1 산술 연산자 (*, /, +, -)
2 연결 연산자 (||)
3 비교 연산자 (=, >, >=, <, <=, <>)
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 NOT
7 AND
8 OR

 

  • 직급이 차장 이거나 부장이고 급여가 700이 넘는 사원을 검색
SELECT emp_name, position, salary
FROM y_emp
WHERE position = '차장' OR position = '부장' AND salary > 700;

 

  • 차장 또는 부장인 사원 가운데 급여가 700이 넘는 사원을 검색
SELECT emp_name, position, salary
FROM y_emp
WHERE (position = '차장' OR position = '부장') AND salary > 700;