A view lets you save a query as a virtual table. It helps you reuse complex queries easily without rewriting them.
You want to simplify complex queries for others to use.
You need to show only specific columns or rows from a table.
You want to hide sensitive data from users.
You want to organize data in a way that fits your reports.
You want to reuse the same query logic in multiple places.
Syntax
PostgreSQL
CREATEVIEW view_name ASSELECT column1, column2, ...
FROM table_name
WHERE condition;
The view_name is the name you give to your virtual table.
The SELECT statement defines what data the view will show.
Examples
This view shows only active customers with their id, name, and email.
PostgreSQL
CREATEVIEW active_customers ASSELECT id, name, email
FROM customers
WHERE active = true;
This view shows product IDs and their prices from the products table.
PostgreSQL
CREATEVIEW product_prices ASSELECT product_id, price
FROM products;
This view shows orders placed in the last 30 days.
PostgreSQL
CREATEVIEW recent_orders ASSELECT order_id, customer_id, order_date
FROM orders
WHERE order_date > CURRENT_DATE - INTERVAL '30 days';
Sample Program
This example creates an employees table, adds some data, then creates a view called sales_team that shows only employees in the Sales department. Finally, it selects all rows from the view.
PostgreSQL
CREATETABLE employees (
id SERIALPRIMARYKEY,
name VARCHAR(100),
department VARCHAR(50),
salary NUMERIC
);
INSERTINTO employees (name, department, salary) VALUES
('Alice', 'Sales', 50000),
('Bob', 'HR', 45000),
('Charlie', 'Sales', 55000);
CREATEVIEW sales_team ASSELECT id, name, salary
FROM employees
WHERE department = 'Sales';
SELECT * FROM sales_team;
OutputSuccess
Important Notes
Views do not store data themselves; they run the saved query each time you use them.
You can update data through views only if they are simple enough (like selecting from one table without joins).
Use views to improve security by showing only needed data.
Summary
CREATE VIEW saves a SELECT query as a virtual table.
Views help simplify and reuse queries.
Views show data dynamically based on the underlying tables.
Practice
(1/5)
1. What is the main purpose of using CREATE VIEW in PostgreSQL?
easy
A. To delete rows from a table
B. To save a SELECT query as a virtual table for easy reuse
C. To permanently store data in a new table
D. To create an index on a table column
Solution
Step 1: Understand what a view is
A view is a virtual table that stores a SELECT query, not actual data.
Step 2: Identify the purpose of CREATE VIEW
CREATE VIEW saves the SELECT query so you can reuse it easily without rewriting it.
Final Answer:
To save a SELECT query as a virtual table for easy reuse -> Option B
Quick Check:
CREATE VIEW = virtual table for queries [OK]
Hint: Views save SELECT queries as virtual tables [OK]
Common Mistakes:
Thinking views store data permanently
Confusing views with tables
Using CREATE VIEW to delete data
2. Which of the following is the correct syntax to create a view named active_users showing users with status = 'active'?
easy
A. CREATE VIEW active_users AS SELECT * FROM users WHERE status = 'active';
B. CREATE active_users VIEW AS SELECT * FROM users WHERE status = 'active';
C. VIEW CREATE active_users AS SELECT * FROM users WHERE status = 'active';
D. CREATE VIEW active_users SELECT * FROM users WHERE status = 'active';
Solution
Step 1: Recall the correct CREATE VIEW syntax
The syntax is: CREATE VIEW view_name AS SELECT ...
Step 2: Match the syntax with options
CREATE VIEW active_users AS SELECT * FROM users WHERE status = 'active'; matches the correct syntax exactly.
Final Answer:
CREATE VIEW active_users AS SELECT * FROM users WHERE status = 'active'; -> Option A
Quick Check:
CREATE VIEW view_name AS SELECT ... [OK]
Hint: Syntax is CREATE VIEW name AS SELECT ... [OK]
Common Mistakes:
Swapping CREATE and VIEW keywords
Omitting AS keyword
Missing semicolon at the end
3. Given the table orders with columns order_id, customer_id, and amount, what will be the result of this view?
CREATE VIEW big_orders AS SELECT order_id, amount FROM orders WHERE amount > 100;
What rows will SELECT * FROM big_orders; return?
medium
A. No rows, syntax error in view
B. All orders with amount less than or equal to 100
C. All orders regardless of amount
D. All orders with amount greater than 100
Solution
Step 1: Analyze the SELECT query inside the view
The view selects order_id and amount from orders where amount is greater than 100.
Step 2: Understand what SELECT * FROM big_orders returns
It returns all rows from the view, which are orders with amount > 100.
Final Answer:
All orders with amount greater than 100 -> Option D
Quick Check:
View filters orders with amount > 100 [OK]
Hint: View returns rows matching its SELECT query condition [OK]
Common Mistakes:
Confusing greater than with less than
Expecting all columns instead of selected ones
Assuming syntax error without checking carefully
4. Identify the error in this CREATE VIEW statement:
CREATE VIEW recent_customers AS SELECT id, name FROM customers WHERE;
medium
A. Missing condition after WHERE keyword
B. Missing AS keyword before SELECT
C. View name cannot be recent_customers
D. SELECT must include all columns
Solution
Step 1: Check the syntax after WHERE
The WHERE clause is incomplete; it must have a condition after WHERE.
Step 2: Verify other parts of the statement
AS keyword is present, view name is valid, and SELECT columns are allowed to be partial.
Final Answer:
Missing condition after WHERE keyword -> Option A
Quick Check:
WHERE must have a condition [OK]
Hint: WHERE clause must have a condition [OK]
Common Mistakes:
Leaving WHERE empty
Forgetting AS keyword
Thinking view names have restrictions
5. You want to create a view customer_orders that shows each customer's name and the total amount they spent. Which of these is the correct way to create this view assuming tables customers(id, name) and orders(customer_id, amount)?
hard
A. CREATE VIEW customer_orders AS SELECT c.name, o.amount FROM customers c, orders o WHERE c.id = o.customer_id;
B. CREATE VIEW customer_orders AS SELECT name, amount FROM customers JOIN orders ON id = customer_id;
C. CREATE VIEW customer_orders AS SELECT c.name, SUM(o.amount) FROM customers c JOIN orders o ON c.id = o.customer_id GROUP BY c.name;
D. CREATE VIEW customer_orders AS SELECT name, SUM(amount) FROM orders GROUP BY name;
Solution
Step 1: Understand the requirement
We need each customer's name and total amount spent, so we must join customers and orders and sum amounts grouped by customer name.
Step 2: Check each option
CREATE VIEW customer_orders AS SELECT c.name, SUM(o.amount) FROM customers c JOIN orders o ON c.id = o.customer_id GROUP BY c.name; correctly joins tables, sums amounts, and groups by customer name. Others miss grouping or join conditions.
Final Answer:
CREATE VIEW customer_orders AS SELECT c.name, SUM(o.amount) FROM customers c JOIN orders o ON c.id = o.customer_id GROUP BY c.name; -> Option C
Quick Check:
Join + SUM + GROUP BY = correct view [OK]
Hint: Use JOIN with GROUP BY and SUM for aggregation views [OK]
Common Mistakes:
Missing GROUP BY when using SUM
Not joining tables properly
Selecting columns not in GROUP BY
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.