Bird
Raised Fist0
PostgreSQLquery~10 mins

CREATE MATERIALIZED VIEW in PostgreSQL - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create a materialized view named 'sales_summary' that selects all columns from the 'sales' table.

PostgreSQL
CREATE [1] MATERIALIZED VIEW sales_summary AS SELECT * FROM sales;
Drag options to blanks, or click blank then click option'
AMATERIALIZED
BVIEW
CTABLE
DINDEX
Attempts:
3 left
💡 Hint
Common Mistakes
Using just VIEW instead of MATERIALIZED VIEW.
Using TABLE keyword which is for tables, not views.
2fill in blank
medium

Complete the code to refresh the materialized view named 'sales_summary'.

PostgreSQL
REFRESH [1] sales_summary;
Drag options to blanks, or click blank then click option'
AVIEW
BTABLE
CMATERIALIZED VIEW
DINDEX
Attempts:
3 left
💡 Hint
Common Mistakes
Using REFRESH VIEW which is invalid for materialized views.
Using REFRESH TABLE which is not correct syntax.
3fill in blank
hard

Fix the error in the code to create a materialized view that selects the total sales per product from the 'sales' table.

PostgreSQL
CREATE MATERIALIZED VIEW total_sales AS SELECT product_id, SUM(amount) [1] sales GROUP BY product_id;
Drag options to blanks, or click blank then click option'
AWHERE
BFROM
CON
DIN
Attempts:
3 left
💡 Hint
Common Mistakes
Using WHERE instead of FROM before the table name.
Using ON or IN which are not correct here.
4fill in blank
hard

Fill both blanks to create a materialized view named 'top_customers' that selects customer_id and total spent from 'orders' where total spent is greater than 1000.

PostgreSQL
CREATE MATERIALIZED VIEW top_customers AS SELECT customer_id, SUM(amount) [1] orders GROUP BY customer_id [2] SUM(amount) > 1000;
Drag options to blanks, or click blank then click option'
AFROM
BWHERE
CHAVING
DON
Attempts:
3 left
💡 Hint
Common Mistakes
Using WHERE instead of HAVING to filter aggregated sums.
Using ON which is for joins, not filtering.
5fill in blank
hard

Fill all three blanks to create a materialized view named 'recent_orders' that selects order_id, customer_id, and order_date from 'orders' where order_date is within the last 30 days.

PostgreSQL
CREATE MATERIALIZED VIEW recent_orders AS SELECT [1], [2], [3] FROM orders WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';
Drag options to blanks, or click blank then click option'
Aorder_id
Bcustomer_id
Corder_date
Damount
Attempts:
3 left
💡 Hint
Common Mistakes
Selecting columns not related to the order identity or date.
Missing one or more required columns.

Practice

(1/5)
1. What is the main purpose of a CREATE MATERIALIZED VIEW in PostgreSQL?
easy
A. To create a temporary table that disappears after the session
B. To create an index on a table column
C. To define a virtual table that always runs the query on access
D. To store the result of a query physically for faster access

Solution

  1. Step 1: Understand what a materialized view does

    A materialized view stores the result of a query physically, unlike a normal view which runs the query every time.
  2. Step 2: Compare options with this definition

    To store the result of a query physically for faster access matches this behavior exactly. Options A and C describe temporary tables and normal views, not materialized views. To create an index on a table column is unrelated.
  3. Final Answer:

    To store the result of a query physically for faster access -> Option D
  4. Quick Check:

    Materialized view = stored query result [OK]
Hint: Materialized views save query results physically for speed [OK]
Common Mistakes:
  • Confusing materialized views with normal views
  • Thinking materialized views are temporary tables
  • Assuming materialized views auto-update without refresh
2. Which of the following is the correct syntax to create a materialized view named sales_summary from a table sales?
easy
A. CREATE MATERIALIZED VIEW sales_summary AS SELECT * FROM sales;
B. CREATE VIEW MATERIALIZED sales_summary AS SELECT * FROM sales;
C. CREATE MATERIALIZED VIEW sales_summary SELECT * FROM sales;
D. CREATE MATERIALIZED VIEW sales_summary FROM sales;

Solution

  1. Step 1: Recall the correct syntax for creating materialized views

    The correct syntax is: CREATE MATERIALIZED VIEW view_name AS SELECT ...
  2. Step 2: Check each option against this syntax

    CREATE MATERIALIZED VIEW sales_summary AS SELECT * FROM sales; matches exactly. CREATE VIEW MATERIALIZED sales_summary AS SELECT * FROM sales; swaps keywords incorrectly. CREATE MATERIALIZED VIEW sales_summary SELECT * FROM sales; misses the AS keyword. CREATE MATERIALIZED VIEW sales_summary FROM sales; uses FROM instead of AS and SELECT.
  3. Final Answer:

    CREATE MATERIALIZED VIEW sales_summary AS SELECT * FROM sales; -> Option A
  4. Quick Check:

    Syntax = CREATE MATERIALIZED VIEW ... AS SELECT ... [OK]
Hint: Use 'AS SELECT' after materialized view name [OK]
Common Mistakes:
  • Omitting the AS keyword
  • Swapping VIEW and MATERIALIZED keywords
  • Using FROM instead of AS SELECT
3. Given the following commands:
CREATE TABLE products (id INT, price INT);
INSERT INTO products VALUES (1, 100), (2, 200);
CREATE MATERIALIZED VIEW cheap_products AS SELECT * FROM products WHERE price < 150;
SELECT * FROM cheap_products;

What will be the output of the SELECT query?
medium
A. Rows with id=1 and price=100
B. Rows with id=2 and price=200
C. No rows returned
D. Syntax error

Solution

  1. Step 1: Understand the data and materialized view filter

    The table has two rows: (1,100) and (2,200). The materialized view selects rows where price < 150, so only (1,100) qualifies.
  2. Step 2: Query the materialized view

    Since the materialized view stores the filtered rows, selecting from it returns the row with id=1 and price=100.
  3. Final Answer:

    Rows with id=1 and price=100 -> Option A
  4. Quick Check:

    Filter price < 150 = row with id=1 [OK]
Hint: Materialized view stores filtered rows, returns matching data [OK]
Common Mistakes:
  • Expecting all rows instead of filtered ones
  • Confusing materialized view with normal view behavior
  • Assuming syntax error due to multiple commands
4. Consider this SQL:
CREATE MATERIALIZED VIEW recent_orders AS SELECT * FROM orders WHERE order_date > CURRENT_DATE - INTERVAL '7 days';
REFRESH MATERIALIZED VIEW recent_orders;

Which of the following is a common mistake that would cause an error or unexpected behavior?
medium
A. Using REFRESH MATERIALIZED VIEW without CONCURRENTLY
B. Creating the materialized view without a SELECT statement
C. Not refreshing the materialized view after data changes
D. Using CURRENT_DATE in the WHERE clause

Solution

  1. Step 1: Analyze each option for errors

    Not refreshing the materialized view after data changes causes stale data but no error. Using REFRESH MATERIALIZED VIEW without CONCURRENTLY is allowed but locks the view during refresh. Creating the materialized view without a SELECT statement is invalid syntax because materialized views require a SELECT query. Using CURRENT_DATE in the WHERE clause is valid usage.
  2. Step 2: Identify the syntax error

    Creating a materialized view without a SELECT statement causes a syntax error, so Creating the materialized view without a SELECT statement is the mistake causing error.
  3. Final Answer:

    Creating the materialized view without a SELECT statement -> Option B
  4. Quick Check:

    Materialized view requires SELECT query [OK]
Hint: Materialized views must have a SELECT query [OK]
Common Mistakes:
  • Skipping the SELECT query in CREATE MATERIALIZED VIEW
  • Ignoring need to refresh after data changes
  • Assuming REFRESH must use CONCURRENTLY always
5. You have a large table sales_data that updates daily. You want to create a materialized view monthly_summary that shows total sales per month. Which approach correctly creates and maintains this materialized view efficiently?
hard
A. CREATE MATERIALIZED VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; REFRESH MATERIALIZED VIEW monthly_summary;
B. CREATE VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1;
C. CREATE MATERIALIZED VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_summary;
D. CREATE MATERIALIZED VIEW monthly_summary AS SELECT * FROM sales_data; REFRESH MATERIALIZED VIEW monthly_summary;

Solution

  1. Step 1: Understand the goal and data size

    We want a summary per month from a large table that updates daily. Using a materialized view with aggregation is good for performance.
  2. Step 2: Choose the best refresh method

    CREATE MATERIALIZED VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; REFRESH MATERIALIZED VIEW monthly_summary; refreshes but locks the view, blocking reads. CREATE MATERIALIZED VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_summary; uses REFRESH MATERIALIZED VIEW CONCURRENTLY, allowing reads during refresh, which is efficient for large data. CREATE VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; is a normal view, recalculating every time, slow for large data. CREATE MATERIALIZED VIEW monthly_summary AS SELECT * FROM sales_data; REFRESH MATERIALIZED VIEW monthly_summary; stores all raw data, not aggregated, so not efficient.
  3. Final Answer:

    CREATE MATERIALIZED VIEW with aggregation and REFRESH MATERIALIZED VIEW CONCURRENTLY -> Option C
  4. Quick Check:

    Use CONCURRENTLY to refresh without blocking [OK]
Hint: Use CONCURRENTLY to refresh materialized views without locking [OK]
Common Mistakes:
  • Using normal views for large aggregated data
  • Refreshing materialized views without CONCURRENTLY causing locks
  • Creating materialized views without aggregation for summaries
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard