본문 바로가기
Programming/Database

[SQL] WHERE 절과 연산자

by skyrun 2022. 10. 15.
원하는 자료만을 검색하기 위해 SQL 문장에 WHERE절을 이용해 자료를 제한할 수 있다.

1. WHERE절은 FROM절 다음에 위치한다. SELECT > FROM > WHERE

 

2. 연산자 우선순위

  • (  ) 괄호로 묶은 연산이 제일 먼저 연산 처리된다.
  • 연산자들 중에는 비교연산자( =, >, >=, <, <=), SQL연산자(BETWEENV a AND b, IN (list), LIKE, IS NULL)가 먼저 처리되고
  • NOT 부정 연산자가 처리되고
  • 논리 연산자 중에서는 AND, OR가 순서대로 처리된다.

 

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

  • 칼럼들을 특정한 값들과 조건을 비교하는 데 사용됨
  • WHERE columnName = 'SKY' (값은 따음표 묶어야함)
  • 비교 연산자의 양쪽이 모두 CHAR 유형타입인 경우
    • 길이가 서로 다른 CHAR형 타입이면 작은 쪽에 스페이스를 추가해 길이를 같게 한 후 비교한다.
    • 서로 다른 문자가 나올 때까지 비교한다.
    • 달라진 첫 번째 문자의 값에 따라 크기를 결정한다.
    • 문자 끝 블랭크 수만 다르면 서로 같은 값으로 결정한다.
  • 비교 연산자의 어느 한 쪽이 VARCHAR유형 타입인 경우
    • 서로 다른 문자가 나올 때까지 비교한다.
    • 길이가 다르면 짧은 것이 끝날 때까지만 비교한 후 길이가 긴 것이 크다고 판단한다.
    • 길이가 같고 다른 것이 없다면 같다고 판단한다.
    • VARCHAR는 NOT NULL까지 길이를 말한다. 즉 문자 끝 블랭크도 문자로 취급한다.
  • 상수값과 비교할 경우
    • 상수 쪽을 변수 타입과 동일하게 바꾸고 비교한다.
    • 변수 쪽이 CHAR 유형 타입이면 위의 CHAR 유형 타입의 경우를 적용한다.
    • 변수 쪽이 VARCHAR 유형 타입이면 위의 VARCHAR 유형 타입의 경우를 적용한다.

 

4. SQL 연산자

  • BETWEEN a AND b : a<= x <=b (양쪽 다 포함!)
WHERE HEIGHT BETWEEN 170 AND 180
  • IN (list) : 리스트에 있는 값 중에서 어느 하나라도 일치한다.
WHERE TEAM_ID IN ('K02', 'K07');

/*아래 두개는 다른거다. 위에 거는 딱 저 2 조합만, 아래는 4가지 조합*/
SELECT NAME, JOB, DEPTNO
FROM EMP
WHERE (JOB, DEPTNO) IN (('MANAGER', 20), ('CLERK', 30));

SELECT NAME, JON, DEPTNO
FROM EMP
WHERE JOB IN ('MANAGER', 'CLERK') AND DEPTNO IN (20, 30);
  • LIKE '비교문자열' : 비교문자여로가 형태가 일치한다.(%, _ 사용)
    • % : 0개 이상의 어떤 문자를 의미
    • _ : 1개인 단일 문자를 의미
--김xx or 김x or 김xxx 등이 출력
WHERE PLAYER_NAME LIKE '김%';

--김x재 출력
WHERE PLAYER_NAME LIKE '김_재'
  • IS NULL : NULL 값인 경우를 의미한다.
    • 값이 존재하지 않음. 공백이나 0 과 다른거다.
    • NULL 값과의 수치연산의 NULL 값을 리턴한다.
    • NULL 값과의 비교연산은 FALSE를 리턴한다.
    • 어떤 값과 비교할 수도 없으며, 특정 값보다 크다/작다고 표현할 수 없다.
    • NULL값의 비교 연산은 IS NULL, IS NOT NULL이라는 정해진 문구를 사용해야 한다.

5. 논리 연산자

  • NOT : 반대 결과를 리턴
  • AND : 앞 뒤 다 참이어야 참
  • OR : 앞 뒤 중 하나만 참이어도 참

6. 부정 연산자

  • 부정 논리연산자
    • <> : 같지 않다 (!=, ^= 도 같은 의미지만, <>가 표준)
    • NOT 칼럼명 = : ~와 같지 않다.
  • 부정 SQL 연산자
    • NOT BETWEEN a AND b
    • NOT IN (list)
    • IS NOT NULL
--K02팀 중에 MF가 아니고, 키가 175 이상 185 이하가 아닌 선수
WHERE TEAM_ID = 'K02' AND NOT POSITION = 'MF' AND NOT HEIGHT BETWEEN 175 AND 185
--이렇게 써도 된다
WHERE TEAM_ID = 'K02' AND POSITION <> 'MF' AND HEIGHT NOT BETWEEN 175 AND 185

 

7. 조건도 결과도 내부처리 방법도 같다.

WHERE TEAM_ID = 'K01' OR TEAM_ID = 'K07'
==
WHERE TEAM_ID IN ('K01', 'K07')

WHERE HEIGHT >=170 AND HEIGHT <= 180
==
WHERE HEIGHT BETWEEN 170 AND 180

'Programming > Database' 카테고리의 다른 글

[SQL] 함수 (정리 필요)  (0) 2022.10.15
[SQL] SELECT 문  (0) 2022.10.13

댓글