📝 SQL LIKE 연산자 정리
📌 1. LIKE 연산자란?
- LIKE 연산자는 특정 패턴과 일치하는 문자열을 찾을 때 사용합니다.
- 주로 WHERE 절과 함께 사용되며, 와일드카드(wildcard) 문자를 활용해 다양한 조건을 지정할 수 있습니다.
📌 2. LIKE 구문의 기본 형태
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 LIKE '패턴';
- 예시:
SELECT name
FROM employees
WHERE name LIKE '김%';
- 결과: 이름이 ‘김’으로 시작하는 직원을 모두 조회
📌 3. LIKE 와일드카드 종류 및 의미
와일드카드 설명 예제 결과
% (퍼센트) | 0개 이상의 문자를 대체 | '김%' | 김으로 시작하는 모든 문자열 (김민수, 김영희 등) |
_ (언더스코어) | 정확히 한 개의 문자를 대체 | '김_수' | 김 + 한 글자 + 수 (김민수, 김진수 등) |
[ ] | 괄호 안의 문자 중 하나와 일치 (MySQL에서는 지원 안됨, SQL Server 등에서 사용) | '김[영민]수' | 김영수 또는 김민수 |
[^ ] | 괄호 안의 문자를 제외 (SQL Server 등에서 사용) | '김[^영]수' | 김영수를 제외한 김민수, 김진수 |
- | 범위 지정 (SQL Server 등에서 사용) | '김[a-z]수' | 김 + 영문자 하나 + 수 |
📌 4. LIKE 패턴 매칭 예제
패턴 의미
LIKE '김%' | '김'으로 시작하는 모든 문자열 |
LIKE '%수' | '수'로 끝나는 모든 문자열 |
LIKE '%민%' | '민'이 포함된 모든 문자열 |
LIKE '_수' | 두 글자인 문자열 중 '수'로 끝나는 것 |
LIKE '김_수' | '김'으로 시작하고 '수'로 끝나는 세 글자 |
LIKE '%[0-9]%' | 숫자가 포함된 모든 문자열 (SQL Server) |
LIKE '%[^a-z]%' | 알파벳 소문자를 제외한 모든 문자열 (SQL Server) |
📚 SQL 날짜 관련 쿼리 및 정리
[예제 18] 2022년에 시작된 프로젝트 조회
SELECT id, name, start_date, end_date, aws_cost
FROM team_projects
WHERE YEAR(start_date) = 2022;
✅ 설명:
- YEAR() 함수는 날짜에서 연도만 추출합니다.
- start_date의 연도가 2022년인 프로젝트만 조회합니다.
- 일반적인 조건식인 start_date < '2023-01-01' 대신 YEAR() 함수를 사용하여 연도를 기준으로 필터링했습니다.
📌 YEAR() 함수란?
- 날짜에서 연도 부분만 추출하는 MySQL의 날짜 함수
- 사용법: YEAR(날짜컬럼) → 예: YEAR('2022-12-31') = 2022
[예제 19] 현재 진행 중인 프로젝트 조회
SELECT id, name, start_date, end_date, aws_cost
FROM team_projects
WHERE CURDATE() BETWEEN start_date AND end_date;
✅ 설명:
- CURDATE()는 현재 날짜를 반환합니다.
- BETWEEN은 범위 조건으로 start_date와 end_date 사이에 현재 날짜(CURDATE())가 포함된 경우를 찾습니다.
- 하드코딩 없이 CURDATE()를 사용해 언제 실행해도 최신 기준으로 조회할 수 있습니다.
📌 CURDATE() 함수란?
- 현재 날짜(Current Date)를 반환하는 MySQL 함수 (형식: 'YYYY-MM-DD')
- 사용법: CURDATE() → 예: 오늘이 2025년 2월 13일이면 '2025-02-13'
📌 BETWEEN 연산자란?
- 범위 내의 값을 검색할 때 사용하며 시작 값과 끝 값 포함
- 사용법: 컬럼명 BETWEEN 시작값 AND 끝값
- 동일한 쿼리의 다른 형태:
- WHERE CURDATE() >= start_date AND CURDATE() <= end_date;
[예제 20] 프로젝트 지속 기간(일수) 계산
SELECT name,
DATEDIFF(end_date, start_date) AS working_days
FROM team_projects;
✅ 설명:
- DATEDIFF() 함수는 두 날짜 간의 일 수 차이를 반환합니다.
- end_date에서 start_date를 빼서 프로젝트의 지속 기간(일수)을 계산했습니다.
- AS working_days는 결과 컬럼명을 ‘working_days’로 별칭(alias) 설정했습니다.
📌 DATEDIFF() 함수란?
- 두 날짜 간의 일 수 차이를 계산하는 MySQL 함수
- 사용법: DATEDIFF(종료일, 시작일) → DATEDIFF('2025-02-20', '2025-02-10') = 10
📝 2. 관련 SQL 날짜 함수 정리
함수 설명 예제 및 결과
CURDATE() | 현재 날짜 반환 (YYYY-MM-DD) | CURDATE() → '2025-02-13' |
NOW() | 현재 날짜 및 시간 반환 (YYYY-MM-DD HH:MM:SS) | NOW() → '2025-02-13 15:34:21' |
YEAR() | 연도(4자리) 추출 | YEAR('2025-02-13') → 2025 |
MONTH() | 월(1~12) 추출 | MONTH('2025-02-13') → 2 |
DAY() | 일(1~31) 추출 | DAY('2025-02-13') → 13 |
DATE() | 날짜 부분만 반환 | DATE('2025-02-13 15:34:21') → '2025-02-13' |
DATEDIFF() | 두 날짜 간의 차이(일수) 반환 | DATEDIFF('2025-02-20','2025-02-10') → 10 |
TIMESTAMPDIFF() | 두 날짜 간의 차이(단위 지정 가능) | TIMESTAMPDIFF(HOUR,'2025-02-10 12:00','2025-02-11 12:00') → 24 |
DATE_FORMAT() | 날짜 포맷 변환 | DATE_FORMAT(NOW(), '%Y-%m-%d') → '2025-02-13' |
📝 3. SQL 날짜 관련 자주 쓰는 패턴 정리
목적 쿼리 예제
오늘 날짜 조회 | SELECT CURDATE(); |
현재 날짜 및 시간 조회 | SELECT NOW(); |
특정 날짜의 연도 추출 | SELECT YEAR('2025-02-13'); |
이번 주 월요일부터 금요일까지 조회 | WHERE WEEKDAY(CURDATE()) BETWEEN 0 AND 4; |
특정 기간 내 데이터 필터링 | WHERE order_date BETWEEN '2025-01-01' AND '2025-12-31'; |
최근 7일간 데이터 조회 | WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY); |
특정 날짜 이후의 데이터 조회 | WHERE join_date > DATE('2024-12-31'); |
월별 집계 | GROUP BY MONTH(order_date); |
연도별 집계 | GROUP BY YEAR(order_date); |
주별 집계 | GROUP BY WEEK(order_date); |
📚 SQL 고급 쿼리 및 윈도우 함수(Window Function) 정리
[예제 21] 유저의 레이팅 순위 계산 (RANK)
SELECT
name,
rating,
RANK() OVER (ORDER BY rating DESC) AS lol_rank
FROM lol_users;
✅ 설명:
- RANK() OVER (ORDER BY rating DESC)를 사용해 레이팅(rating) 기준으로 유저 순위를 매겼습니다.
- ORDER BY rating DESC: 레이팅이 높은 순서부터 순위를 매김
- OVER() 구문은 **윈도우 함수(Window Function)**를 적용하는 부분을 정의합니다.
📌 RANK() 함수란?
- 순위를 반환하는 윈도우 함수입니다.
- 동일한 값이 있으면 같은 순위를 주고, 그다음 순위는 건너뛰는 특징이 있습니다.
🧩 RANK()와 다른 순위 함수 비교:
함수 설명
RANK() | 동일 순위 시 다음 순위는 건너뜀 (1,2,2,4) |
DENSE_RANK() | 동일 순위 시 연속된 다음 순위를 부여 (1,2,2,3) |
ROW_NUMBER() | 동일 순위와 상관없이 고유한 연속 번호 부여 (1,2,3,4) |
[예제 22] 가장 늦게 게임을 시작한 유저 조회
SELECT
name
FROM lol_users
ORDER BY join_date DESC
LIMIT 1;
✅ 설명:
- ORDER BY join_date DESC: 가입일(join_date) 기준으로 최신순으로 정렬
- LIMIT 1: 가장 최신 가입자 1명만 출력
- 매우 자주 사용되는 최대/최소값 조회 패턴입니다.
[예제 23] 지역별 유저 레이팅 정렬
SELECT
id,
name,
region,
rating,
join_date
FROM lol_users
ORDER BY region, rating DESC;
✅ 설명:
- ORDER BY region, rating DESC:
- region별로 그룹화
- 같은 지역 내에서는 rating 높은 순으로 정렬
- ORDER BY는 쉼표(,)를 기준으로 다중 정렬을 지원합니다.
- 첫 번째 기준: region (오름차순 기본)
- 두 번째 기준: rating (내림차순)
[예제 24] 지역별 평균 레이팅 계산
SELECT
region,
AVG(rating) AS avg_rating
FROM lol_users
GROUP BY region;
✅ 설명:
- GROUP BY region: 지역별로 그룹화
- AVG(rating): 그룹별 평균 레이팅 계산
- AS avg_rating: 결과 컬럼명 별칭(alias) 부여
- GROUP BY는 집계 함수(AVG, COUNT, SUM, MAX, MIN)와 함께 사용됩니다.
📝 관련 SQL 이론 및 함수 정리
📌 1. ORDER BY (정렬)
- 결과를 특정 컬럼 기준으로 정렬할 때 사용
- 여러 개의 컬럼을 기준으로 정렬할 수도 있습니다.
기본 문법:
SELECT *
FROM 테이블명
ORDER BY 컬럼명 [ASC|DESC];
구문 설명
ASC (Default) | 오름차순 정렬 (작은 값 → 큰 값) |
DESC | 내림차순 정렬 (큰 값 → 작은 값) |
📌 2. GROUP BY (그룹화)
- 데이터를 특정 컬럼을 기준으로 묶어서 집계할 때 사용
- 집계 함수(COUNT, SUM, AVG, MAX, MIN)와 함께 사용합니다.
기본 문법:
SELECT 컬럼명, 집계함수(컬럼명)
FROM 테이블명
GROUP BY 컬럼명;
집계 함수 설명
COUNT() | 데이터 개수 |
SUM() | 합계 |
AVG() | 평균 |
MAX() | 최댓값 |
MIN() | 최솟값 |
📌 3. 윈도우 함수(Window Functions)
- 일반적인 집계 함수와 달리, 결과 집합의 각 행에 대해 계산을 수행하지만 행을 그룹으로 축소하지 않고 모든 행을 유지합니다.
- OVER() 구문을 반드시 사용하며, 정렬(PARTITION BY, ORDER BY) 등과 함께 사용합니다.
윈도우 함수 종류 설명
RANK() | 동일 값은 동일 순위, 다음 순위는 건너뜀 (1,2,2,4) |
DENSE_RANK() | 동일 값은 동일 순위, 다음 순위는 연속됨 (1,2,2,3) |
ROW_NUMBER() | 동일 값과 관계없이 고유 번호 부여 (1,2,3,4) |
SUM() | 누적합 계산 |
AVG() | 누적평균 계산 |
COUNT() | 누적 카운트 계산 |
📌 4. LIMIT (결과 수 제한)
- 조회 결과의 개수를 제한할 때 사용
- 주로 ORDER BY와 함께 사용해 상위/하위 N개 데이터를 추출할 때 유용
기본 문법:
SELECT 컬럼명
FROM 테이블명
ORDER BY 컬럼명
LIMIT 개수;
예제:
-- 상위 3개 레이팅 조회
SELECT name, rating
FROM lol_users
ORDER BY rating DESC
LIMIT 3;
📌 5. AVG() (평균)
- 지정한 컬럼의 평균값을 계산합니다.
- 주로 GROUP BY와 함께 사용되어 그룹별 평균을 구할 때 자주 사용됩니다.
기본 문법:
SELECT AVG(컬럼명)
FROM 테이블명;
예제:
-- 지역별 평균 레이팅 조회
SELECT region, AVG(rating) AS avg_rating
FROM lol_users
GROUP BY region;
'TIL' 카테고리의 다른 글
[Java] KioskProject 기본과제 (0) | 2025.03.12 |
---|