SQL - WHERE절
WHERE절
WHERE절
은 SELECT문을 통해 데이터를 조회할때 특정 조건에 부합하는 자료를 검색하기 위한 명령어입니다. WHERE절은 FROM절 다음에 위치합니다.
WHERE절
SELECT 컬럼명
FROM 테이블명
WHERE 조건식;
WHERE절의 조건식을 구성하하는 연산자에는 비교 연산자
, SQL 연산자
, 논리 연산자
, 부정 연산자
4가지 종류가 있습니다.
비교 연산자
비교 연산자
는 연산자를 기준으로 하여 왼쪽값과 오른쪽값의 크기를 비교하기 위한 연산자 입니다.
비교 연산자 종류
연산자 | 설명 |
---|---|
= | 같음 |
> | 보다 큼 |
>= | 보다 크거나 작음 |
< | 보다 작음 |
<= | 보다 작거나 같음 |
예를 들어 BOARD 테이블에서 DOCUMENT_IDX가 10보다 작은 레코드를 선택하려면 다음과 같이 쿼리문을 작성하면 됩니다.
비교연산자 예제
SELECT *
FROM BOARD
WHERE DOCUMENT_IDX < 10;
SQL 연산자
SQL 연산자
는 기본적으로 예약된 연산자로서 모든 데이터 타입에 대하여 연산이 가능합니다.
SQL 연산자 종류
연산자 | 설명 |
---|---|
BETWEEN A AND B | A이상 B이하의 값 |
IN (LIST) | LIST에 있는 값 중 하나 이상을 포함 |
LIKE ‘비교문자열’ | 비교 문자열과 형태가 일치 |
IS NULL | NULL값을 가짐 |
예를 들어 BOARD 테이블에서 DOCUMENT_IDX가 5이상 10이하인 작은 레코드를 선택하려면 다음과 같이 쿼리문을 작성하면 됩니다.
BETWEEN 연산자
SELECT *
FROM BOARD
WHERE DOCUMENT_IDX BETWEEN 5 AND B;
해당 쿼리문은 아래에서 설명할 논리 연산자를 통해 다음과 같이 나타낼 수도 있습니다.
BETWEEN 연산자를 논리 연산자로 표현
SELECT *
FROM BOARD
WHERE DOCUMENT_IDX >= 5
AND DOCUMENT_IDX <= 10;
BOARD 테이블에서 DOCUMENT_IDX가 1, 10인 레코드를 선택하려면 다음과 같이 쿼리문을 작성합니다.
IN 연산자
SELECT *
FROM BOARD
WHERE DOCUMENT_IDX IN (1, 10);
IN
연산자 또한 논리 연산자로 나타낼 수 있습니다.
IN 연산자를 논리 연산자로 표현
SELECT *
FROM BOARD
WHERE DOCUMENT_IDX = 1
OR DOCUMENT_IDX = 10;
와일드카드
는 한 개 또는 0개 이상의 문자를 대신하여 사용하기 위한 특수 문자열입니다. LIKE 연산자
의 경우 와일드카드를 사용하여 비교문자열을 나타냄으로써 다양한 형태의 문자열을 선택할 수 있습니다.
와일드카드는 정규표현식과 유사한데, 0개 이상의 임의 문자열은 %
, 1개의 임의 문자열은 _
으로 나타냅니다. 와일드 카드를 사용한 사례는 다음과 같습니다.
와일드카드 사용 사례
와일드카드 | 설명 |
---|---|
a% | a로 시작하는 모든 문자열 |
%a | a로 끝나는 모든 문자열 |
%a% | a가 포함된 모든 문자열 |
___ | 3글자인 모든 문자열 |
[abc]% | a 또는 b 또는 c로 시작하는 모든 문자열 |
[^a]% | 1번째 글자가 a가 아닌 모든 문자열 |
예를 들어 BOARD 테이블에서 TITLE이 제목
으로 시작하는 레코드를 선택하려면 다음과 같이 쿼리문을 작성하면 됩니다.
LIKE 연산자
SELECT *
FROM BOARD
WHERE TITLE LIKE '제목%';
만약 비교문자열에 %
나 _
와 같은 와일드카드로 사용하는 특수문자가 포함된다면 ESCAPE
를 사용합니다.
ESCAPE 사용
SELECT *
FROM BOARD
WHERE CONTENTS LIKE '제목#_%' ESCAPE '#';
위에 쿼리문의 경우 #
을 ESCAPE 문자로 인식하여 #
문자 뒤에 나오는 _
를 와일드카드가 아닌 일반 문자열로 인식하여 제목_
으로 시작하는 레코드를 선택하게 됩니다.
만약 값이 NULL이라면 알 수 없는 값으로 비교 자체가 불가하므로 비교연산자 =
을 사용하여 조건문을 작성할 수 없습니다. 대신에 IS NULL
연산자를 사용할 수 있습니다.
예를 들어 BOARD 테이블에서 CONTENTS가 NULL인 레코드를 선택하려면 다음과 같이 쿼리문을 작성합니다.
IS NULL 연산자
SELECT *
FROM BOARD
WHERE CONTETS IS NULL;
논리 연산자
논리 연산자
는 여러 조건을 논리적으로 연결하기 위해 사용되는 연산자 입니다.
논리 연산자 종류
연산자 | 설명 |
---|---|
AND | 모든 조건을 만족(교집합) |
OR | 조건 중 하나라도 만족(합집합) |
NOT | 반대의 조건을 만족(여집합) |
예를 들어 BOARD 테이블에서 DOCUMENT_IDX가 10이상이고 TITLE이 제목
으로 시작하는 레코드를 선택하려면 다음과 같이 쿼리문을 작성할 수 있습니다.
논리 연산자
SELECT *
FROM BOARD
WHERE 1 = 1
AND DOCUMENT_IDX >= 10
AND TITLE LIKE '제목%';
논리 연산자를 가시성있도록 표현하기위해 관례적으로 WHERE 키워드 뒤에는 1 = 1
을 붙이는데, 이 표현은 항상 참(True)이 됩니다.
NOT 연산자를 통해 SQL 연산자의 부정을 나타낼 수도 있습니다. 예를 들어 TITLE이 NULL이 아닌 레코드를 선택하려면 다음과 같이 쿼리문을 작성할 수 있습니다.
NOT 연산자
SELECT *
FROM BOARD
WHERE TITLE IS NOT NULL;
부정 연산자
부정 연산자는 비교 연산자나 SQL 연산자의 부정을 나타냅니다. 비교연산자의 경우 ISO 표준으로 <>
기호를 사용하며, 일부 DBMS에서는 !=
또는 ^=
기호를 사용하여 부정을 나타낼 수도 있습니다.
마이바티스에서는 XML 문서를 통해 Mapper에 SQL 쿼리문을 작성하게 되는데, 이때 <>
기호의 경우 태그가 아닌 문자 데이터임을 나타내기 위해 CDATA를 사용하여 쿼리문을 감싸줍니다. 하지만 CDATA를 사용하지 않고 바로 쿼리문을 작성하기 위해 !=
기호를 사용하기도 합니다.
부정 연산자
SELECT *
FROM BOARD
WHERE NOT DOCUMENT_IDX < 10;
위와 같이 쿼리문을 작성한다면 DOCUMENT_IDX가 10 이상인 레코드를 선택하게 되며, 다음과 같이 나타낼 수 있습니다.
NOT 연산자 제거
SELECT *
FROM BOARD
WHERE DOCUMENT_IDX >= 10;
Top N 쿼리
테이블에서 상위 N개의 레코드를 선택하기 이한 쿼리문을 Top N 쿼리
라고 합니다. 오라클의 경우 ROWNUM
이라는 가상 컬럼을 사용하여 해당 쿼리를 수행할 수 있습니다.
ROWNUM을 통한 Top N 쿼리 수행
SELECT *
FROM ( SELECT *
FROM PRODUCT
ORDER BY PRICE DESC )
WHERE ROWNUM <= 3;
위에 쿼리의 경우 PRODUCT 테이블에서 PRICE를 높은 순서로 배열하여 상위 3개의 레코드를 선택하게 되는데 뭔가 복잡해 보입니다. 이렇게 작성된 이유는 쿼리문의 실행 순서때문인데, 차후 설명할 인라인뷰에서 다시 설명하도록 하겠습니다.
SQL Server에서는 다음과 같이 쿼리를 작성할 수 있습니다.
SQL Server에서 Top N 쿼리 수행
SELECT TOP(3) *
FROM PRODUCT
ORDER BY PRICE DESC;
PRICE가 상위 20% 이내에 포함된 레코드를 선택하려면 다음과 같이 작성합니다.
가격이 상위 20% 이내인 레코드 선택
SELECT TOP 20 PERCENT *
FROM PRODUCT
ORDER BY PRICE DESC;
N에 상관없이 마지막 레코드와 동일한 값을 가지는 레코드를 모두 선택하려면 WITH TIES 키워드를 입력합니다.
동일한 값을 가지는 모든 레코드 선택
SELECT TOP 3 WITH TIES *
FROM PRODUCT
ORDER BY PRICE DESC;