특정 단어가 포함된 데이터를 검색할 때 사용하는 문법입니다.
-- 정확히 일치하는 경우
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 '__소파';
% 기호를 많이 사용하면 인덱스 활용이 어려워 속도가 느려질 수 있음=, >, < 등의 연산자 우선 사용 권장-- '소파' 또는 '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';
숫자 데이터의 통계를 계산할 때 사용하는 함수들입니다.
-- 최댓값
SELECT MAX(사용금액) FROM card;
-- 최솟값
SELECT MIN(사용금액) FROM card;
-- 평균값
SELECT AVG(연체횟수) FROM card;
-- 합계
SELECT SUM(사용금액) FROM card;
-- 개수 (행의 수)
SELECT COUNT(사용금액) FROM card;
SELECT COUNT(*) FROM card; -- 같은 결과
-- 컬럼명을 더 읽기 쉽게 변경
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;
중복을 제거한 후 집계를 수행할 수 있습니다.
-- 중복 제거 후 출력
SELECT DISTINCT 연체횟수 FROM card;
-- 중복 제거 후 평균 계산
SELECT AVG(DISTINCT 연체횟수) FROM card;
큰 데이터셋에서 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;
여러 문자열을 연결하여 하나로 만드는 함수입니다.
-- 고객명과 등급 합치기
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. 데이터 검증: 함수 적용 전후 결과를 반드시 확인하여 의도한 대로 작동하는지 검증