SQL 데이터베이스 입문_ 3. 데이터 필터링 하기

olongun·2025년 4월 11일

3.1 데이터 필터링이란

3.1.1 데이터 필터링의 개념

데이터 필터링이란 원하는 데이터만 걸러내는 작업으로 주로 WHERE 절을 통해 수행한다.

데이터 필터링을 실습하기 위해 mapdonalds DB에 burgers 테이블 생성

-- mapdonalds DB 진입
USE mapdonalds;

-- burgers 테이블 생성
CREATE TABLE burgers (
	id INTEGER, 		-- 아이디(정수형 숫자)
	name VARCHAR(50),	-- 이름(문자: 최대 50자)
	price INTEGER, 		-- 가격(정수형 숫자)
	gram INTEGER, 		-- 그램(정수형 숫자)
	kcal INTEGER, 		-- 열량(정수형 숫자)
	protein INTEGER, 	-- 단백질량(정수형 숫자)
	PRIMARY KEY (id) 	-- 기본키 지정: id
);

-- burgers 데이터 삽입
INSERT INTO burgers (id, name, price, gram, kcal, protein)
VALUES
	(1, '빅맨', 5300, 223, 583, 27),
	(2, '베이컨 틈메이러 디럭스', 6200, 242, 545, 27),
	(3, '맨스파이시 상해 버거', 5300, 235, 494, 20),
	(4, '슈비두밥 버거', 6200, 269, 563, 21),
	(5, '더블 쿼터파운드 치즈', 7700, 275, 770, 50);
    
-- 모든 버거 조회
SELECT *
FROM burgers;

3.1.2 비교 연산자

비교 연산자는 두 값을 비교하는 연산자

  • =
  • !=
  • >
  • >=
  • <
  • <=

실습코드

-- price가 5500보다 작은 버거 조회
SELECT *
FROM burgers
WHERE price < 5500;

-- price가 5500보다 큰 버거 조회
SELECT *
FROM burgers
WHERE price > 5500;

-- protein이 25보다 작은 버거 조회
SELECT *
FROM burgers
WHERE protein < 25;

3.1.3 논리 연산자

논리 연산자란 두 조건을 조합해 새로운 조건을 만드는 연산자

  • AND
  • OR
  • NOT

실습코드

-- price가 5500보다 작고 protein이 25보다 큰 버거 조회
SELECT *
FROM burgers
WHERE price < 5500 AND protein > 25;

-- price가 5500보다 작거나 protein이 25보다 큰 버거 조회
SELECT *
FROM burgers
WHERE price < 5500 OR protein > 25;

-- protein이 25보다 크지 않은 버거 조회
SELECT *
FROM burgers
WHERE NOT protein > 25;

3.1.4 산술 연산자

산술 연산자란 사칙 연산을 위한 연산자

  • + 더하기
  • - 빼기
  • * 곱하기
  • / 나누기
  • % 나머지

실습코드

-- 산술 연산자
SELECT 100 + 20; --120
SELECT 100 - 20; --80
SELECT 100 * 20; --2000
SELECT 100 / 20; --5.0000
SELECT 100 % 20; --0

3.1.5 연산자 우선순위

연산자 우선순위란 어떤 연산자를 먼저 수행할지 그 우선순위를 정한 것으로 아래와 같다
( ) -> NOT -> *, /, % -> +, - -> 비교 연산자 -> AND -> OR

실습코드

-- 연산자 우선순위
SELECT 3 + 5 * 2;
SELECT (3 + 5) * 2;
SELECT 3 + 5 * 2;
SELECT true or true and false;
SELECT (true or true) and false;

3.2 데이터 필터링 실습: 대학 DB

3.2.1 데이터셋 만들기

university DB를 생성 및 진입한 후 students 테이블을 만들고 데이터를 삽입

-- university DB 생성 및 진입
CREATE DATABASE university;
USE university;

-- students 테이블 생성
CREATE TABLE students (
	id INTEGER, 			-- 아이디
	nickname VARCHAR(50), 	-- 닉네임
	math INTEGER, 			-- 수학 성적
	english INTEGER, 		-- 영어 성적
	programming INTEGER, 	-- 프로그래밍 성적
	PRIMARY KEY (id) 		-- 기본키 지정: id
);

-- students 데이터 삽입
INSERT INTO students (id, nickname, math, english, programming)
VALUES
	(1, 'Sparkles', 98, 96, 93),
	(2, 'Soldier', 82, 66, 98),
	(3, 'Lapooheart', 84, 70, 82),
	(4, 'Slick', 87, 99, 98),
	(5, 'Smile', 75, 73, 70),
	(6, 'Jellyboo', 84, 82, 70),
	(7, 'Bagel', 97, 91, 87),
	(8, 'Queen', 99, 100, 88);

3.2.2 ~ 3.2.6 실습 코드

-- 3.2.2 모든 과목 성적이 90점 이상인 학생 찾기
SELECT *
FROM students
WHERE math >= 90 and english >= 90 and programming >= 90;

-- 3.2.3 75점 미만이 하나라도 있는 학생 찾기
SELECT *
FROM students
WHERE math < 75 or english < 75 or programming < 75;

-- 3.2.4 모든 학생의 총점 구하기
SELECT nickname, math, english, programming, math + english + programming
FROM students;

-- 3.2.5 모든 학생의 평균 구하기
SELECT nickname, math, english, programming, (math + english + programming) / 3
FROM students;

-- 3.2.6 총점이 270 이상인 학생의 닉네임, 총점, 평균 출력하기
SELECT nickname, (math + english + programming), (math + english + programming) / 3
FROM students
WHERE (math + english + programming) >= 270;

AS 키워드

AS 키워드는 칼럼이나 테이블에 별칭을 지정하는 키워드
칼럼이나 테이블 이름이 길거나 의미를 분명하게 해야 할 경우 사용
해당 쿼리의 출력 결과에만 임시로 나타나며, 쿼리의 가독성을 높이고 쿼리를 더 간결하게 해준다.

SELECT 칼럼명 AS 별칭
FROM 테이블명;

만약 별칭에 띄어쓰기나 특수 문자가 사용되거나 숫자로 시작하는 경우 '(작은따옴표)로 감싸야 제대로 출력됨

  • 실습코드
-- AS 키워드
SELECT
	nickname AS 닉네임,
    (math + english + programming) AS 총점,
    (math + english + programming) / 3 AS 평균
FROM students
WHERE (math + english + programming) >= 270;

3.3 셀프체크

3.1절에서 만든 burgers 테이블을 이용해 다음 1~6을 수행하는 쿼리를 작성하세요.

burgers

(id, name, price, gram, kcal, protein)
(1, '빅맨', 5300, 223, 583, 27)
(2, '베이컨 틈메이러 디럭스', 6200, 242, 545, 27)
(3, '맨스파이시 상해 버거', 5300, 235, 494, 20)
(4, '슈비두밥 버거', 6200, 269, 563, 21)
(5, '더블 쿼터파운드 치즈', 7700, 275, 770, 50)
-- mapdonalds DB 진입
USE mapdonalds;

-- 3.3.1 가격이 6,000원 이상 7,000원 미만인 버거의 모든 칼럼을 조회
SELECT *
FROM burgers
WHERE price >= 6000 AND price < 7000;

-- 3.3.2 열량이 500 미만이거나 단백질량이 25 이상인 버거의 모든 칼럼을 조회
SELECT *
FROM burgers
WHERE kcal < 500 OR protein >= 25;

-- 3.3.3 모든 버거의 100g당 가격을 '버거이름', 100g당 가격'의 칼럼으로 조회
SELECT
	name AS '버거 이름',
    price * 100 / gram AS '100g당 가격'
FROM burgers;

-- 3.3.4 100g당 가격이 2,500원 미만인 버거를 '버거 이름', '가격', '무게(g)', '100g당 가격'의 칼럼으로 조회
SELECT
	name AS '버거 이름',
    price AS 가격,
    gram AS '무게(g)',
    price * 100 / gram AS '100g당 가격'
FROM burgers
WHERE (price * 100 / gram) < 2500;

-- 3.3.5 1,000원당 들어 있는 단백질량을 계산해 '버거 이름', '1000원당 단백질량'의 칼럼으로 조회
SELECT
	name AS '버거 이름',
    protein * 1000 / price AS '1000원당 단백질량'
FROM burgers;

-- 3.3.6 1,000원당 들어 있는 단백질량이 5 이상인 버거를 '버거 이름', '1000원당 단백질량'의 칼럼으로 조회
SELECT
	name AS '버거 이름',
    protein * 1000 / price AS '1000원당 단백질량'
FROM burgers
WHERE (protein * 1000 / price) >= 5;

데이터 필터링 연습 문제

다음 products 테이블 생성과 데이터 삽입 쿼리를 보고 문제에 답하세요.

CREATE DATABASE mart;
USE mart;

-- products 테이블 생성
CREATE TABLE products(
	id INTEGER,
    name VARCHAR(50),
    category VARCHAR(30),
    price INTEGER,
    stock INTEGER,
    
    PRIMARY KEY (id)
);

-- products 데이터 삽입
INSERT INTO products (id, name, category, price, stock)
VALUES
(1, '노트북', '전자기기', 1200000, 10),
(2, '스마트폰', '전자기기', 800000, 15),
(3, '청소기', '생활용품', 150000, 8),
(4, '텀블러', '생활용품', 12000, 50),
(5, '초코바', '식품', 1500, 100),
(6, '커피', '식품', 4500, 200),
(7, '에어컨', '전자기기', 1200000, 5),
(8, '책상', '가구', 50000, 20),
(9, '의자', '가구', 40000, 25),
(10, '모니터', '전자기기', 300000, 12);

-- 연습 문제 1. 가격이 300,000원 이상인 제품명과 가격을 조회
SELECT name, price
FROM products
WHERE price >= 300000;

-- 연습 문제 2. 카테고리가 '전자기기'이고 재고가 10개 이상인 제품명과 재고를 조회
SELECT name, stock
FROM products
WHERE category = '전자기기' AND stock >= 10;

-- 연습 문제 3. 가격에 10% 세금을 적용한 최종 가격을 계산해 제품명과 함께 조회
SELECT name, price*1.1 AS final_price
FROM products;

-- 연습 문제 4. 카테고리가 '전자기기'가 아닌 제품을 찾아 제품명과 카테고리를 조회
SELECT name, category
FROM products
WHERE NOT category = '전자기기';

-- 연습 문제 5. 재고가 10개 이하인 제품 중 가격을 20% 할인해 제품명과 가격을 조회
SELECT name, price*0.8 AS discounted_price
FROM products
WHERE stock <= 10;

-- 연습 문제 6. 카테고리가 '생활용품'이고 가격이 100,000원 이상이거나, 재고가 50개 이상인
-- 제품의 제품명, 카테고리, 재고를 조회
SELECT name, category, stock
FROM products
WHERE (category = '생활용품' AND price >= 100000) OR stock >= 50;

-- 연습 문제 7. 카테고리가 '전자기기'인 제품 중 재고가 10개 이하 남은 제품을 30% 할인된 가격으로 판매한다.
-- 해당 제품의 제품명, 재고, 할인된 가격을 조회
SELECT name, stock, price*0.7 AS final_price
FROM products
WHERE category = '전자기기' AND stock <= 10;

-- 연습 문제 8. 각 제품의 재고를 모두 소진했을 때 매출을 구해 제품명과 총판매액을 출력
SELECT name, price*stock AS total_sales_amount
FROM products

0개의 댓글