Search

PostgreSQL 문법

기초

데이터 넣기(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
복사