고래씌

[Oracle] 1-2. DML(SELECT) - 기본문법(논리 연산자, BETWEEN AND, LIKE, IS NULL, IN, 연결 연산자) 본문

Database/Oracle

[Oracle] 1-2. DML(SELECT) - 기본문법(논리 연산자, BETWEEN AND, LIKE, IS NULL, IN, 연결 연산자)

고래씌 2023. 11. 23. 11:39

1. 논리연산자

: 여러개의 조건을 엮을 때 사용


- AND(자바 : &&), OR(자바 : ||)
- AND : ~ 이면서, 그리고
- OR : ~ 이거나, 또는

 

 

▶ 급여가 350만원 이상이고 600만원 이하인 사원들의 이름, 사번, 급여, 직급코드 조회

SELECT EMP_NAME, EMP_ID, JOB_CODE
FROM EMPLOYEE
WHERE SALARY >= 3500000 AND SALARY <= 6000000;

 

 

 

2. BETWEEN AND

: 몇 이상 몇 이하인 범위에 대한 조건을 제시할 때 사용


    [표현법]
    비교대상컬럼명 BETWEEN 하한값 AND 상한값

 

▶ 급여가 350만원 미만이고 600만원 초과인 사원들의 이름, 사번, 급여, 직급코드 조회

SELECT EMP_NAME, EMP_ID, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 3500000 AND 6000000;
--WHERE NOT SALARY BETWEEN 3500000 AND 6000000;

 

☞ 오라클의 NOT은 자바의 논리부정연산자와 동일한 의미. 위치는 상관없다.

 

 

 

  ** BETWEEN AND 연산자DATE 형식간의 범위에도 사용 가능
입사일이 '90/01/01' ~ '03/01/01'인 사원들의 모든 칼럼조회

SELECT *
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '90/01/01' AND '03/01/01';

 

 

 

3. LIKE '특정 패턴'

: 비교하고자 하는 컬럼값이 내가 지정한 특정 패턴에 만족될 경우 조회

 

    [표현법]
    비교대상칼럼명 LIKE '특정패턴'

 

 

▶ 옵션 : 특정 패턴 부분에 와일드카드인 '%', '_'를 가지고 제시할 수 있음

    - '%' : 0글자 이상
      ☞ 비교대상칼럼 LIKE '문자%' => 컬럼값 중에 '문자'로 시작하는 행을 조회
      ☞ 비교대상칼럼 LIKE '%문자' => 컬럼값 중에 '문자'로 나는 행을 조회
      ☞ 비교대상칼럼 LIKE '%문자%' => 컬럼값 중에 '문자'가 포함되는 것을 조회

 

   - '_' : 1글자

     ☞ 비교대상칼럼 LIKE '_문자' => 컬럼값 중에 '문자'앞에 무조건 1글자가 존재하는 경우 조회
      비교대상칼럼 LIKE '__문자' => 컬럼값 중에 '문자'앞에 무조건 2글자가 존재하는 경우 조회

 

 

▶ 이름중에 '하'가 포함된 사원들의 이름, 주민번호, 부서코드 조회

SELECT EMP_NAME, EMP_NO, DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%하%';

 

▶ 전화번호 4번째자리가 9로 시작하는 사원들의 사번, 사원명, 전화번호, 이메일 조회

SELECT EMP_ID, EMP_NAME, PHONE, EMAIL
FROM EMPLOYEE
WHERE PHONE LIKE '___9%';

 

이름 가운데 글자가 '지'인 사원들의 모든 칼럼(외자는 없다고 가정)

SELECT *
FROM EMPLOYEE
WHERE EMP_NAME LIKE '_지_';

 

 

1) ESCAPE 문자

 

▶ EMPLOYEE 테이블에서 이메일이 _앞의 글자가 3글자인 사원을 조회
▶ jun_jy@kh.or.kr

 

SELECT EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___#_%' ESCAPE '#';

 

☞ ESCAPE '#';  은 뒤에 무조건 문자열로 받겠다.
☞  '_'를 기준으로 앞에 딱 3글자를 가져옴

 

 

※ 실습문제

▶ 이름이 '연'으로 끝나는 사원들의 이름, 입사일 조회

SELECT EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%연';

 

전화번호 처음 3글자가 010이 아닌 사원들의 이름, 전화번호 조회

SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%' ;

 

 

 

4. IS NULL

: 해당 값이 NULL인지 비교해줌

 

    [표현법]
    칼럼 IS NULL : 컬럼값이 NULL인지 확인
    칼럼 IS NOT NULL : 컬럼값이 NULL이 아닌지 확인

 

 

▶ 사수가 없고, 부서배치도 아직 받지 않은 사원들의 모든 칼럼 조회

SELECT *
FROM EMPLOYEE
WHERE MANAGER_ID IS NULL AND DEPT_CODE IS NULL;

 

 

 

5. IN

: 비교대상 컬럼값에 내가 제시한 목록들 중에 일치하는 값이 있는지 판단

 

    [표현법]
    비교대상칼럼 IN (값1, 값2, 값3, ...)

 

▶ 부서코드가 D6이거나 또는 D8이거나 또는 D5인 사원들의 모든 칼럼 조회

SELECT *
FROM EMPLOYEE
--WHERE DEPT_CODE = 'D6' OR DEPT_CODE = 'D8' OR DEPT_CODE='D5';
WHERE DEPT_CODE IN ('D6', 'D8', 'D5');

 

 

 

 

6. 연결 연산자 ||

: 여러 컬럼값들을 마치 하나의 컬럼인 것 처럼 연결시켜주는 연산자

컬럼과 리터럴을 연결할 수도 있다.

 

 

▶ XX(사번)번 XXX의 월급은 XXXX원 입니다. AS 급여정보

SELECT EMP_ID || '번 ' || EMP_NAME || '의 월급은 ' || SALARY || '원 입니다.' "급여정보"
FROM EMPLOYEE;