
CREATE VIEW view_name AS
SELECT column1, column2
FROM table_name
WHERE condition;
CREATE VIEW active_users AS
SELECT id, name, email
FROM users
WHERE is_active = true;
이제 active_users는 테이블처럼 쿼리할 수 있어요:
SELECT * FROM active_users;
-- 복잡한 조인을 VIEW로 만들어두면
CREATE VIEW user_orders AS
SELECT u.id, u.name, o.order_id, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;
-- 이후에는 단순하게 조회 가능
SELECT * FROM user_orders WHERE amount > 100;
CREATE VIEW public_users AS
SELECT id, name
FROM users;
CREATE OR REPLACE VIEW view_name AS
SELECT ...
GRANT SELECT ON public_users TO readonly_user;
DROP VIEW view_name;
| 주의점 | 설명 |
|---|---|
| 성능 | 복잡한 뷰를 중첩해서 사용하면 성능 저하 가능 |
| 비업데이트 가능 뷰 | 대부분의 뷰는 INSERT, UPDATE 불가 |
| 수정이 잦은 경우 | CREATE OR REPLACE VIEW로 덮어쓰기 권장 |
| 물리 저장 X | 뷰 자체는 데이터를 저장하지 않음 |
CREATE VIEW daily_signups AS
SELECT DATE(created_at) AS signup_date, COUNT(*) AS user_count
FROM users
GROUP BY DATE(created_at);
-- 최근 일주일 가입자 추이 확인
SELECT * FROM daily_signups
WHERE signup_date >= CURRENT_DATE - INTERVAL '7 days';