자격증/SQLD

[SQLD] SQL 기본 - WHERE 절

숭코기 2023. 8. 30. 23:38
728x90

01. WHERE 조건절

SELECT [DISTINCT / ALL] 칼럼명 [ALIAS명]
FROM 테이블명
WHERE 조건식;

WHERE 절은 FROM 절 다음에 위치하며, 조건식은 아래 내용으로 구성된다.

  • 칼럼명(보통 조건식의 좌측에 위치)
  • 비교 연산자
  • 문자, 숫자, 표현식 (보통 조건식의 우측에 위치)
  • 비교 칼럼명 (JOIN 사용시)

 

02. 연산자의 종류

 WHERE 절에 사용되는 연산자

  • 비교 연산자 (부정 비교 연산자 포함)
  • SQL 연산자 (부정 SQL 연산자 포함)
  • 논리 연산자
구분 연산자 연산자의 의미
비교 연산자 = 같다
> 보다 크다
>= 보다 크거나 작다
< 보다 작다
<= 보다 작거나 같다
SQL 연산자 BETWEEN A AND B A와 B값 사이에 있으면 된다 (A와 B값 포함)
IN (list) 리스트에 있는 값 중에서 어느 하나라도 일치하면 된다
LIKE '비교문자열' 비교문자열과 형태가 일치하면 된다
IS NULL NULL 값인 경우
논리 연산자 AND 앞에 있는 조건과 뒤에 오는 조건이 참(TRUE)이 되면서 결과도 참(TRUE)이 된다
OR 앞의 조건이 참(TRUE)이거나 뒤의 조건이 참(TRUE)이 되어야 결과도 참(TRUE)이 된다
NOT 뒤에 오는 조건에 반대되는 결과를 되돌려 준다
부정 비교 연산자 != 같지 않다
^=
<>
NOT 칼럼명 = ~와 같지 않다
NOT 칼럼명 > ~보다 크지 않다
부정 SQL 연산자 NOT BETWEEN A AND B A와 B 값 사이에 있지 않다 (A와 B값을 포함하지 않음)
NOT IN (list) list 값과 일치하지 않는다
IS NOT NULL NULL 값을 갖지 않는다
💡 연산 우선순위

① 괄호()
② NOT 연산자
③ 비교 연산자, SQL 비교 연산자
④ AND
⑤ OR

 

 

비교 연산자

*문자 유형간의 비교 조건이 발생하는 경우

 

비교 연산자의 양쪽이 모두 CHAR 유형 타입인 경우

  • 길이가 서로 다른 CHAR형 타입이면 작은 쪽에 SPACE를 추가하여 길이를 같게 한 후에 비교한다
  • 서로 다른 문자가 나올 때까지 비교한다
  • 달라진 첫 번째 문자의 값에 따라 크기를 결정한다
  • BLANK의 수만 다르다면 서로 같은 값으로 결정한다

 

비교 연산자의 어느 한쪽이 VARCHAR 유형 타입인 경우

  • 서로 다른 문자가 나올 때까지 비교한다
  • 길이가 다르다면 짧은 것이 끝날 때까지 비교한 후에 길이가 긴 것이 크다고 판단한다
  • 길이가 같고 다른 것이 없다면 같다고 판단한다
  • VARCHAR는 NOT NULL까지 길이를 말한다

 

상수값과 비교할 경우

  • 상수 쪽을 변수 타입과 동일하게 바꾸고 비교한다
문자 유형 칼럼의 경우 WHERE 문자유형칼럼 = K02 처럼 '' 표시가 없는 경우 에러가 발생하지만, 숫자 유형의 칼럼의 경우 WHERE 숫자유형칼럼 = '170' 처럼 숫자로 변환이 가능한 문자열과 비교 되면 상대 타입을 숫자 타입으로 바꾸어 비교한다.
('170'이 내부적으로 숫자 유형 170으로 바뀌어 처리됨)

 

SQL 연산자

  • BETWEEN a AND b
  • IN (list)
  • LIKE '비교문자열'
    • 와일드카드 '%': 0개 이상의 어떤 문자를 의미
    • 와일드카드 '_': 1개의 단일 문자를 의미
  • IS NULL
연산 관련 NULL 특성
- NULL 값과의 수치연산은 NULL 값을 리턴
- NULL 값과의 비교연산은 거짓(FALSE)을 리턴
- 어떤 값과 비교할 수 없으며, 특정 값보다 크다, 적다라고 표현할 수 없음

 

논리연산자

  • AND
  • OR
  • NOT

 

부정 연산자

구분 연산자
부정 논리 연산자 !=
^=
<>
NOT 칼럼명 = 
NOT 칼럼명 >
부정 SQL 연산자 NOT BETWEEN a AND b
NOT IN (list)
IS NOT NULL

 

 

03. ROWNUM, TOP 사용

ROWNUM

Oracle의 ROWNUM은 칼럼과 비슷한 성격의 Pseudeo Column으로써 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호이다. 테이블이나 집합에서 원하는 만큼 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한한는 목적으로 사용한다.

 

한 건의 행만 가져오고 싶을때

SELCT USER_NAME FROM USER WHERE ROWNUM = 1;

OR

SELECT USER_NAME FROM USER WHERE ROWNUM <=1;

 

두 건 이상의 N행을 가져오고 싶을 때

SELECT USER_NAME FROM USER WHERE ROWNUM <= N;

// ROWNUM = N 은 사용 X

 

추가적인 ROWNUM의 용도로는 테이블 내의 고유한 키나 인덱스 값을 만들 수 있음

UPDATE MY_TABLE SET COLUMN1 = ROWNUM;

 

TOP 절

SQL Server는 TOP절을 사용하여 결과 집합으로 출력되는 행의 수를 제한할 수 있다. 

TOP (Expression) [PERCENT] [WITH TIES]

Expression: 반환할 행의 수를 지정하는 숫자

PERCENT: 쿼리 결과 집합에서 처음 Expression%의 행만 반환됨을 나타냄

WITH TIES: ORDER BY 절이 지정된 경우에만 사용할 수 있으며,  TOP N(PERCENT)의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정할 수 있다

 

한 건의 행만 가져오고 싶을때

SELECT TOP(1) USER_NAME FROM USER;

 

두 건 이상의 N행을 가져오고 싶을 때

SELECT TOP(N) USER_NAME FROM USER;

 

⚠️ SQL 문장에서 ORDER BY 절이 사용되지 않으면 Oracle의 ROWNUM과 SQL Server의 TOP절은 같은 기능을 하지만, ORDER BY절이 같이 사용되면 기능의 차이가 발생한다

728x90