ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL/ORACLE] WHERE 절
    카테고리 없음 2022. 12. 28. 16:41

     

    검색될 행의 제한 : WHERE

    ■ 검색될 행의 제한 : WHERE 

    명칭 설명
    WHERE 쿼리에서 반환되는 행을 제한
    만족해야 할 조건을 포함하며 조건이 참일 경우 조건을 만족하는 행이 반환

    ■ 구문

     SELECT *|{[DISTINCT] column|표현식 [별칭],...}
    FROM table
    [WHERE 조건(s)];

    ■ WHERE 절의 기본 사용법

    • WHERE 절은 열 이름, 비교 조건, 상수 또는 값 목록 등 3가지의 요소로 구성
    -- 100번 부서에서 근무하는 사원에 대한 사번, 이름, 직급, 부서번호를 나열
    SELECT emp_id, emp_name, position, dept_id
    FROM y_emp
    WHERE dept_id = 100;


    • "WHERE dept_id = 100" 처럼 숫자는 단일 인용부호('')를 사용하지 않고 검색
    • 문자열 및 날짜는 단일 인용부호로 묶어야 하며 대소문자를 구분
    -- 잘못된 예
    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 emp_name = '김혜수';

    -- 문자데이터 검색에 인용부호를 사용하지 않을 경우
    SELECT emp_id, emp_name, position, dept_id
    FROM y_emp
    WHERE position = 부사장;

    -- 문자데이터 검색에 인용부호를 사용
    SELECT emp_id, emp_name, position, dept_id
    FROM y_emp
    WHERE position = '부사장';

    -- Y_EMP 테이블에서 사원번호, 이름, 생년월일, 입사일을 조회하여 현재날짜 형식을 확인
    SELECT emp_id, emp_name, birthdate, hiredate
    FROM y_emp;

    -- 날짜 형식도 마찬가지로 단일 인용부호 ('')로 묶어주어야 한다.
    SELECT emp_id, emp_name, salary, hiredate
    FROM y_emp
    WHERE hiredate = '2001/03/19';


    ■ 일반 비교연산자의 사용

    연산자 설명
    = 같다
    > 보다 크다
    < 보다 작다
    >= 보다 크거나 같다
    <= 보다 작거나 같다
    <>, !=, ^= 같지 않다
    -- y_emp 테이블에서 급여가 400이하인 사원의 이름과 급여 검색
    SELECT emp_id, emp_name, salary
    FROM y_emp
    WHERE salary <= 400;

    -- WHERE 절에서 "salary*12" 처럼 표현식에 대한 비교 가능
    SELECT emp_id, emp_name, salary
    FROM y_emp
    WHERE salary*12 > 8000;

    • 표현식에 대한 비교 시 WHERE 절에는 별칭을 사용할 수 없다.
    -- 표현식 비교시 WHERE 절에는 별칭 사용 불가
    SELECT emp_id, emp_name, salary annsal
    FROM y_emp
    WHERE annsal > 8000;

    • 대소의 비교는 숫자만 가능한 것이 아니다.
    • 문자나 날짜 데이터도 대소의 비교가 가능하다.
    • 문자는 영문자 순(ASCII 코드 값 기준)으로 A가 가장 작고 Z가 가장 크다.
    • 날짜는 과거 -> 미래로 갈수록 큰 값으로 평가
    -- 2017년 1월 1일 이후에 입사한 사원을 검색
    SELECT emp_id, emp_name, position, hiredate
    FROM y_emp
    WHERE hiredate > '2017/01/01';


    ■ 기타 SQL 연산자

    연산자 설명
    BETWEEN ··· AND ··· 두 값의 범위 사이
    IN(list ···) 괄호 안의 값 목록 중 하나와 일치
    LIKE 문자 패턴 일치
    %는 0개 이상의 문자
    _는 하나의 문자
    -- 급여가 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, dept_id
    FROM y_emp
    WHERE position IN ('부장','차장');

    -- Y_EMP 테이블에서 EMP_ NAME이 김씨인 모든 사원의 사원번호와 이름 검색
    SELECT emp_id, emp_name
    FROM y_emp
    WHERE emp_name LIKE '김%';

    -- 두 번째 문자가 '승'인 사원 표시
    SELECT emp_id, emp_name
    FROM y_emp
    WHERE emp_name LIKE '_승%';

    • 검색할 문자에 실제로 '%' 및 '_' 문자가 포함된 경우에는 해당문자 앞에 임의의 문자를 지정하고 ESCAPE 옵션을 사용하여 이스케이프 문자로 지정
    -- 다음은 PAY_GRADE테이블에서 PAY_LEVEL이 "_B"인 정보를 검색한다.
    SELECT *
    FROM pay_grade
    WHERE pay_level LIKE '%@_B' ESCAPE '@';


    ■ NULL 조건

    -- 부서정보가 NULL인 사원을 검색한다.
    SELECT emp_id, emp_name, position, dept_id
    FROM y_emp
    WHERE dept_id IS NULL;
    -- 부서정보가 NULL이 아닌 사원을 검색한다.
    SELECT emp_id, emp_name, position, dept_id
    FROM y_emp
    WHERE dept_id IS NOT NULL;

    ■ 논리 연산자(AND, OR, NOT)

    연산자 설명
    AND WHERE 절의 조건을 모두 만족하면 데이터 반환
    OR 조건 중 하나만 만족하면 레코드를 선택
    NOT NOT 연산자 다음에 오는 조건에 대해 거짓인 행 반환
    BETWEEN, LIKE, IN 등 다른 SQL 연산자와 함께 사용할 수 있다.
    -- 직급이 '사원'이고 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, emp_name, position, dept_id
    FROM y_emp
    WHERE position NOT IN ('과장','대리','사원');


    ■ 연산자 우선 순위

    순위 연산자
    1 산술연산자(X, /, +, -)
    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;

    • 예제의 결과에서 직급이 차장인 사원은 SALARY가 700을 넘지 않아도 출력이 되었다.
    • 즉 연산자 우선순위 규칙에 의해 AND로 연결된 두 조건문에 대하여 먼저 평가되었음을 알 수 있다.
    -- 직급이 차장 또는 부장인 가운데 급여가 700이 넘는 사원 검색
    SELECT emp_name, position, salary
    FROM y_emp
    WHERE (position = '차장' 
    OR  position = '부장')
    AND salary > 700;


     

Designed by Tistory.