[SQL] 5장. 고급 데이터 필터링

김상현·2022년 9월 21일
0

SQL

목록 보기
5/22
post-thumbnail

[손에 잡히는 10분 SQL - 벤 포터 지음, 박남혜 옮김] 책의 학습 후 정리자료입니다.


📍 WHERE 절 조합하기

  • WHERE 절에는 AND나 OR을 사용하여 여러 개의 조건을 지정한 다양한 필터링 제어가 가능하다.

📌 AND 연산자 사용하기

  • AND는 지정된 조건을 모두 충족하는 행을 가져오도록 WHERE 절에서 사용하는 키워드이다.
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;

  • Products 테이블에서 vned_idDLL01 과 일치하고, prod_price 의 값이 4보다 작은 레코드의 prod_id, prod_price, prod_name 속성을 출력한 결과이다.

📌 OR 연산자 사용하기

  • OR은 DBMS에 하나의 조건만 충족한다면 그 행을 가져오도록 WHERE 절에서 사용하는 키워드이다.
  • OR 문은 첫번째 조건만 충족되면 두번째 조건은 비교하지 않고 행을 가져온다.
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

  • Products 테이블에서 vned_idDLL01 과 일치하거나, BRS01 과 일치 레코드의 prod_name, prod_price 속성을 출력한 결과이다.

📌 우선순위 이해하기

  • WHERE 절에서 AND와 OR 2개의 연산자를 조합해서 사용하면 정교하고 복잡한 필터링을 수행할 수 있다.
  • AND 키워드와 OR 키워드는 AND 키워드가 우선순위가 높기 때문에 이를 고려하여 SQL 문을 작성해야 한다.
  • 우선순위 : AND > OR
  • 만약 vend_idDLL01 혹은 BRS01 이면서 prod_price 의 값이 10 이상인 레코드를 호출한다면 아래와 같이 SQL 문을 작성해야 한다.
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;

  • (vend_id = 'DLL01' OR vend_id = 'BRS01') 를 괄호로 묶은 이유는 우선순위가 OR 보다 AND가 더 높기 때문에 OR 연산자를 먼저 실행하기 위해서 괄호를 통해 우선순위를 높인 것이다.

📍 IN 연산자 사용하기

  • IN 연산자는 조건의 범위를 지정할 때 사용한다.
  • 조건이 많을 때는 IN 연산자 문법이 OR보다 훨씬 깔끔하고 읽기 편하다.
  • AND나 OR 연산자와 함께 사용할 때 우선순위를 관리하기 편하다.
  • IN 연산자의 처리속도가 OR 연산자보다 빠르다.
  • IN 연산자는 SELECT 문을 포함할 수 있다.
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name;

  • Products 테이블에서 vned_idDLL01 과 일치하거나, BRS01 과 일치 레코드의 prod_name, prod_price 속성을 출력한 결과이다.

📍 NOT 연산자 사용하기

  • NOT 연산자는 뒤에 오는 조건을 역으로 만든다.
  • NOT 연산자는 단독으로 사용하지 못하고, 반드시 필터링 하려는 대상의 앞에 작성한다.
SELECT prod_name
FROM Products
WHERE not vend_id = 'DLL01'
ORDER BY prod_name;

  • Products 테이블에서 vned_idDLL01 과 일치하지 않는 레코드를 prod_name 을 기준으로 오름차순으로 정렬한 prod_name 속성을 출력한 결과이다.

📍 도전과제

  1. Vendors 테이블에서 캘리포니아에 있는 판매처의 이름(vend_name)을 가져오는 SQL 문을 작성하라(이를 처리하려면 국가(USA)와 주(CA)를 모두 봐야 한다. 미국 외에도 캘리포니아라는 지명이 존재하기 때문이다). 문자열이 일치하는지 여부로 필터링을 해야 한다는게 힌트다.
SELECT vend_name
FROM Vendors
WHERE vend_country = 'USA' and vend_state = 'CA';

  1. BR01, BR02, BR03 항목이 최소 100개 이상인 모든 주문 목록을 찾는 SQL 문을 작성하라. OrderItems 테이블에서 제품 ID(prod_id)와 수량으로 필터링하여 제품 번호(order_num), 제품 ID, 수량을 반환하도록 하자. 한 가지 힌트는 필터를 작성할 때 계산 순서에 특별히 주의를 기울여야 한다.
SELECT order_num, prod_id, quantity
FROM OrderItems
WHERE prod_id IN ('BR01', 'BR02', 'BR03')
AND quantity >= 100;

  1. Products 테이블에서 가격이 36 사이인 모든 제품의 제품명(prod_name)과 제품 가격(prod_price)을 가져오는 SQL 문을 작성하라. AND를 꼭 사용하고 결과는 가격순으로 정렬하라.
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 3 AND 6
ORDER BY prod_price;

  1. 다음 SQL 문은 무엇이 잘못되었는가?
SELECT vend_name
FROM Vendors
ORDER BY vend_name
WHERE vend_country = 'USA' AND vend_state = 'CA';
  • 위의 SQL 문은 ORDER BY 절의 위치가 잘못되었다.
  • ORDER BY 절은 무조건 SELECT 문의 제일 마지막에 위치해야 한다.
SELECT vend_name
FROM Vendors
WHERE vend_country = 'USA' AND vend_state = 'CA';
ORDER BY vend_name

profile
목적 있는 글쓰기

0개의 댓글