SQL WHERE절과 연산자
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%' 똑같이 출력이 가능합니다.