back-end&DB/SQL(Oracle)

SQL WHERE절과 연산자

Hoon0211 2023. 5. 3. 12:53
728x90

1. WHERE

 

SELECT 컬럼

FROM 테이블

WHERE 조건

 

SELECT
    *
FROM
    employees
WHERE
    job_id = 'IT_PROG';

* Oracle의 경우 Ctrl + F7의 경우 정렬이 된다.

 

 - 실행 순서 FROM > WHERE > SELECT 

 - employees 테이블에서 IT_PROG의 조건에 해당하는 모든 컬럼에서 찾는다.

 

1.1. 실습

 

 - 직원 ID가 105인 사람의 성과 이름을 출력

SELECT
    first_name,
    last_name
FROM
    employees
WHERE
    employee_id = '105';

 

2. 연산자

 

2.1. 산술연산자( +, -, *, / )

SELECT
    salary,
    salary + 2
FROM
    employees;

SELECT
    salary,
    salary - 2
FROM
    employees;

SELECT
    salary,
    salary * 2
FROM
    employees;

SELECT
    salary,
    salary / 2
FROM
    employees;

2.2. 비교연산자(=, >, <, <=, >=) 

 

 - 부서 ID가 50인 직원 ID와 부서ID 출력

SELECT
    employee_id,
    department_id
FROM
    employees
WHERE
    department_id = 50;

 

2.2.1. 실습

 

 - 직원 테이블에서 급여 5000 이하 인 사람들의 이름과 급여 출력

SELECT
    last_name,
    salary
FROM
    employees
WHERE
    salary <= 5000;

 - 직원 테이블에서 연봉 50000 이상 사람들의 이름과 연봉을 출력 단 연봉은 annSal 출력

SELECT
    last_name,
    salary * 12 AS annsal
FROM
    employees
WHERE
    salary * 12 >= 50000;

 

2.3 등가 비교 연산자

 

 - 같다  =

 - 같지않다 !=, <>, ^=

 - 부정한다 NOT(부정의 역할, 의미가 반대로 변하게 만들어주는 성질)

SELECT
    *
FROM
    employees
WHERE
    department_id != 50;

SELECT
    *
FROM
    employees
WHERE
    department_id <> 50;

SELECT
    *
FROM
    employees
WHERE
    department_id ^= 50;

SELECT
    *
FROM
    employees
WHERE
    not department_id = 50;

 - NOT의 경우 맨 앞에 사용(부정의 의미).

 - 부서 ID가 50인 것이 '아닌 것'

 

2.3.1. 실습

 

 - 급여가 10000 미만이 아닌 직원의 이름과 급여를 출력

SELECT
    FIRST_name,
    employee_id
FROM
    employees
WHERE
    not salary < 10000;

2.4. 논리연산자

 

 - AND 그리고 모든 조건이 True일 때만 True
 - OR 혹은 하나의 조건이 True 이면 True

 

2.4.1 실습

 

 - JOB_ID가 IT_PROG와 FI_ACCOUNT가 아닌 직원의 이름과 JOB_ID를 출력

SELECT
    FIRST_name,
    job_id
FROM
    employees
WHERE
    job_id != 'IT_PROG'
    AND job_id != 'FI_ACCOUNT';

 

 - 부서 ID가 100이거나 입사일이 16년 2월 2일 이후 입사한 직원의 이름과 입사일 출력

SELECT
    FIRST_name,
    hire_date
FROM
    employees
WHERE
    department_id = 100
    or hire_date > '16/02/02';

 - 부서ID가 100이거나 50인 직원 중에서 연봉 10000 이상 직원의 ID와 이름 그리고 연봉출력(Annsal)

SELECT
    FIRST_name,
    hire_date,
    salary * 12 as Annsal
FROM
    employees
WHERE
 (department_id = 100
 or department_id = 50)
 and salary * 12 >= 10000;

 

 - 부서 아이디가 100이거나 90인 직원 중에서 직원 ID가 101 사람 직원 ID 이름 연봉 출력하기(Annsal)

SELECT
    FIRST_name,
    salary * 12 as Annsal,
    employee_ID,
    department_id
FROM
    employees
WHERE
    (department_id = 100
    or department_id = 90)
    and employee_ID = 101;

 - 먼저 계산을 원하는 부분을 () 처리를 해야 된다.

 - 사칙 순서 and가 순위가 더 높다.

 

3. is null, is not null

 

 - NULL을 처리할 수 있는 유일한 연산자
 - is null : null 있는지 확인
 - is not null : null이 아닌지 확인

 

SELECT
    *
FROM
    employees
WHERE
    first_name IS NULL;

SELECT
    *
FROM
    employees
WHERE
    first_name IS NOT NULL;

 

3.1. 실습

 

 - 핸드폰 번호가 NULL인 직원의 이름과 핸드폰 번호를 출력

SELECT
    first_name, phone_number
FROM
    employees
WHERE
    phone_number IS NULL;

 - 커미션 비율이 NULL이 아닌 직원의 이름과 커미션 비율 출력

SELECT
    first_name, commission_pct
FROM
    employees
WHERE
    commission_pct IS NOT NULL;

 

4. IN연산자과 NOT IN연산자

 

4.1 IN연산자

 

 - IN연산자 > =연산자 + OR연산자

SELECT
    *
FROM
    employees
WHERE
    department_id = 30
    OR department_id = 60
    OR department_id = 90;

 - IN연산자를 사용을 한다면

SELECT
    *
FROM
    employees
WHERE
    department_id IN(30, 60, 90);

 - 줄이는 것이 가능하다.

 - 그러나 NULL이 포함되어 있으면 무시를 한다.

SELECT
    *
FROM
    employees
WHERE
    department_id IN(30, 60, 90, NULL);

 - 이렇게 적어도 NULL은 출력이 되지 않는다.(실제 NULL 데이터 보유)

SELECT
    *
FROM
    employees
WHERE
    department_id = 30
    OR department_id = 60
    OR department_id = 90
    OR department_id = null;

 

 - 풀어서 적으면 NULL은 출력이 되지 않는다.

 - NULL를 정상적으로 출력하려면

SELECT
    *
FROM
    employees
WHERE
    department_id = 30
    OR department_id = 60
    OR department_id = 90
    OR department_id is null;

 - = 과 is는 다르다. is null만 null 출력이 가능하다.

 

4.2 NOT IN 연산자

 

 - not in : in 조건에 해당하지 않는 데이터 출력
 - not : 부정의 역할, 의미가 반대로 변하게 만들어주는 성질
 - not in 연산자 : <> 연산자와 AND 연산자

SELECT
    *
FROM
    employees
WHERE
    department_id <> 30
    OR department_id <> 50
    OR department_id <> 90;
SELECT
    department_id
FROM
    employees
WHERE
    department_id not IN(30, 50, 90);

  -  not in에 NULL이 포함되어 있으면 어떠한 값도 출력이 되지 않는다.

 

 

 

5. BEETWEEN

 

 - 범위에 조건을 걸 때 이용

SELECT
    FIRST_name, salary    
FROM
    employees
WHERE salary >= 10000
and salary < 20000;

 - BEETWEEN 이용 시

SELECT
    FIRST_name, salary  
FROM
    employees
WHERE
    salary BETWEEN 10000 and 19999;

 - BETWEEN(10000 이상 ~ 19999 이하)

 

5.1 실습

 

 -  2005년에 입사한 직원의 이름과 입사일을 출력

SELECT
    FIRST_name, hire_date
FROM
    employees
WHERE
    hire_date BETWEEN '05/01/01' and '05/12/31';

 

6. LIKE

 

  - LIKE 특정 조건을 검색할 때 이용
 - 와일드카드 % : 문자대체
 - 칼럼 LIKE '문자%' 해당 문자로 시작하는 데이터 검색
 - 칼럼 LIKE '%문자' 해당 문자로 끝나는 데이터 검색
 - 칼럼 LIKE '%문자%' 해당 문자를 포함하는 데이터 검색
 - 컬럼 LIKE '1__' 1로 시작하는 3글자로 이루어진 데이터 검색
 - 컬럼 LIKE '__1' 1로 끝나는 3글자로 이루어진 데이터 검색

 

SELECT
    FIRST_NAME
FROM
    employees
WHERE
    first_name LIKE 'S%';
    
    SELECT
    FIRST_NAME
FROM
    employees
WHERE
    first_name LIKE '%s';
    
        SELECT
    FIRST_NAME
FROM
    employees
WHERE
    first_name LIKE '%s%';

- S로 시작하는 직원 이름

- s로 끝나는 직원 이름

- s가 포함된 직원 이름

SELECT
    employee_ID
FROM
    employees
WHERE
    employee_id LIKE '1__';
    
    SELECT
    employee_ID
FROM
    employees
WHERE
    employee_id LIKE '__1';

    SELECT
    employee_ID
FROM
    employees
WHERE
    employee_id LIKE '_1_';

 - 직원 ID에 1로 시작하는 세 글자 찾기

 - 직원 ID에 1로 끝나는 세글자 찾기

 - 직원 ID에  중간에 1이 포함되는 세글자 찾기

 

6.1 실습

 - 650으로 시작하는 핸드폰 번호 찾기

SELECT
    phone_number
FROM
    employees
WHERE
     phone_number LIKE '650%';

 

 - 이름이 S로 시작하고 N으로 끝나는 직원 찾기

SELECT
    first_name
FROM
    employees
WHERE
     first_name LIKE 'S%'
     AND first_name LIKE '%n';

 - 이름에 두 번째 글자가 e인 직원 찾기

SELECT
    first_name
FROM
    employees
WHERE
     first_name LIKE '_e%';

 - 01월에 입사한 직원 찾기

SELECT
    first_name
FROM
    employees
WHERE
     hire_date LIKE '___01___';

 - '___01%' 똑같이 출력이 가능합니다.

728x90
댓글수0