티스토리 뷰

1. WHERE 조건절 개요

▷ WHERE 조건절

    : 사용자들이 원하는 자료만을 검색하기 위하여 SQL 문장에 WHERE 절을 이용하여 자료들에 대하여 제한한다.

      두 개 이상의 테이블에 대한 조인 조거늘 기술하거나, 결과를 제한하기 위한 조건을 기술할 수 있다.

 

 

    <WHERE 조건절 미사용시 문제점>

      많은 사용자들, 프로그램들이 동시에 접속하여 다량의 트랜잭션을 발생한다.

      필요 없는 많은 자료들을 데이터베이스로부터 요청하는 것은,

      데이터베이스가 설치되어 있는 서버의 CPU메모리와 같은 시스템 자원 (Resources) 들을 과다하게 사용한다.

      많은 Query 에 대해 바로 처리를 못하고, 검색된 많은 자료들이 네트워크를 통해 전달됨으로써 문제점을 발생시킨다.

 

      문제점을 방지하기 위해,

      WHERE 절에 조건이 없는 FTS ( Full Table Scan ) 문장은 SQL 튜닝의 1차적인 검토 대상이 된다.

      

 

 

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

 

# 조건식 구성

 

1. 칼럼명 (보통 조건식의 좌측에 위치)

2. 비교연산자

3. 문자, 숫자, 표현식 (보통 조건식의 우측에 위치)

4. 비교 칼럼명 (JOIN 사용시)

 

 

 

 

 

 


2. 연산자의 종류

▷ WHERE 절에 사용되는 연산자 3 가지

    (1) 비교 연산자 (부정 비교 연산자 포함)

    (2) SQL 연산자 (부정 SQL 연산자 포함)

    (3) 논리 연산자

 

 

 


연산자

구분 연산자 연산자의 의미
비교
연산자
= 같다
> 보다 크다
>= 보다 크거나 같다
< 보다 작다
<= 보다 작거나 같다
SQL
연산자
BETWEEN a AND b a 와 b 값 사이에 있으면 된다
( a와 b 값이 포함됨 )
IN (list) 리스트에 있는 값 중에 어느 하나라도 일치하면 된다
LIKE '비교문자열' 비교문자열과 형태가 일치하면 된다
( % , _ 사용 )
IS NULL NULL 값인 경우
논리
연산자
AND 앞의 조건과 뒤의 조건이
참이 되면 결과도 참(TRUE)이 된다
( 즉, 앞뒤의 조건 중 하나만 참이면 된다 )
OR 앞의 조건이 참이거나, 뒤의 조건이 참이 되어야
결과도 참(TRUE)이 된다
NOT 뒤에 오는 조건에 반대되는 결과를 되돌려 준다
부정
비교
연산자
!= 같지 않다
^= 같지 않다
<> 같지 않다
( ISO 표준, 모든 운영체제에서 사용 가능 )
NOT 칼럼명 = ~와 같지 않다
NOT 칼럼명 > ~보다 크지 않다
부정
SQL
연산자
NOT BETWEEN
a AND b
a 와 b 값 사이에 있지 않다
( a, b 값을 포함하지 않는다 )
NOT IN (list) 리스트 값과 일치하지 않는다
IS NOT NULL NULL 값을 갖지 않는다

 

 

 


 연산자의 우선순위

연산 우선순위 설명
1 괄호 ( )
2 NOT 연산자
3 비교 연산자, SQL 비교 연산자
4 AND
5 OR

 

연산자들의 우선순위를 염두해서 WHERE 절을 작성해야 한다.

 

 

 

 

 

 

 


3. 비교 연산자

비교 연산자 ( =, >, >=, <, <= ) 를 WHERE 조건절에 사용한다.

 

비교 연산자의 종류

 

 

 

(예제)

 

* 오류사항 코드

SELECT PLAYER_NAME 선수이름, HEIGHT 키 FROM PLAYER WHERE PLAYER_NAME = KIM;

ERROR: 열명이 부적합하다.

PLAYER_NAME 의 데이터 타입은 CHAR(3) 인데, 비교 연산자 오른쪽에 KIM 의 값을 작은따옴표( ' ' ) 또는 큰따옴표 ( " " ) 와 같은 인용 부호로 묶어서 처리하지 않았기 때문에 발생하는 에러이다.

 

 

 

 

* 올바른 코드

SELECT PLAYER_NAME 선수이름, HEIGHT 키 FROM PLAYER WHERE PLAYER_NAME = 'KIM';

CHAR 변수나 VARCHAR2 와 같은 문자형 타입을 가진 칼럼을 특정 값과 비교하기 위해서는 인용 부호 ( 작은따옴표, 큰 따옴표 ) 로 묶어서 비교 처리를 한다. 

NUMERIC 같은 숫자형 형태의 값은 인용부호를 사용하지 않는다.

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 


4. SQL 연산자

    : SQL 연산자는 SQL 문장에서만 사용하도록 기본적으로 예약되어 있는 연산자로서 모든 데이터 타입에 대해서 연산이 가능하다.

 

 

SQL 연산자의 종류

 


※ IN (list) 연산자

 

 

(예제)

 

IN (list) 형태의 SQL 비교 연산자를 사용하는 것.

 

(1) TEAM_ID 가 'K02' , 'K07' 리스트에 있는 조건문.

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID IN ('K02','K07');

 

(2) 다중 리스트

SELECT PLAYER_NAME FROM PLAYER WHERE (TEAM_ID,DEPTNO) IN (('K02',20),('K07',30));

 

다중 리스트를 이용한 IN 연산자는 SQL 문장을 짧게 만들어 주면서, 성능 측면에서도 장점을 가질 수 있는 매우 유용한 연산자이다.

 

 

 


※ LIKE 연산자

 

 

(예제)

 

LIKE 연산자를 사용하는 것.

 

(1) POSITION 이 'MF' 와 같은 선수를 찾는 조건문.

SELECT PLAYER_NAME FROM PLAYER WHERE POSITION LIKE 'MF';

 

 

LIKE 의 사전적 의미는 '~와 같다' 이다.

그럼 비교 연산자인 '=' 를 사용해도 같은 결과이지만, LIKE 연산자를 사용하는 이유?

 

 

 

 

(2) 이름이 "김"씨 성을 가진 선수들을 조회할 경우

SELECT PLAYER_NAME FROM PLAYER WHERE PLAYER_NAME LIKE '장%';

 

 

와일드카드 (WildCard) 를 사용할 수 있다.

 

 

▷ 와일드카드 ( WILDCARD )

    : 한 개 혹은 0 개 이상의 문자를 대신해서 사용하기 위한 특수 문자.

      조합하여 사용하는 것도 가능하므로 SQL 문장에서 사용하는 String 값으로 용이하게 사용할 수 있다.

 

와일드 카드의 종류

 

 

 


※ BETWEEN a AND b 연산자

 

 

(예제)

 

BETWEEN ~ AND ~ 연산자를 사용하는 것.

 

(1) 키가 170~180 인 선수들을 찾는 조건문.

SELECT PLAYER_NAME FROM PLAYER WHERE HEIGHT BETWEEN 170 AND 180;

BETWEEN a AND b 는 범위에서 'a' 와 'b' 의 값을 포함한다. ( <= , >= )

 

 

 

 


※ IS NULL 연산자

 

NULL ( ASCII 00 ) 은 값이 존재하지 않은 것으로 확정되지 않은 값을 표현한다.

어떤 값 보다 크거나 작지도 않고, ' ' (공백, ASCII 32) 이나 0 (ZERO, ASCII 48) 과 달리 비교 자체가 불가능한 값이다.

 

 

< 연산 관련 NULL 의 특성 >

 (1) NULL 값과의 수치연산은 NULL 값을 리턴한다.

 (2) NULL 값과의 비교연산은 거짓(FALSE) 을 리턴한다.

 (3) 어떤 값과 비교할 수도 없으며, 특정 값보다 크다 작다 라고 표현할 수 없다.

 

 NULL 값은 비교 연산자 ( =, >, < 등 ) 로 비교할 수 없다.

 비교 연산을 하게 되면 결과는 거짓(FALSE) 을 리턴한다.

 

 수치 연산자 ( +, -, *, / 등 ) 를 통해서 NULL 값과 연산을 하게 되면 NULL 값을 리턴한다.

 

 NULL 값의 비교 연산은 IS NULL, IS NOT NULL 이라는 문구로만 할 수 있다.

 

 

 

 

 

(예제)

 

IS NULL 연산자를 사용하는 것.

 

(1) POSITION 값이 NULL 인 조건문

SELECT PLAYER_NAME FROM PLAYER WHERE POSITION IS NULL;

 

 

 

 

 


5. 논리 연산자

    : 논리 연산자는 비교 연산자나  SQL 비교 연산자들로 이루어진 여러 개의 조건들을 논리적으로 연결시키기 위해 사용되는 연산자이다.

 

 

논리 연산자의 종류

 

 

 

 

(예제)

 

 

(1) " TEAM ID 가 K02 " 인 조건과 " 키가 170 이상 " 인 조건을 연결한 조건문 

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = 'K02' AND HEIGHT >= 170;

' AND ' 로 두 조건을 연결했다.

 

 

 

 

(2) TEAM ID가 K02 또는 K07 에 소속된 선수들이어야 하고, POSITION 이 MF 이어야 한다.

    키는 170 이상 180 이하여야 한다.

 

 

* 오류사항 코드

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = 'K02' OR TEAM_ID = 'K07'
       AND POSITION = 'MF'
       AND HEIGHT >= 170 AND HEIGHT <= 180;

위 코드는 POSITION 이 MF 가 아닌 선수들의 명단이 출력된다.

위 SQL 문장에서 괄호가 누락됨으로서 OR 논리 연산자보다 AND 논리 연산자를 먼저 실행하기 때문에 잘못되었다.

 

처리 우선순위 ( ) , NOT , AND , OR 의 순서대로 처리된다.

 

 

 

 

논리 연산자의 순서 사례

 

 

* 올바른 코드

SELECT PLAYER_NAME FROM PLAYER WHERE (TEAM_ID IN ('K02','K07'))
       AND POSITION = 'MF'
       AND HEIGHT BETWEEN 170 AND 180;

SQL 문장을 괄호를 사용하여 적용하면 올바른 코드이다.

 

TEAM_ID = 'K02' OR TEAM_ID = 'K07'=TEAM_ID IN ('K02','K07')

 

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

 

 

 

 

 

 

 

 


6. 부정 연산자

    : 부정 표현을 부정 논리 연산자, 부정 SQL 연산자로 구분할 수 있다.

 

 

부정 연산자 종류

 

 

 

(예제)

 

 

(1) TEAM ID 가 K02 소속인 선수들 중에서 POSITION 이 MF 가 아니고, 키가 175 이상 185 이하 가 아닌 선수 조건문

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = 'K02' AND NOT POSITION = 'MF'
       AND NOT HEIGHT BETWEEN 175 AND 185;

 

 

 

(2) NATION 칼럼에 별도 데이터를 입력하지 않음.

    이 칼럼이 NULL 이 아닌 조건문.

SELECT PLAYER_NAME, NATION FROM PLAYER WHERE NATION IS NOT NULL;

 

  

 

 

 

 

 

 


7. ROWNUM, TOP 사용

ROWNUM

    : Oracle 의 ROWNUM.

      칼럼과 비슷한 성격의 Pseudo Column 으로써 SQL 처리 결과 집합의 각행에 대해 임시로 부여되는 일련번호이다.

      테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용한다.

 

# WHERE 절

WHERE ROWNUM = 1;
WHERE ROWNUM <= 1;
WHERE ROWNUM <2;

 

두 건 이상의 N 행을 가져올 때, ROWNUM = N; 처럼 사용할 수 없다.

WHERE ROWNUM <= N; 으로 사용한다.

 

 

추가적인 ROWNUM 의 용도로,

테이블 내의 고유한 키나 인덱스 값을 만들 수 있다.

 

UPDATE MY_TABLE SET COLUMN1 = ROWNUM;

 

 

 


TOP 절

    : SQL Server 의 TOP 절.

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

      

 

 

* TOP 절의 표현식

TOP (Expression) [PERCENT] [WITH TIES]

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

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

- WITH TIES : ORDER BY 절이 지정된 경우에만 사용.

                  TOP N(PERCENT) 의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정함.

 

 

(예시)

// 한 건의 행만 가져옴

SELECT TOP(1) PLAYER_NAME FROM PLAYER;
// 두 건 이상의 N 행을 가져옴

SELECT TOP(N) PLAYER_NAME FROM PLAYER;

 

 

SQL 문장에서 ORDER BY 절이 사용되지 않으면,

Oracle 의 ROWNUM 과 SQL Server 의 TOP 절은 같은 기능을 한다.

 

ORDER BY 절이 사용되면, 기능의 차이가 발생한다.

 

 

 

 

 

 

 

 


 

'SQL > SQLD 2과목' 카테고리의 다른 글

SQLD - 과목2. (7) GROUP BY, HAVING 절  (0) 2021.03.18
SQLD - 과목2. (6) 함수 (FUNCTION)  (0) 2021.03.16
SQLD - 과목2. (4) TCL  (0) 2021.03.08
SQLD - 과목2. (3) DML  (0) 2021.03.05
SQLD - 과목2. (2) DDL  (0) 2021.03.03
댓글