psql -U username -d database | 데이터베이스 연결 |
psql -h host -p 5432 -U user -d db | 호스트/포트로 연결 |
psql "postgresql://user:pass@host:5432/db" | URI로 연결 |
\q | psql 종료 |
\c dbname | 다른 데이터베이스 연결 |
\password | 비밀번호 변경 |
\l | 데이터베이스 나열 |
\dt | 테이블 나열 |
\dt+ | 크기와 함께 테이블 나열 |
\d tablename | 테이블 설명 |
\d+ tablename | 상세 테이블 설명 |
\dn | 스키마 나열 |
\di | 인덱스 나열 |
\dv | 뷰 나열 |
\df | 함수 나열 |
\du | 사용자/역할 나열 |
\x | 확장 표시 전환 |
\timing | 쿼리 타이밍 전환 |
SELECT * FROM table_name; | 모든 컬럼 선택 |
SELECT col1, col2 FROM table WHERE condition; | 조건으로 선택 |
SELECT DISTINCT column FROM table; | 고유 값 선택 |
SELECT * FROM table ORDER BY col ASC/DESC; | 결과 정렬 |
SELECT * FROM table LIMIT 10 OFFSET 20; | 페이지네이션 |
SELECT * FROM table WHERE col LIKE '%pattern%'; | 패턴 매칭 |
SELECT * FROM table WHERE col ILIKE '%pattern%'; | 대소문자 무시 LIKE |
SELECT * FROM table WHERE col IN (1, 2, 3); | IN 절 |
SELECT * FROM table WHERE col BETWEEN 1 AND 10; | BETWEEN 범위 |
SELECT * FROM table WHERE col IS NULL; | NULL 확인 |
SELECT COUNT(*) FROM table; | 행 수 세기 |
SELECT SUM(column) FROM table; | 값 합계 |
SELECT AVG(column) FROM table; | 평균 값 |
SELECT MIN(column), MAX(column) FROM table; | 최소 및 최대 |
SELECT category, COUNT(*) FROM table GROUP BY category; | 그룹화 |
SELECT category, COUNT(*) FROM table GROUP BY category HAVING COUNT(*) > 5; | 필터가 있는 그룹 |
SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id; | 내부 조인 |
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.t1_id; | 왼쪽 외부 조인 |
SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.t1_id; | 오른쪽 외부 조인 |
SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.id = t2.t1_id; | 완전 외부 조인 |
SELECT * FROM t1 CROSS JOIN t2; | 교차 조인 (카테시안) |
SELECT * FROM t1 JOIN t2 USING (common_col); | 공통 컬럼으로 조인 |
SELECT * FROM t1 NATURAL JOIN t2; | 자연 조인 |
INSERT INTO table (col1, col2) VALUES ('val1', 'val2'); | 단일 행 삽입 |
INSERT INTO table (col1, col2) VALUES ('a', 1), ('b', 2); | 여러 행 삽입 |
INSERT INTO table (col1, col2) VALUES ('val', 'val')
RETURNING *; | 삽입 후 반환 |
INSERT INTO t1 SELECT * FROM t2 WHERE condition; | select로 삽입 |
INSERT INTO table (col1) VALUES ('val')
ON CONFLICT (col1) DO NOTHING; | 삽입 또는 무시 |
INSERT INTO table (col1, col2) VALUES ('val1', 1)
ON CONFLICT (col1) DO UPDATE SET col2 = EXCLUDED.col2; | 업서트 |
UPDATE table SET col1 = 'value' WHERE condition; | 행 업데이트 |
UPDATE table SET col1 = 'val1', col2 = 'val2' WHERE id = 1; | 여러 컬럼 업데이트 |
UPDATE t1 SET col = t2.val FROM t2 WHERE t1.id = t2.id; | 다른 테이블에서 업데이트 |
UPDATE table SET col = col + 1 WHERE id = 1 RETURNING *; | 업데이트 후 반환 |
DELETE FROM table WHERE condition; | 행 삭제 |
DELETE FROM table WHERE id IN (SELECT id FROM t2); | 서브쿼리로 삭제 |
TRUNCATE TABLE table_name; | 모든 행 삭제 (빠름) |
TRUNCATE TABLE table_name RESTART IDENTITY; | 잘라내기 및 시퀀스 재설정 |
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
); | 컬럼이 있는 테이블 생성 |
CREATE TABLE IF NOT EXISTS table_name (...); | 존재하지 않으면 생성 |
CREATE TABLE child (
id SERIAL PRIMARY KEY,
parent_id INT REFERENCES parent(id) ON DELETE CASCADE
); | 외래 키 제약 |
CREATE TABLE t (CHECK (col > 0)); | 체크 제약 |
ALTER TABLE t ADD COLUMN col VARCHAR(50); | 컬럼 추가 |
ALTER TABLE t DROP COLUMN col; | 컬럼 삭제 |
ALTER TABLE t ALTER COLUMN col TYPE INTEGER; | 컬럼 타입 변경 |
ALTER TABLE t ALTER COLUMN col SET NOT NULL; | NOT NULL 추가 |
ALTER TABLE t ALTER COLUMN col SET DEFAULT value; | 기본값 설정 |
ALTER TABLE t RENAME COLUMN old TO new; | 컬럼 이름 변경 |
ALTER TABLE old_name RENAME TO new_name; | 테이블 이름 변경 |
DROP TABLE table_name; | 테이블 삭제 |
DROP TABLE IF EXISTS table_name CASCADE; | 의존성과 함께 삭제 |
CREATE INDEX idx_name ON table(column); | 인덱스 생성 |
CREATE UNIQUE INDEX idx ON table(col); | 유니크 인덱스 생성 |
CREATE INDEX idx ON table(col1, col2); | 복합 인덱스 |
CREATE INDEX idx ON table(col) WHERE condition; | 부분 인덱스 |
CREATE INDEX CONCURRENTLY idx ON table(col); | 비차단 인덱스 |
DROP INDEX index_name; | 인덱스 삭제 |
REINDEX TABLE table_name; | 인덱스 재구성 |
SELECT col, ROW_NUMBER() OVER (ORDER BY col) FROM t; | 행 번호 |
SELECT col, RANK() OVER (PARTITION BY cat ORDER BY val DESC) FROM t; | 파티션 내 순위 |
SELECT col, LAG(col) OVER (ORDER BY date) FROM t; | 이전 행 값 |
SELECT col, LEAD(col) OVER (ORDER BY date) FROM t; | 다음 행 값 |
SELECT col, SUM(val) OVER (ORDER BY date) AS running_total FROM t; | 누계 |
SELECT col, AVG(val) OVER (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) FROM t; | 이동 평균 |
WITH cte AS (
SELECT * FROM table WHERE condition
)
SELECT * FROM cte; | 공통 테이블 표현식 |
WITH RECURSIVE tree AS (
SELECT id, parent_id, name FROM t WHERE parent_id IS NULL
UNION ALL
SELECT t.id, t.parent_id, t.name FROM t
JOIN tree ON t.parent_id = tree.id
)
SELECT * FROM tree; | 재귀 CTE |
SELECT * FROM (SELECT * FROM t WHERE col > 5) AS subq; | 파생 테이블 |
SELECT * FROM t WHERE col IN (SELECT col FROM t2); | WHERE의 서브쿼리 |
SELECT data->'key' FROM table; | JSON 필드 가져오기 (JSON) |
SELECT data->>'key' FROM table; | JSON 필드 가져오기 (텍스트) |
SELECT data#>'{nested,key}' FROM table; | 중첩 JSON 경로 가져오기 |
SELECT * FROM t WHERE data @> '{"key": "val"}'; | JSON 포함 |
SELECT jsonb_agg(column) FROM table; | JSON 배열로 집계 |
SELECT * FROM jsonb_each('{"a":1,"b":2}'); | JSON 객체 확장 |
BEGIN;
UPDATE ... ;
COMMIT; | 기본 트랜잭션 |
BEGIN;
UPDATE ... ;
ROLLBACK; | 트랜잭션 롤백 |
BEGIN;
SAVEPOINT sp1;
UPDATE ... ;
ROLLBACK TO sp1;
COMMIT; | 세이브포인트 |
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; | 격리 수준 설정 |
CREATE USER username WITH PASSWORD 'pass'; | 사용자 생성 |
CREATE ROLE rolename; | 역할 생성 |
GRANT SELECT, INSERT ON table TO user; | 권한 부여 |
GRANT ALL PRIVILEGES ON DATABASE db TO user; | 데이터베이스 전체 권한 부여 |
REVOKE INSERT ON table FROM user; | 권한 취소 |
ALTER USER username WITH PASSWORD 'newpass'; | 비밀번호 변경 |
DROP USER username; | 사용자 삭제 |
pg_dump dbname > backup.sql | 데이터베이스 백업 |
pg_dump -Fc dbname > backup.dump | 커스텀 형식 백업 |
pg_dump -t table dbname > table.sql | 단일 테이블 백업 |
pg_dumpall > all_dbs.sql | 모든 데이터베이스 백업 |
psql dbname < backup.sql | SQL에서 복원 |
pg_restore -d dbname backup.dump | 덤프에서 복원 |
EXPLAIN SELECT * FROM table; | 쿼리 계획 표시 |
EXPLAIN ANALYZE SELECT * FROM table; | 실행 및 타이밍 표시 |
VACUUM table_name; | 스토리지 회수 |
VACUUM ANALYZE table_name; | Vacuum 및 통계 업데이트 |
ANALYZE table_name; | 통계 업데이트 |
SELECT pg_size_pretty(pg_database_size('dbname')); | 데이터베이스 크기 |
SELECT pg_size_pretty(pg_table_size('table')); | 테이블 크기 |