[SQL&Database] 검색 및 데이터 처리

Comely·2025년 6월 9일

SQL

목록 보기
2/6

LIKE 문법을 이용한 패턴 검색

기본 LIKE 문법

특정 단어가 포함된 데이터를 검색할 때 사용하는 문법입니다.

-- 정확히 일치하는 경우
SELECT * FROM product WHERE 상품명 LIKE '소파';

-- 패턴 검색 (% 와일드카드 사용)
SELECT * FROM product WHERE 상품명 LIKE '%소파%';

와일드카드 종류

% (퍼센트) - 0개 이상의 아무 문자

-- '소파'가 포함된 모든 상품
SELECT * FROM product WHERE 상품명 LIKE '%소파%';

-- '소파'로 시작하는 상품
SELECT * FROM product WHERE 상품명 LIKE '소파%';

-- '소파'로 끝나는 상품  
SELECT * FROM product WHERE 상품명 LIKE '%소파';

_ (언더스코어) - 정확히 1개의 아무 문자

-- '아무글자 2개 + 소파'와 일치하는 상품
SELECT * FROM product WHERE 상품명 LIKE '__소파';

LIKE 사용 시 주의사항

  • 성능 저하: % 기호를 많이 사용하면 인덱스 활용이 어려워 속도가 느려질 수 있음
  • CHAR 타입: 고정 길이로 공백이 자동 추가되어 예상과 다른 결과가 나올 수 있음
  • 가능하면 =, >, < 등의 연산자 우선 사용 권장

복합 조건 검색

-- '소파' 또는 'chair'가 포함된 상품
SELECT * FROM product 
WHERE 상품명 LIKE '%소파%' OR 상품명 LIKE '%chair%';

-- '소파'는 포함하지만 '나무'는 포함하지 않는 상품
SELECT * FROM product 
WHERE 상품명 LIKE '%소파%' AND NOT 상품명 LIKE '%나무%';

-- 'Green'으로 시작해서 'chair'로 끝나는 상품
SELECT * FROM product WHERE 상품명 LIKE 'Green%chair';

집계 함수 (Aggregate Functions)

기본 집계 함수

숫자 데이터의 통계를 계산할 때 사용하는 함수들입니다.

-- 최댓값
SELECT MAX(사용금액) FROM card;

-- 최솟값  
SELECT MIN(사용금액) FROM card;

-- 평균값
SELECT AVG(연체횟수) FROM card;

-- 합계
SELECT SUM(사용금액) FROM card;

-- 개수 (행의 수)
SELECT COUNT(사용금액) FROM card;
SELECT COUNT(*) FROM card;  -- 같은 결과

AS를 이용한 컬럼명 변경

-- 컬럼명을 더 읽기 쉽게 변경
SELECT MAX(사용금액) AS 최대사용금액 FROM card;

-- 여러 집계 함수 동시 사용
SELECT MAX(결제횟수), MIN(결제횟수) FROM card;

조건부 집계

특정 조건을 만족하는 데이터만으로 통계를 계산할 수 있습니다.

-- VIP 고객의 평균 사용금액
SELECT AVG(사용금액) FROM card WHERE 고객등급 = 'vip';

-- VIP 고객의 평균 결제횟수와 사용금액 총합
SELECT AVG(결제횟수), SUM(사용금액) 
FROM card WHERE 고객등급 = 'vip';

-- 연체횟수 1회 이하인 고객 수
SELECT COUNT(연체횟수) FROM card WHERE 연체횟수 <= 1;

DISTINCT와 집계 함수

중복을 제거한 후 집계를 수행할 수 있습니다.

-- 중복 제거 후 출력
SELECT DISTINCT 연체횟수 FROM card;

-- 중복 제거 후 평균 계산
SELECT AVG(DISTINCT 연체횟수) FROM card;

LIMIT을 이용한 대안

큰 데이터셋에서 MAX/MIN 대신 정렬과 LIMIT을 사용할 수 있습니다.

-- MAX() 대신 정렬 + LIMIT 사용
SELECT * FROM card ORDER BY 사용금액 DESC LIMIT 1;

-- MIN() 대신 정렬 + LIMIT 사용  
SELECT * FROM card ORDER BY 사용금액 ASC LIMIT 1;

사칙연산과 컬럼 계산

숫자 컬럼의 사칙연산

컬럼 값에 직접 연산을 적용할 수 있습니다.

-- 부가세 제외한 사용금액 (10% 할인)
SELECT 사용금액 * 0.9 FROM card;

-- 컬럼명 변경과 함께 사용
SELECT 사용금액 * 0.9 AS 부가세제외, 연체횟수 + 100 FROM card;

사용 가능한 연산자

  • + : 덧셈
  • - : 뺄셈
  • * : 곱셈
  • / : 나눗셈

컬럼 간 연산

서로 다른 컬럼 값들을 연산할 수 있습니다.

-- 결제당 평균 사용금액 계산
SELECT 사용금액 / 결제횟수 FROM card;

-- 여러 컬럼 조합 연산
SELECT 사용금액, 결제횟수, 사용금액 / 결제횟수 AS 평균결제금액 FROM card;

문자열 처리 함수

CONCAT - 문자열 합치기

여러 문자열을 연결하여 하나로 만드는 함수입니다.

-- 고객명과 등급 합치기
SELECT CONCAT(고객명, 고객등급) FROM card;

-- 중간에 텍스트 추가
SELECT CONCAT(고객명, ' is ', 고객등급) FROM card;

-- 숫자도 문자로 변환하여 합치기
SELECT CONCAT(고객명, ' used ', 사용금액) FROM card;

DBMS별 차이점

-- MySQL/MariaDB
SELECT CONCAT(고객명, ' is ', 고객등급) FROM card;

-- PostgreSQL/Oracle  
SELECT 고객명 || ' is ' || 고객등급 FROM card;

문자열 조작 함수들

TRIM - 공백 제거

-- 좌우 공백 제거
SELECT TRIM(컬럼명) FROM 테이블명;

REPLACE - 문자 교체

-- '서울'을 '경기'로 모두 교체
SELECT REPLACE('서울에사는 서울맨', '서울', '경기');

-- 모든 공백 제거
SELECT REPLACE(컬럼명, ' ', '') FROM 테이블명;

SUBSTR - 문자 추출

-- 3번째부터 2글자 추출
SELECT SUBSTR('abcdef', 3, 2);  -- 결과: 'cd'

-- 휴대폰 번호 뒷자리 4글자
SELECT SUBSTR(번호, 10, 4) FROM 테이블명;

RIGHT/LEFT - 좌우에서 문자 추출

-- 오른쪽에서 4글자 추출
SELECT RIGHT(번호, 4) FROM 테이블명;

INSERT - 문자 일부 교체

-- 1번째부터 4글자를 'hello'로 교체
SELECT INSERT('test@naver.com', 1, 4, 'hello');  -- 결과: 'hello@naver.com'

수학 함수

최댓값/최솟값 비교

-- 여러 값 중 최댓값
SELECT GREATEST(5, 3, 2, 1, 4);  -- 결과: 5

-- 여러 값 중 최솟값  
SELECT LEAST(5, 3, 2, 1, 4);     -- 결과: 1

소수점 처리

-- 내림 (소수점 버림)
SELECT FLOOR(10.1);  -- 결과: 10
SELECT FLOOR(10.9);  -- 결과: 10

-- 올림
SELECT CEIL(10.1);   -- 결과: 11
SELECT CEIL(10.9);   -- 결과: 11

-- 반올림 (지정 자릿수까지)
SELECT ROUND(10.777, 2);    -- 결과: 10.78

-- 내림 (지정 자릿수까지)  
SELECT TRUNCATE(10.777, 2); -- 결과: 10.77

기타 수학 함수

-- 거듭제곱
SELECT POWER(4, 2);  -- 결과: 16 (4의 2승)

-- 절댓값
SELECT ABS(-100);    -- 결과: 100

실전 활용 예제

복합 쿼리 예제

-- VIP 고객의 할인된 평균 사용금액
SELECT AVG(사용금액 * 0.9) AS VIP할인평균금액 
FROM card 
WHERE 고객등급 = 'vip';

-- 고객 정보를 보기 좋게 포맷팅
SELECT CONCAT(고객명, ' (', 고객등급, ') - ', 사용금액, '원') AS 고객정보
FROM card;

-- 사용금액이 높은 상위 5명
SELECT * FROM card 
ORDER BY 사용금액 DESC 
LIMIT 5;

데이터 정제 예제

-- 연체 없는 고객들의 통계
SELECT 
    COUNT(*) AS 고객수,
    AVG(사용금액) AS 평균사용금액,
    SUM(사용금액) AS 총사용금액
FROM card 
WHERE 연체횟수 = 0;

-- 전화번호 마스킹 처리
SELECT 
    고객명,
    CONCAT(SUBSTR(번호, 1, 3), '-****-', RIGHT(번호, 4)) AS 마스킹번호
FROM card;

함수 사용 시 팁
1. 성능 고려: 함수 사용 시 인덱스 활용이 어려울 수 있으므로 대용량 데이터에서는 주의
2. DBMS별 차이: MySQL, PostgreSQL, Oracle 등에서 함수명이나 문법이 다를 수 있음
3. 실무 활용: 모든 함수를 외우지 말고 필요할 때 검색하여 사용하는 것이 효율적
4. 데이터 검증: 함수 적용 전후 결과를 반드시 확인하여 의도한 대로 작동하는지 검증

profile
App, Web Developer

0개의 댓글