티스토리 뷰

<WHERE 절>

  • 조회하고자 하는 테이블에서 해당 조건에 만족하는 결과만을 조회하고자 할 때 사용한다.
  • 조건식에는 다양한 연산자들을 사용할 수 있다.
[표현법]
SELECT 컬럼, 컬럼, ..., 컬럼
FROM 테이블명
WHERE 조건식;

 

 

<비교 연산자>

>, <, >=, <= : 대소 비교
              =  : 동등 비교
 !=, ^=, <>   : 같지 않다   /기호들의 순서가 바뀌면 안된다
--EMPLOYEE 테이블에서 부터 코드가 D9와 일치하는 사원들의 모든 컬럼 정보 조회
SELECT *
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D9';

--EMPLOYEE 테이블에서 부서 코드가 D9가 아닌 사원들의 사번, 사원명, 부서 코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE
  FROM EMPLOYEE
--WHERE DEPT_CODE != 'D9';
--WHERE DEPT_CODE ^= 'D9';
 WHERE DEPT_CODE <> 'D9';

-- EMPLOYEE 테이블에서 급여가 400만원 이상인 직원들의 직원명, 부서 코드, 급여 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE SALARY >= 4000000;

여기서 잠깐!

↓실습문제

더보기
-- 1.EMPLOYEE 테이블에서 재직 중(ENT_YN)인 직원들의 사번, 이름, 입사일 조회

-- 2.EMPLOYEE 테이블에서 연봉이 5000이상인 직원의 직원명, 급여, 연봉, 입사일 조회












/* 정답
1.EMPLOYEE 테이블에서 재직 중(ENT_YN)인 직원들의 사번, 이름, 입사일 조회
SELECT EMP_ID AS "사번",
       EMP_NAME AS "이름",
       HIRE_DATE AS 입사일
  FROM EMPLOYEE
 WHERE ENT_YN = 'N';

-- 2.EMPLOYEE 테이블에서 연봉이 5000이상인 직원의 직원명, 급여, 연봉, 입사일 조회
SELECT EMP_NAME AS "직원명",
       SALARY AS "급여",
       SALARY * 12 AS "연봉",
       HIRE_DATE AS "입사일"
  FROM EMPLOYEE
 WHERE SALARY * 12 >= 50000000;
 */

 

 

<논리 연산자>

여러 개의 조건을 엮을 때 사용한다.

 AND (~ 이면서, 그리고)
   OR (~ 이거나, 또는)
-- EMPLOYEE 테이블에서 부서 코드가 D6이면서 급여가 300만원 이상인 직원들의 사번, 직원명, 부서 코드, 급여 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D6'
   AND SALARY >= 3000000;

-- EMPLOYEE 테이블에서 급여가 400만원 이상, 직급 코드가 J2인 사원의 모든 컬럼 조회
SELECT *
  FROM EMPLOYEE
 WHERE SALARY >= 4000000
   AND JOB_CODE = 'J2';

-- EMPLOYEE 테이블에서 급여가 350만원 이상 600만원 이하를 받는 직원의 사번, 직원명, 부서 코드, 급여 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE SALARY >= 3500000
   AND SALARY <= 6000000;

 

 

<BETWEEN AND>

  • WHERE 절에서 사용되는 구문으로 범위에 대한 조건을 제시할 때 사용한다.
  • 비교대상컬럼 값이 하한값 이상이고, 상한값 이하인 경우 TRUE를 리턴한다.
[표현법]
WHERE 비교대상컬럼 BETWEEN 하한값 AND 상한값
-- EMPLOYEE 테이블에서 급여가 350만원 이상 600만원 이하를 받는 직원의 사번, 직원명, 부서 코드, 급여 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE SALARY BETWEEN 3500000
                 AND 6000000;

-- EMPLOYEE 테이블에서 급여가 350만원 이상 600만원 이하를 받는 직원의 사번, 직원명, 부서 코드, 급여 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
--WHERE SALARY NOT BETWEEN 3500000 AND 6000000; --NOT은 컬럼명 앞 또는 BETWEEN 앞에 기입 가능
 WHERE NOT SALARY BETWEEN 3500000 AND 6000000;

-- EMPLOYEE 테이블에서 입사일 '90/01/01' ~ '01/01/01'인 사원의 모든 컬럼 조회
SELECT *
  FROM EMPLOYEE
 WHERE HIRE_DATE BETWEEN '90/01/01' AND '01/01/01'
 ORDER BY HIRE_DATE; --HIRE_DATE 기준으로 오름차순으로 정렬하는 구문

-- EMPLOYEE 테이블에서 입사일 '90/01/01' ~ '01/01/01'이 아닌 사원의 모든 컬럼 조회
SELECT *
  FROM EMPLOYEE
 WHERE HIRE_DATE NOT BETWEEN '90/01/01' AND '01/01/01'
 ORDER BY HIRE_DATE; --HIRE_DATE 기준으로 오름차순으로 정렬하는 구문

 

 

<LIKE>

  • 비교하려는 컬럼 값이 지정된 특정 패턴에 만족할 경우 TRUE를 리턴한다.
  • 특정 패턴에는 '%', '_'를 와일드카드로 사용할 수 있다.


'%' : 0글자 이상


ex) 비교대상컬럼 LIKE '문자%'  => 비교대상컬럼 값 중에 '문자'로 시작하는 모든 행을 조회한다.
     비교대상컬럼 LIKE '%문자'  => 비교대상컬럼 값 중에 '문자'로 끝나는 모든 행을 조회한다.
     비교대상컬럼 LIKE '%문자%' => 비교대상컬럼 값 중에 '문자'가 포함되어 있는 모든 행을 조회한다.
                
'_' : 1글자


ex) 비교대상컬럼 LIKE '_문자'  => 비교대상컬럼 값 중에 '문자'앞에 무조건 한 글자가 오는 모든 행을 조회한다.
     비교대상컬럼 LIKE '__문자' => 비교대상컬럼 값 중에 '문자'앞에 무조건 두 글자가 오는 모든 행을 조회한다.

[표현법]
WHERE 비교대상컬럼 LIKE '특정 패턴';
-- EMPLOYEE 테이블에서 성이 전 씨인 사원의 사원명, 급여, 입사일 조회
SELECT EMP_NAME, SALARY, HIRE_DATE
  FROM EMPLOYEE
 WHERE EMP_NAME LIKE '전%';

-- EMPLOYEE 테이블에서 이름 중에 하가 포함된 사원의 사원명, 주민번호, 부서 코드 조회
SELECT EMP_NAME, EMP_NO, DEPT_CODE
  FROM EMPLOYEE
 WHERE EMP_NAME LIKE '%하%';

-- EMPLOYEE 테이블에서 전화번호 4번째 자리가 9로 시작하는 사원의 사번, 사원명, 전화번호, 이메일 조회
SELECT EMP_ID, EMP_NAME, PHONE, EMAIL
  FROM EMPLOYEE
 WHERE PHONE LIKE '___9%';

-- EMPLOYEE 테이블에서 이메일 중 _ 앞 글자가 3자리인 이메일 주소를 가진 사원의 사번 사원명, 이메일 조회
-- ex) sun_di@kh.or.kr, yoo_js@kh.or.kr, ...
SELECT EMP_ID, EMP_NAME, EMAIL
  FROM EMPLOYEE
--WHERE EMAIL LIKE '____%'; --와일드카드와 데이터 값이 구분이 되지 않는다.
--WHERE EMAIL LIKE '___\_%' ESCAPE '\';
 WHERE EMAIL LIKE '___$_%' ESCAPE '$'; -- 데이터로 처리할 값 앞에 임의의 문자를 제시하고 임의의 무자를 ESCAPE 옵션에 등록한다.

-- EMPLOYEE 테이블에서 김씨 성이 아닌 직원 사번, 사원명, 입사일 조회
SELECT EMP_ID, EMP_NAME, HIRE_DATE
  FROM EMPLOYEE
 WHERE EMP_NAME NOT LIKE '김%';
--WHERE NOT EMP_NAME LIKE '김%';
--WHERE NOT EMP_NAME NOT LIKE '김%'; 부정의 부정은 긍정

여기서 잠깐!

↓실습문제

더보기
-- 1. EMPLOYEE 테이블에서 전화번호 처음 3자리가 010이 아닌 사원의 이름, 전화번호 조회

-- 2. DEPARTMENT 테이블에서 해외영업부에 대한 모든 컬럼 조회
















/* 정답
--1. EMPLOYEE 테이블에서 전화번호 처음 3자리가 010이 아닌 사원의 이름, 전화번호 조회
SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';

--2. DEPARTMENT 테이블에서 해외영업부에 대한 모든 컬럼 조회
SELECT DEPT_ID, DEPT_TITLE, LOCATION_ID
FROM DEPARTMENT
WHERE DEPT_TITLE LIKE '해외영업%';
*/

 

 

<IS NULL / IS NOT NULL>

  • 컬럼 값에 NULL이 있을 경우 NULL 값 비교에 사용된다.
  • IS NULL : 비교대상컬럼 값이 NULL인 경우 TRUE를 리턴한다.
  • IS NOT NULL : 비교대상컬럼 값이 NULL이 아닌 경우 TRUE 리턴한다.
[표현법]
WHERE 비교대상컬럼 IS [NOT] NULL;
-- EMPLOYEE 테이블에서 보너스를 받지 않는 사원의 사번, 사원명, 급여 조회
SELECT EMP_ID, EMP_NAME, SALARY
  FROM EMPLOYEE
--WHERE BONUS = NULL; -- NULL은 비교 연사자로 비교할 수 없다.
 WHERE BONUS IS NULL;

-- EMPLOYEE 테이블에서 관리자(사수)가 없는 사원 이름, 부서 코드 조회 
SELECT EMP_NAME, DEPT_CODE
  FROM EMPLOYEE
 WHERE MANAGER_ID IS NULL;

-- EMPLOYEE 테이블에서 부서 배치를 받진 않았지만 보너스를 받는 사원의 사원명, 부서 코드, 보너스 조회
SELECT EMP_NAME, DEPT_CODE, BONUS
  FROM EMPLOYEE
 WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL;

 

 

<IN>

값 목록 중에 일치하는 값이 있을 때 TRUE 리턴한다.

[표현법]
WHERE 비교대상컬럼 IN('값', '값', '값', ..., '값');
-- EMPLOYEE 테이블에서 D5 부서원들과 D6 부서원들, D8 부서원들의 사원명, 부서 코드, 급여 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
--WHERE DEPT_CODE = 'D5' OR DEPT_CODE = 'D6' OR DEPT_CODE = 'D8';
 WHERE DEPT_CODE IN('D5', 'D6', 'D8');

 

 

<연산자 우선순위>

  1. ( )
  2. 산술 연산자
  3. 연결 연산자
  4. 비교 연산자
  5. IS NULL, LIKE, IN
  6. BETWEEN AND
  7. 논리 연산자 - NOT
  8. 논리 연산자 - AND
  9. 논리 연산자 - OR
-- EMPLOYEE 테이블에서 직급 코드가 J2 또는 J7 직급인 사원들 중 급여가 200만원 이상인 사원들의 모든 컬럼 조회
SELECT *
  FROM EMPLOYEE
--WHERE (JOB_CODE = 'J7' OR JOB_CODE = 'J2') AND SALARY >= 2000000; -- OR 보다 AND가 먼저 실행된다.
 WHERE JOB_CODE IN('J7', 'J2') AND SALARY >= 2000000;

 

 

<ORDER BY>

SELECT 문에서 가장 마지막에 기입하는 구문으로 실행 또한 가장 마지막에 진행된다.

ASC : 오름차순으로 정렬한다. (ASC 또는 DESC 생략 시 기본값)

DESC : 내림차순으로 정렬한다.

NULLS FIRST : 정렬하고자 하는 컬럼 값에 NULL이 있는 경우 해당 데이터 값을 맨 앞으로 정렬한다.

NULLS LAST : 정렬하고자 하는 컬럼 값에 NULL이 있는 경우 해당 데이터 값을 맨 뒤로 정렬한다.

[표현법]
SELECT 컬럼, 컬럼, ..., 컬럼
FROM 테이블명
WHERE 조건식
ORDER BY 정렬시키고자 하는 컬럼명|별칭|컬럼 순번 [ASC|DESC] [NULLS FIRST | NULLS LAST];
-- EMPLOYEE 테이블에서 BONUS를 오름차순 정렬
SELECT EMP_ID, EMP_NAME, BONUS
  FROM EMPLOYEE
--ORDER BY BONUS;
--ORDER BY BONUS ASC; -- 오름차순 정렬은 기본적으로 NULLS LAST형태로 정렬이 된다.
 ORDER BY BONUS ASC NULLS FIRST;

-- EMPLOYEE 테이블에서 BONUS로 내림차순 정렬(단, BONUS 값이 일치할 경우 그때는 SALARY 가지고 오름차순정렬)
SELECT EMP_ID, EMP_NAME, SALARY, BONUS
  FROM EMPLOYEE
--ORDER BY BONUS DESC; -- 내림차순의 정렬은 기본적으로 NULLS FIRST
--ORDER BY BONUS DESC NULLS LAST;
 ORDER BY BONUS DESC NULLS LAST, SALARY ASC;

-- EMPLOYEE 테이블에서 연봉별 내림차순으로 정렬된 사원의 사원명, 연봉 조회
SELECT EMP_NAME, SALARY * 12 AS "연봉"
  FROM EMPLOYEE
 WHERE SALARY * 12 >= 40000000
--ORDER BY SALARY * 12 DESC;
--ORDER BY 2 DESC; -- 컬럼 순번 사용
 ORDER BY "연봉" DESC; -- 별칭 사용
-- TIP. 위 별칭을 예로 실행순서를 생각해서 작성하라.