WHERE 절 이해하기
테이블에서 원하는 데이터만 조회하기 위해 WHERE 절을 사용한다. Item(상품) 테이블에서 특정 조건의 데이터만 검색하고 싶다면 아래와 같이 WHERE 절을 사용하면 된다.
•
UPDATE나 DELETE SQL에서는 원하는 데이터만 변경하거나 삭제하기 위해 사용한다.
•
SQL은 선언적 언어다. WHERE 절을 사용해 필요한 데이터 집합을 선언하면, DBMS가 알아서 결과를 추출해준다.
•
WHERE 절은 FROM 절과 다음에 작성한다.
•
WHERE 절은 '<컬럼명> <조건 연산식> <값>' 의 형식으로 사용한다.
•
컬럼명에는 FROM 절에 기술한 테이블의 컬럼을 사용한다.
-- [SQL-3-3-1]
SELECT ItemId ,ItemNm
FROM startdb.Item
WHERE ItemId = 'AMB';
ItemId ItemNm
------ ------------
AMB Americano(B)
-- [SQL-3-3-2]
SELECT ItemId ,ItemNm
FROM startdb.Item
WHERE ItemNm = 'Iced Cafe Latte(B)';
ItemId ItemNm
------ ------------------
ICLB Iced Cafe Latte(B)
SQL
복사
WHERE 절은 FROM 절의 테이블에서 조건에 맞는 데이터만 조회되도록 해준다. 아래 그림과 같이 조건을 처리한다고 생각할 수 있다.
•
여기서는 이해가 쉽도록 테이블의 데이터를 레코드별로 처음부터 끝까지 검색하는 것으로 표현
•
실제로는 인덱스라는 추가 구조에 따라 데이터를 검색하는 방법이 다양해진다.
왼쪽의 SQL을 먼저 보면 Item 테이블에서 ItemCat(상품종류)가 'BKR'(베이커리)인 데이터만 조회하고 있다. 이 경우, 오른쪽 그림과 같이 Item 테이블의 데이터를 한 건씩 확인해 ItemCat가 'BKR'인 레코드(로우)만 찾아서 결과로 내보내 준다. 위 SQL은 SELECT 절에서 ItemId, ItemNm, ItemCat만 사용했기 때문에, 세 개의 컬럼만 결과로 출력된다. 만약에 SELECT 절에 *를 사용했다면 조건에 해당하는 레코드의 모든 컬럼을 보여줄 것이다.
WHERE 절 조건 사용법
WHERE 절 조건 사용법: <테이블 컬럼명> <조건 연산식> <조건 값>
•
<테이블 컬럼명>: FROM 절에 사용한 테이블의 컬럼만 사용할 수 있다.
•
<조건 연산식>: <테이블의 컬럼명>과 <조건 값>을 어떤 조건으로 비교할지 정의
◦
<조건 연산식>에는 아래와 같은 비교연산자가 있다.
▪
=, !=, >, >=, <, <=
▪
ItemId = 'AMB': ItemId에 저장된 값이 AMB인 경우 조회
▪
ItemId != 'AMB': ItemId에 저장된 값이 AMB가 아닌 경우 조회
▪
ItemId > 'Z': ItemId에 저장된 값이 'Z'보다 큰 경우 조회
▪
ItemId < 'Z': ItemId에 저장된 값이 'Z'보다 작은 경우 조회
▪
ItemId >= 'X': ItemId에 저장된 값이 'X'보다 크거나 같은 경우 조회
▪
ItemId <= 'X': ItemId에 저장된 값이 'X'보다 작거나 같은 경우 조회
•
<조건 값>: <테이블 컬럼명>과 비교할 값을 입력
•
<조건 값>에는 일반적으로 문자 또는 숫자 형태로 조건 값을 지정할 수 있다.
◦
문자로 조건 값을 줄때는 싱글따옴표(')로 조건 값을 감싸서 처리
◦
조건 값을 숫자로 처리해야 한다면 싱글따옴표를 제거
-- [SQL-3-3-3]
-- ItemId가 AMB인 데이터 집합을 조회
SELECT ItemId ,ItemNm ,ItemCat
FROM startdb.Item
WHERE ItemId = 'AMB';
-- [SQL-3-3-4]
-- ItemCat가 COF가 아닌 데이터 집합을 조회
SELECT ItemId ,ItemNm ,ItemCat
FROM startdb.Item
WHERE ItemCat != 'COF';
-- [SQL-3-3-5]
-- ItemId가 I 이상인 데이터 집합을 조회
-- 문자형 조건에 크다 작다는 기본적으로 알파벳 순서로 판단된다.
-- a가 작은 값, z가 큰 값
SELECT ItemId ,ItemNm ,ItemCat
FROM startdb.Item
WHERE ItemId >= 'I';
-- [SQL-3-3-6]
-- ItemId가 C 미만인 데이터 집합을 조회
SELECT ItemId ,ItemNm ,ItemCat
FROM startdb.Item
WHERE ItemId < 'C';
SQL
복사
데이터 집합의 변화
SQL을 통해 데이터가 어떻게 변하는지 항상 머릿속에 그려보기 바란다. 이러한 연습이 쌓이면, 더 많은 데이터의 복잡한 처리도 비교적 쉽게 해결할 수 있다.
위 내용을 간략하게 그려보면 다음과 같다.
SQL의 WHERE 절은 결과적으로 데이터 집합의 높이를 낮추는 역할을 한다. SELECT 절에 일부 컬럼만 적었다면, 데이터 집합은 아래와 같이 넓이도 줄어들게 된다.
WHERE 절은 데이터 집합의 높이를 변화시키고, SELECT 절은 데이터 집합의 넓이를 변화시킨다. SQL을 작성할때 이와 같이 데이터 집합이 변한다는 걸 기억하기 바란다.
아마도, 이전에 SQL을 공부해봤다면, "이렇게 WHERE 절을 복잡하게 설명한다고?"라고 생각될 수 있다. "WHERE 절은 조건에 맞는 데이터를 테이블에서 찾아낸다."라고 간단하게 설명하고 넘어가도 될 내용을 그림까지 그려가며 길게 설명한 이유는 SQL 문법이 아닌 제대로 데이터를 다루는 법을 알려주고 싶기 때문이다. 단순히 SQL 문법을 익히는게 아니라, 우리가 사용한 SQL에 따라 데이터 집합이 어떻게 변하는지 잘 알고 있어야, 나중에 조인이나 GROUP BY, 분석함수를 사용할 때 거침없이 사용할 수 있으며, 그래야만 데이터 집합을 효과적으로 자유자재로 다룰 수 있다.
문자 조건 값과 숫자 조건 값
WHERE 절에 조건 값을 줄 때, 직접적으로는 문자 또는 숫자만 입력할 수 있다.
•
싱글따옴표를 사용해 문자 조건 값을 지정
•
숫자 조건 값을 줄 때는 숫자값에 싱글 따옴표를 생략
•
조건 값을 바인드 변수에 담아 사용할 수도 있다.
-- [SQL-3-3-7]
-- 상품 테이블에서 ItemCat(상품카테고리)가 BKR(베이커리)인 데이터 집합 조회
-- 싱글따옴표를 사용해 문자로 조건 값을 지정
SELECT ItemId ,ItemNm ,ItemCat
FROM startdb.Item
WHERE ItemCat = 'BKR';
-- [SQL-3-3-8]
-- 조건 값인 BKR에 싱글따옴표 생략(에러 발생)
-- BKR을 테이블의 컬럼으로 인식해 처리
SELECT ItemId ,ItemNm ,ItemCat
FROM startdb.Item
WHERE ItemCat = BKR;
-- [SQL-3-3-9]
-- Ord(주문) 테이블에서 OrdNo(주문번호)가 30인 데이터 조회
-- OrdNo는 숫자 컬럼이므로 조건 값에 싱글 따옴표 없이 숫자로 30을 입력
SELECT OrdNo, MemberId ,ShopId, OrdDtm
FROM startdb.Ord
WHERE OrdNo = 30;
-- [SQL-3-3-10]
-- OrdNo에 대한 조건 값을 싱글따옴표를 이용해 문자로 지정
-- '30'은 싱글따옴표가 있으므로 문자값으로 입력한 것입니다.
-- 이 경우 문자와 숫자간에 비교가 발생하면,
-- MySQL이 문자를 숫자로 자동 변환해 조건을 처리합니다.
SELECT OrdNo, MemberId ,ShopId, OrdDtm
FROM startdb.Ord
WHERE OrdNo = '30';
-- [SQL-3-3-11]
-- OrdNo(숫자 컬럼)에 대한 조건을 'BKR'이란 문자 값을 사용
-- 숫자와 문자간에 비교가 발생하면 문자를 숫자로 변환
-- 'BKR'은 숫자로 변환할 수 없기 때문에 아래 SQL은 에러가 발생합니다.
SELECT OrdNo, MemberId ,ShopId, OrdDtm
FROM startdb.Ord
WHERE OrdNo = 'BKR';
SQL
복사
•
문자 컬럼에는 문자 조건값을! 숫자 컬럼에는 숫자 조건값을!
◦
문자 컬럼에는 문자로 조건값을, 숫자 컬럼에는 숫자 조건값을 사용하는 것이 기본 원칙이다.
◦
DBMS는 서로 다른 자료형 간에 직접적인 비교가 불가능하다.
▪
서로 다른 자료형 간에 비교가 발생하면, 한쪽의 자료형을 변환해 같은 자료형으로 만든 후에 비교를 처리한다.
•
일반적으로 숫자와 문자간의 비교가 발생하면 문자를 숫자 형태로 변경하는 편이다.
•
DBMS나 설치된 환경 마다 다를 수 있다.
•
같은 자료형만 비교 가능한 DBMS도 있다.
바인드 변수 처리
바인드 변수를 사용해 조건을 처리할 수 있다. DBMS와 SQL 툴에 따라 사용법이 다를 수 있다.
SET을 사용한 바인드 변수 처리
DBeaver의 경우 콜론(:)을 이용해 SQL에 바로 바인드 변수 적용 가능
BOOSTER QUIZ
BOOSTER QUIZ ERD
BOOSTER QUIZ 3-3-1
상품 테이블에서 상품ID가 AMB인 데이터를 조회하시오.
•
대상 테이블: 상품(Item)
•
조회 조건: ItemId가 AMB인 상품만 조회
•
조회 컬럼: Item의 모든 컬럼
ItemId ItemNm ItemCat ItemSizeCd HotColdCd LaunchDt
------ ------------ ------- ---------- --------- ----------
AMB Americano(B) COF BIG HOT 2019-01-01
SQL
복사
BOOSTER QUIZ 3-3-2
상품카테고리가 음료인 상품 정보를 조회하시오.
•
대상 테이블: 상품(Item)
•
조회 조건: ItemCat가 BEV인 Item
•
조회 컬럼: ItemId, ItemNm, ItemCat
ItemId ItemNm ItemCat
------ ----------------- -------
CITR Yuzu Ade(R) BEV
HCHB Hot Chocolate(B) BEV
HCHR Hot Chocolate(R) BEV
LEMR Lemonade(R) BEV
ZAMB Grapefruit Ade(R) BEV
SQL
복사