기초
데이터 넣기(INSERT)
-- 기본형
INSERT INTO 테이블명 (컬럼1, 컬럼2) VALUES (값1, 값2);
-- 예시
INSERT INTO metrics (time, service_name, latency)
VALUES (NOW(), 'api-server', 45.2);
SQL
복사
Now() : 지금 시간
데이터 보기(SELECT)
-- 전체 보기
SELECT * FROM metrics;
-- 특정 컬럼만
SELECT service_name, latency FROM metrics;
-- 조건 붙이기
SELECT * FROM metrics WHERE latency > 100;
-- 최신 10개만
SELECT * FROM metrics ORDER BY time DESC LIMIT 10;
SQL
복사
- WHERE : ~인 것만
- ORDER BY : 정렬(DESC=큰→작은, ASC=작은→큰)
- LIMIT: 개수 제한
데이터 수정(UPDATE)
UPDATE 테이블명 SET 컬럼 = 새값 WHERE 조건;
-- 예시
UPDATE metrics SET latency = 50 WHERE service_name = 'api-server';
SQL
복사
데이터 삭제(DELETE)
DELETE FROM 테이블명 WHERE 조건;
-- 예시
DELETE FROM metrics WHERE latency > 1000;
SQL
복사
통계 계산
-- 평균
SELECT AVG(latency) FROM metrics;
-- 개수
SELECT COUNT(*) FROM metrics;
-- 최대값
SELECT MAX(latency) FROM metrics;
-- 그룹별 통계
SELECT service_name, AVG(latency)
FROM metrics
GROUP BY service_name;
SQL
복사
GROUP BY: ~별로 묶어서 계산
시간 조건
-- 최근 1시간
SELECT * FROM metrics
WHERE time > NOW() - INTERVAL '1 hour';
-- 오늘
SELECT * FROM metrics
WHERE time >= CURRENT_DATE;
SQL
복사
INTERVAL: 시간 간격
- '1 hour' = 1시간
- '30 minutes' = 30분
- '7 days' = 7일
즉, 지금부터 1시간 전까지의 모든 데이터를 조회한다는 의미
조건 여러개
-- AND (둘 다 만족)
SELECT * FROM metrics
WHERE latency > 100 AND service_name = 'api-server';
-- OR (하나만 만족)
SELECT * FROM metrics
WHERE latency > 100 OR status_code = 500;
SQL
복사
실전 예시
-- "api-server의 최근 1시간 평균 지연시간"
SELECT AVG(latency)
FROM metrics
WHERE service_name = 'api-server'
AND time > NOW() - INTERVAL '1 hour';
-- "지연시간 높은 순서로 상위 5개"
SELECT service_name, latency, time
FROM metrics
ORDER BY latency DESC
LIMIT 5;
-- "에러 개수 세기"
SELECT COUNT(*)
FROM metrics
WHERE status_code >= 500;
SQL
복사
기본
JOIN(테이블 연결)
여러 테이블을 연결해서 조회
-- 서비스 정보 테이블
CREATE TABLE services (
service_name TEXT PRIMARY KEY,
team TEXT,
slo_target DOUBLE PRECISION
);
-- 메트릭과 서비스 정보 함께 보기
SELECT
m.service_name,
m.latency,
s.team,
s.slo_target
FROM metrics m
JOIN services s ON m.service_name = s.service_name;
SQL
복사
필요 이유:
- SLO 설정 정보와 실제 메트릭 비교
- 서비스별 담당 팀 정보 연결
JOIN의 ON
어떤 기준으로 연결할지 알려주는 조건문 역할
테이블 이름 별칭
FROM metrics m -- metrics를 m이라고 부를게
JOIN services s -- services를 s라고 부를게
-- AS 키워드는 선택 사항:
FROM metrics AS m -- 이것도 가능
FROM metrics m -- 이것도 가능 (더 많이 씀)
SQL
복사
INDEX(성능 최적화)
데이터 검색 속도 향상
-- service_name으로 자주 조회한다면
CREATE INDEX idx_service ON metrics(service_name);
-- 시간 + 서비스로 자주 조회한다면
CREATE INDEX idx_time_service ON metrics(time, service_name);
SQL
복사
예시: 100만 건에서 조회 시간 5초 → 0.1초로 단축
INDEX는 칼럼을 하나 더 생성하는건가?
책 뒷면의 찾아보기 같은 역할
-- INDEX 생성 전
SELECT * FROM metrics WHERE service_name = 'api-server';
-- ↑ 전체 테이블 스캔 (100만 건이면 100만 번 확인)
-- INDEX 생성
CREATE INDEX idx_service ON metrics(service_name);
-- ↑ 내부적으로 "서비스명 목록"을 미리 정리해둠
-- INDEX 생성 후 같은 쿼리
SELECT * FROM metrics WHERE service_name = 'api-server';
-- ↑ INDEX에서 바로 찾음 (몇 번만 확인)
SQL
복사
INDEX의 ON
자주 조회하는 필드에 대해 찾아보기 목록을 생성하도록 하는 역할
-- "service_name으로 자주 조회하니까 빠르게 만들어줘"
CREATE INDEX idx_service ON metrics(service_name);
-- 이제 이 쿼리가 빨라짐!
SELECT * FROM metrics WHERE service_name = 'api-server';
SQL
복사

