라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목SQL: WHERE절2023-02-27 02:46
작성자user icon Level 4

88x31.png


1. WHERE절


WHERE절은 SELECT문을 통해 데이터를 조회할때 특정 조건에 부합하는 자료를 검색하기 위한 명령어입니다. WHERE절은 FROM절 다음에 위치합니다.


WHERE절

 SELECT 컬럼명

   FROM 테이블명

 WHERE 조건식;


WHERE절의 조건식을 구성하하는 연산자에는 비교 연산자, SQL 연산자, 논리 연산자, 부정 연산자 4가지 종류가 있습니다. 



1) 비교 연산자


비교 연산자는 연산자를 기준으로 하여 왼쪽값과 오른쪽값의 크기를 비교하기 위한 연산자 입니다.


비교 연산자 종류

 연산자

 설명

 =

 같음

 >

 보다 큼

 >=

 보다 크거나 작음

 <

 보다 작음

 <=

 보다 작거나 같음


예를 들어 BOARD 테이블에서 DOCUMENT_IDX가 10보다 작은 레코드를 선택하려면 다음과 같이 쿼리문을 작성하면 됩니다.


비교연산자 예제

 SELECT *

   FROM BOARD

 WHERE DOCUMENT_IDX < 10;



2) 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;



3) 논리 연산자


논리 연산자는 여러 조건을 논리적으로 연결하기 위해 사용되는 연산자 입니다.


논리 연산자 종류

 연산자

 설명

 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;



4) 부정 연산자


부정 연산자는 비교 연산자나 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;



2. 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;

#sql# where절# 비교 연산자# SQL 연산자# 논리 연산자# 부정 연산자# 와일드카드# Top N 쿼리# ROWNUM
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)