BackEnd/MySQL

[DB]WHERE절

Hojung7 2024. 8. 24. 12:43
▶ WHERE 절

 

- 테이블에서 조건을 충족하는 행을 조회할 때 사용

- WHERE절에는 조건식(true/false)만 작성

 

- 비교 연산자 : >, <, >=, <=, = (같다), !=, <> (같지 않다)

- 논리 연산자 : AND, OR, NOT

 

  3) SELECT 컬럼명,...
  1) FROM 테이블명
  2) WHERE 조건식;

 

 1>> 특정 테이블에서

 2>> 조건식을 만족하는 행을 추려놓고

 3>> 추려진 결과 행에서 원하는 컬럼만 조회

 

 

#예제

 

EMPLOYEE 테이블에서 급여가 400만원을 초과하는 사원의 사번, 이름, 급여 조회

SELECT EMP_ID, EMP_NAME, SALARY 
FROM EMPLOYEE 
WHERE SALARY>4000000; -- 8행 조회

EMPLYEE 테이블에서 연봉이 5천만원 이하인 사원의 이름, 연봉 조회

SELECT EMP_NAME,SALARY*12
FROM EMPLOYEE  
WHERE SALARY *12 <= 50000000;  -- 15행`

 

이름이 '노옹철'인 사원의 사번, 이름, 전화번호 조회

SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE EMP_NAME ='노옹철'; -- 같다(=, 등호 1개!!!)

 

 부서코드(DEPT_CODE)가 'D9'이 아닌 사원의 이름, 부서 코드 조회

SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE 
WHERE DEPT_CODE <> 'D9'; -- <> 또는 != -> 같지 않음을 의미

 


 

▷ NULL 비교 연산

컬럼명 = NULL (X)  / 컬럼명 != NULL (X)

 

 - =, != 비교 연산은  컬럼에 저장된 값을 비교하는 연산이다!!!

 

- ORACLE DB에서 NULL은 값이 아니라 값이 존재하지 않는다는(빈칸) 의미

 == 저장된 값이 없다

 

 컬럼명 IS NULL / 컬럼명 IS NOT NULL (O)

 

-> 지정된 컬럼에 값이 존재하지 않는 경우 / 하는 경우

(값의 유무를 따짐)

 

 

#예제   

 

EMPLOYEE 테이블에서 DEPT_CODE가 없는 사원 조회

SELECT EMP_NAME, DEPT_CODE 
FROM EMPLOYEE 

--WHERE DEPT_CODE != NULL; -- 결과 없음(잘못된 연산)
WHERE DEPT_CODE IS NULL; -- 하동운, 이오리 2행 조회

 


 

논리 연산자(AND/OR)

AND(그리고)    두 조건식의 결과가 TRUE인 경우만 TRUE
→ 두 조건을 모두 만족하는 행만 조회 결과에 포함
OR(또는)   두 조건 중 하나라도 TRUE인 경우에 TRUE
 두 조건 중 하나라도 만족하는 행만 조회 결과에 포함

 

#예제

 

EMPLOYEE 테이블에서 부서코드가 'D6'인 사원 중 급여가 400만을 초과하는 사원의

이름, 부거 코드, 급여 조회

SELECT EMP_NAME, DEPT_CODE , SALARY 
FROM  EMPLOYEE 
WHERE DEPT_CODE ='D6' AND SALARY >4000000;

 


 

컬럼명 BETWEEN (A) AND (B)

-- 컬럼 값이 "A 이상", "B이하"인 경우 TRUE(조회 하겠다)

 

#예제

 

EMPLOYEE 테이블에서 급여가 400만 이상 600만 이하인 사원의

 

이름, 급여 조회

 

1) AND 버전

SELECT EMP_NAME, SALARY 
FROM EMPLOYEE 
WHERE SALARY >=4000000 AND SALARY <= 6000000;

 

2) BETWEEN 버전

SELECT EMP_NAME, SALARY 
FROM EMPLOYEE e 
WHERE SALARY BETWEEN 4000000 AND 6000000;

 

▷ 컬럼명 NOT BETWEEN (A) AND (B)

 

컬럼 값이 "A 이상", "B이하"가 아닌 경우 TRUE(조회 하겠다)

(= A 미만, B 초과)

 

 

**날짜도 범위 비교 가능 !!**

EMPLOYEE 테이블에서 2010년대(10.1.1 ~ 19.12.31) 입사한 사원의 사번, 이름, 입사일 조회

 

1) AND 버전

SELECT DEPT_CODE, EMP_NAME , HIRE_DATE 
FROM EMPLOYEE 
WHERE HIRE_DATE >= TO_DATE('2010-01-01', 'YYYY-MM-DD') 
	AND HIRE_DATE <= TO_DATE('2019-12-31', 'YYYY-MM-DD') ;
-- 10행 조회

 

2) BETWEEN 버전

SELECT DEPT_CODE, EMP_NAME , HIRE_DATE 
FROM EMPLOYEE 
WHERE HIRE_DATE 
      BETWEEN 
      TO_DATE('2010-01-01', 'YYYY-MM-DD') 
      AND 
      TO_DATE('2019-12-31', 'YYYY-MM-DD') ;

 


 

▷ 일치하는 값만 조회 (OR / IN(값1, 값2,...))

 

1) OR

 

#예제  EMPLOYEE 테이블에서 부서코드가 'D5', 'D6', 'D9'인 사원의 사번,이름, 부서코드 조회

SELECT EMP_NAME , EMP_NAME, DEPT_CODE
FROM EMPLOYEE 
WHERE DEPT_CODE = 'D5' 
   OR DEPT_CODE = 'D6'
   OR DEPT_CODE = 'D9'; --12행 조회

 

2) 컬럼명 IN (값1, 값2, 값3, ...)

 

컬럼 값이 IN () 내에 존재하면 TRUE --> 조회 결과에 포함

-== 연속으로 OR 연산을 작성한 것과 같은 효과

SELECT EMP_NAME , EMP_NAME, DEPT_CODE
FROM EMPLOYEE 
WHERE DEPT_CODE IN('D5', 'D6', 'D9'); -- 12행

 

3) 컬럼명 NOT IN (값1, 값2, 값3, ...)

 

컬럼 값이 IN () 내에 존재하지 않으면 TRUE --> 조회 결과에 포함

SELECT EMP_NAME , EMP_NAME, DEPT_CODE
FROM EMPLOYEE 
WHERE DEPT_CODE NOT IN('D5', 'D6', 'D9'); -- 9행 (NULL)

 


 

▷ Like(같은, 비슷한)

 

비교하려는 값이 특정한 패턴을 만족 시키면 조회하는 연산자

 

[작성법]

* WHERE 컬럼명 LIKE '패턴'

 

<LIKE에 사용되는 패턴(와일드 카드)>

'%A'
문자열 앞부분은 어떤 문자든 포함할 수 있지만
마지막은 A로 끝나는 문자열
'A%' A로 시작하는 문자열
'%A%' A가 포함된 문자열
'A___' A로 시작하고 그 뒤에 3글자만 있는 문자열
ex)  ABCD (O), ABCDE(x)
'___A' 앞에 3글자만 있고 A로 끝나는 문자열

 

#예제

EMPLOYEE 테이블에서 성이 '전'씨인 사원의 사번, 이름 조회

SELECT DEPT_CODE, EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';

 

EMPLOYEE 테이블에서 EMAIL의 아이디 중 '_' 앞 쪽 글자 수가 3글자인 사원의

 

사번, 이름, 이메일 조회

 

↓ ↓문제 발생  ↓ ↓

SELECT DEPT_CODE, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '____%'; -- 문제발생

'_' 와일드 카드 사용시 문제점!!!!!!!

- 작성되는 문자열의 '_' 기호가

LIKE '_'와일드카드와

똑같이 인식되서 구분이 안되는 문제가 발생!!!!

 

[해결방법]

- LIKE의 ESCAPE OPTION 사용

 

ESCAPE OPTION : 와일드 카드가 아닌 단순 문자열로 인식

→   지정된 특수문자 뒤 "한 글자"에만 적용된다!!

 

EX) WHERE 컬럼명 LIKE '__#_' ESCAPE '#';

→  # 뒤에 '_'는 일반 문자열로 인식된다!!!!!!

 

'BackEnd > MySQL' 카테고리의 다른 글

[DB]Oracle Database의 개요  (0) 2024.08.24
[DB] 함수  (1) 2024.08.24
[DB] ORDER BY절  (0) 2024.08.24
[DB] DDL(Data Definition Language) (ALTER, DROP)  (0) 2024.08.23
[DB] TCL(Transaction Control Language)  (0) 2024.08.22