AND
WHERE 절에는 AND나 OR를 사용해 여러 조건을 연결해서 사용할 수 있다. 이 중에 AND는 "그리고"란 의미를 갖고 있다. WHERE 절에 두 조건이 AND로 연결되어 있다면, 두 조건이 모두 만족하는 레코드(로우)만 SELECT 결과에 참여할 수 있다.
아래 SQL은 Item(상품) 테이블에서 ItemCat(상품카테고리)가 COF(커피)이면서, ItemSizeCd(상품사이즈코드)가 BIG인 상품을 조회하고 있습니다. AND를 사용해 ItemCat에 대한 조건과 ItemSizeCd에 대한 두 조건을 연결하고 있다.
-- [SQL-3-4-1]
SELECT ItemId ,ItemNm ,ItemCat ,ItemSizeCd
FROM startdb.Item
WHERE ItemCat = 'COF'
AND ItemSizeCd = 'BIG';
ItemId ItemNm ItemCat ItemSizeCd
------ ------------------ ------- ----------
AMB Americano(B) COF BIG
CLB Cafe Latte(B) COF BIG
IAMB Iced Americano(B) COF BIG
ICLB Iced Cafe Latte(B) COF BIG
SQL
복사
아래는 세 개의 조건을 AND로 연결했다.
-- [SQL-3-4-2]
SELECT ItemId ,ItemNm ,ItemCat ,ItemSizeCd
FROM startdb.Item
WHERE ItemCat = 'COF'
AND ItemSizeCd = 'BIG'
AND ItemId >= 'I';
ItemId ItemNm ItemCat ItemSizeCd
------ ------------------ ------- ----------
IAMB Iced Americano(B) COF BIG
ICLB Iced Cafe Latte(B) COF BIG
SQL
복사
OR
OR는 "또는"이란 의미를 가지고 있다. WHERE 절에 두 조건이 OR로 연결되어 있다면, 한 건의 데이터(레코드)가 두 조건 중에 하나라도 만족하면 결과에 참여할 수 있다.
아래 SQL을 살펴보자. ItemCat(상품종류)가 COF(커피)이거나 ItemSizeCd는 BIG인 상품을 조회하고 있다. 두 조건 중에 하나라도 만족하면 결과에 포함되는 것을 알 수 있다.
-- [SQL-3-4-3]
SELECT ItemId ,ItemNm ,ItemCat ,ItemSizeCd
FROM startdb.Item
WHERE ItemCat = 'COF'
OR ItemSizeCd = 'BIG';
ItemId ItemNm ItemCat ItemSizeCd
------ ------------------ ------- ----------
AMB Americano(B) COF BIG
AMR Americano(R) COF REG
CLB Cafe Latte(B) COF BIG
CLR Cafe Latte(R) COF REG
EINR Einspanner(R) COF REG
FLTR Flat White(R) COF REG
HCHB Hot Chocolate(B) BEV BIG
IAMB Iced Americano(B) COF BIG
IAMR Iced Americano(R) COF REG
ICLB Iced Cafe Latte(B) COF BIG
ICLR Iced Cafe Latte(R) COF REG
IEINR Iced Einspanner(R) COF REG
IFLTR Iced Flat White(R) COF REG
SQL
복사
AND와 OR
AND에 대해 되짚어 보면 다음과 같다.
•
(20>10) AND ('A'='A'): 참 AND 참이므로 결과는 참
•
(20>10) AND ('A'='B'): 참 AND 거짓이므로 결과는 거짓
•
(20>90) AND ('A'='B'): 거짓 AND 거짓이므로 결과는 거짓
이번에는 OR에 대해 되짚어보자.
•
(20>10) OR ('A'='A'): 참 OR 참이므로 결과는 참
•
(20>10) OR ('A'='B'): 참 OR 거짓이므로 결과는 참
•
(20>90) OR ('A'='B'): 거짓 OR 거짓이므로 결과는 거짓
AND는 연결된 비교 조건이 모두 만족해야 전체가 참이되며, OR는 연결된 비교 조건 중에 하나라도 만족하면 전체가 참이다. AND와 OR 연결자를 각각 따로 사용하는 것은 전혀 어렵지 않다. 하지만 두 연결자를 동시에 사용할때는 주의가 필요하다. AND와 OR를 동시에 사용할 때는 반드시 괄호를 사용해 별도로 처리될 조건들을 묶어주어야 한다. 아래와 같이 괄호의 위치에 따라 "거짓 AND 거짓 OR 참"의 결과가 다른 것을 알 수 있다.
•
거짓 AND (거짓 OR 참) = 거짓 AND (참) = 거짓
•
(거짓 AND 거짓) OR 참 = (거짓) OR 참 = 참
동일하게 "거짓 AND 거짓 OR 참"이 사용되었지만, 괄호 위치에 따라 최종 결과가 달라지는 것을 알 수 있다. 그러므로 AND와 OR가 동시에 사용된다면, 반드시 괄호를 적절한 위치에 사용해야 한다. 만약에 아래와 같이 AND와 OR가 사용되는데 괄호가 없다면, 최종 결과는 불명확하다.
•
거짓 AND 거짓 OR 참 = ?
상황에 따라 앞에서부터 순차적으로 조건 처리를 할 수도 있으며, 뒤에서부터 조건을 처리할 수도 있다. SQL이 복잡해질 수록 명확해지지 않으므로 AND와 OR가 동시에 사용된다면 반드시 적절하게 괄호를 사용해야 한다.
우리가 개발한 SQL에 AND와 OR를 동시에 사용하는데, 괄호가 없다면 잘못 작성한 SQL일 확률이 높다. 또는 괄호 없이 지금 당장 결과에 이상이 없더라도 나중에 조건이 추가되거나 변경되면서 잘못된 결과가 나올 수도 있다.
현업에서 아래와 같은 데이터를 요청했다고 생각해보자.
•
ItemCat가 BEV(음료) 인 Item 중에서 ItemSizeCd가 BIG 이거나(OR) HotColdCd가 COLD인 데이터를 조회해주세요.
위 요구사항을 어떻게 해석하는지에 따라 SQL 작성법이 달라진다. 아마도 위 요구사항은 아래와 같이 괄호를 처리해주는 것이 맞을 것이다.
-- [SQL-3-4-4]
SELECT ItemId ,ItemNm ,ItemCat ,ItemSizeCd ,HotColdCd
FROM startdb.Item
WHERE ItemCat = 'BEV'
AND (ItemSizeCd = 'BIG' OR HotColdCd = 'COLD');
ItemId ItemNm ItemCat ItemSizeCd HotColdCd
------ ----------------- ------- ---------- ---------
CITR Yuzu Ade(R) BEV REG COLD
HCHB Hot Chocolate(B) BEV BIG HOT
LEMR Lemonade(R) BEV REG COLD
ZAMB Grapefruit Ade(R) BEV REG COLD
SQL
복사
만약에 괄호를 사용하지 않았다면, 아래와 같이 의도하지 결과가 출력된다.
-- [SQL-3-4-5]
SELECT ItemId ,ItemNm ,ItemCat ,ItemSizeCd
FROM startdb.Item
WHERE ItemCat = 'BEV'
AND ItemSizeCd = 'BIG' OR HotColdCd = 'COLD';
-- 결과
ItemId ItemNm ItemCat ItemSizeCd
------ ------------------- ------- ----------
BMFR Blueberry Muffin(R) BKR REG
CITR Yuzu Ade(R) BEV REG
CMFR Chocolate Muffin(R) BKR REG
HCHB Hot Chocolate(B) BEV BIG
IAMB Iced Americano(B) COF BIG
IAMR Iced Americano(R) COF REG
ICLB Iced Cafe Latte(B) COF BIG
ICLR Iced Cafe Latte(R) COF REG
IEINR Iced Einspanner(R) COF REG
IFLTR Iced Flat White(R) COF REG
LEMR Lemonade(R) BEV REG
ZAMB Grapefruit Ade(R) BEV REG
SQL
복사
AND와 OR를 동시에 사용할 때는 반드시 괄호를 사용하시기 바랍니다. 보통은 OR가 사용된 조건을 괄호로 따로 묶어야 하는 경우가 보통입니다.
BOOSTER QUIZ
BOOSTER QUIZ ERD
BOOSTER QUIZ 3-4-1
상품카테고리가 커피이면서 빅사이이즈이고 HOT인 상품목록을 조회해주세요.
•
대상 테이블: 상품(Item)
•
조회 조건: ItemCat(상품카테고리)가 COF(커피)이면서 ItemSizeCd는 BIG이고 HotColdCd는 HOT인 데이터
•
조회 컬럼: ItemId, ItemNm, ItemCat, ItemSizeCd, HotColdCd
ItemId ItemNm ItemCat ItemSizeCd HotColdCd
------ ------------- ------- ---------- ---------
AMB Americano(B) COF BIG HOT
CLB Cafe Latte(B) COF BIG HOT
SQL
복사
BOOSTER QUIZ 3-4-2
레귤러 사이즈 상품 중에, 상품카테고리가 음료이거나 베이커리인 상품을 뽑아주세요.
•
대상 테이블: 상품(Item)
•
조회 조건: ItemSizeCd가 REG(Regular)이면서, ItemCat가 BEV(음료)이거나(OR) BKR(베이커리)인 데이터
•
조회 컬럼: ItemId, ItemNm, ItemCat, ItemSizeCd, HotColdCd
ItemId ItemNm ItemCat ItemSizeCd HotColdCd
------ ------------------- ------- ---------- ---------
CITR Yuzu Ade(R) BEV REG COLD
HCHR Hot Chocolate(R) BEV REG HOT
LEMR Lemonade(R) BEV REG COLD
ZAMB Grapefruit Ade(R) BEV REG COLD
BGLR Bagel(R) BKR REG HOT
BMFR Blueberry Muffin(R) BKR REG COLD
CMFR Chocolate Muffin(R) BKR REG COLD
MACA Macaron(R) BKR REG HOT
SQL
복사