Bird
Raised Fist0
PostgreSQLquery~20 mins

Why views matter in PostgreSQL - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
PostgreSQL Views Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
Output of a simple view query
Given a table employees with columns id, name, and salary, and a view high_earners defined as CREATE VIEW high_earners AS SELECT name, salary FROM employees WHERE salary > 50000;, what will be the output of SELECT * FROM high_earners; if the table contains:

id | name | salary
1 | Alice | 60000
2 | Bob | 45000
3 | Carol | 70000
PostgreSQL
CREATE TABLE employees (id INT, name TEXT, salary INT);
INSERT INTO employees VALUES (1, 'Alice', 60000), (2, 'Bob', 45000), (3, 'Carol', 70000);
CREATE VIEW high_earners AS SELECT name, salary FROM employees WHERE salary > 50000;
SELECT * FROM high_earners;
A[{"id": 1, "name": "Alice", "salary": 60000}, {"id": 3, "name": "Carol", "salary": 70000}]
B[]
C[{"name": "Bob", "salary": 45000}]
D[{"name": "Alice", "salary": 60000}, {"name": "Carol", "salary": 70000}]
Attempts:
2 left
💡 Hint
Remember the view filters employees with salary greater than 50000.
🧠 Conceptual
intermediate
1:30remaining
Why use views for security?
Why are views useful for controlling access to sensitive data in PostgreSQL?
AViews prevent users from running any queries on the database.
BViews automatically encrypt data to protect it from unauthorized access.
CViews can restrict which columns and rows users see without giving direct access to the base tables.
DViews delete sensitive data after a set time to protect privacy.
Attempts:
2 left
💡 Hint
Think about how views can limit what data is visible.
📝 Syntax
advanced
2:00remaining
Identify the correct syntax to create a view with a join
Which option correctly creates a view named employee_departments that shows employee names and their department names from tables employees (columns: id, name, dept_id) and departments (columns: id, dept_name)?
ACREATE VIEW employee_departments AS SELECT employees.name, departments.dept_name FROM employees JOIN departments ON employees.dept_id = departments.id;
BCREATE VIEW employee_departments SELECT employees.name, departments.dept_name FROM employees INNER JOIN departments WHERE employees.dept_id = departments.id;
CCREATE employee_departments VIEW AS SELECT name, dept_name FROM employees, departments WHERE employees.dept_id = departments.id;
DVIEW employee_departments AS SELECT employees.name, departments.dept_name FROM employees JOIN departments ON employees.dept_id = departments.id;
Attempts:
2 left
💡 Hint
Remember the correct order: CREATE VIEW view_name AS SELECT ...
❓ optimization
advanced
1:30remaining
Performance impact of materialized views
What is the main advantage of using a materialized view instead of a regular view in PostgreSQL?
AMaterialized views allow users to write data back to the base tables through the view.
BMaterialized views store the query result physically, improving query speed at the cost of needing manual refresh.
CMaterialized views compress data to save disk space compared to regular views.
DMaterialized views automatically update in real-time without any performance cost.
Attempts:
2 left
💡 Hint
Think about how storing results affects query speed and freshness.
🔧 Debug
expert
2:30remaining
Why does this view fail to update?
Consider a view employee_info created as CREATE VIEW employee_info AS SELECT id, name, salary * 1.1 AS adjusted_salary FROM employees;. When trying to run UPDATE employee_info SET adjusted_salary = 70000 WHERE id = 1;, it fails. Why?
ABecause the view contains a computed column, PostgreSQL cannot update it directly without an INSTEAD OF trigger.
BBecause the view does not include the primary key column.
CBecause views cannot be queried, only updated.
DBecause the UPDATE statement syntax is incorrect for views.
Attempts:
2 left
💡 Hint
Think about what happens when a view has columns calculated from expressions.

Practice

(1/5)
1. What is the main purpose of using a VIEW in PostgreSQL?
easy
A. To save a complex query as a reusable object
B. To permanently store data separately from tables
C. To speed up data insertion into tables
D. To delete rows from multiple tables at once

Solution

  1. Step 1: Understand what a VIEW is

    A VIEW in PostgreSQL is a saved SQL query that acts like a virtual table.
  2. Step 2: Identify the main use of a VIEW

    It simplifies complex queries by letting you reuse them without rewriting.
  3. Final Answer:

    To save a complex query as a reusable object -> Option A
  4. Quick Check:

    Views simplify queries = A [OK]
Hint: Views store queries, not data, for easy reuse [OK]
Common Mistakes:
  • Thinking views store data separately
  • Confusing views with tables
  • Assuming views speed up inserts
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

  1. Step 1: Recall the correct CREATE VIEW syntax

    The syntax is: CREATE VIEW view_name AS SELECT ...
  2. Step 2: Match the syntax with options

    CREATE VIEW active_users AS SELECT * FROM users WHERE status = 'active'; matches the correct syntax exactly.
  3. Final Answer:

    CREATE VIEW active_users AS SELECT * FROM users WHERE status = 'active'; -> Option A
  4. Quick Check:

    CREATE VIEW ... AS SELECT ... = B [OK]
Hint: Remember: CREATE VIEW name AS SELECT ... [OK]
Common Mistakes:
  • Swapping keywords CREATE and VIEW
  • Omitting AS keyword
  • Incorrect keyword order
3. Given the table orders with columns id, customer, and amount, what will this view return?
CREATE VIEW big_orders AS SELECT customer, amount FROM orders WHERE amount > 100;

Then running:
SELECT * FROM big_orders;
medium
A. Syntax error because id is missing in view
B. All orders showing id, customer, and amount
C. All orders with amount greater than 100 showing customer and amount
D. Only orders with amount less than or equal to 100

Solution

  1. Step 1: Understand the view definition

    The view selects customer and amount from orders where amount is greater than 100.
  2. Step 2: Predict the SELECT * from the view

    It returns only customer and amount columns for orders with amount > 100.
  3. Final Answer:

    All orders with amount greater than 100 showing customer and amount -> Option C
  4. Quick Check:

    View filters amount > 100 and selects customer, amount = D [OK]
Hint: View columns = selected columns, filtered by WHERE [OK]
Common Mistakes:
  • Expecting all columns to appear
  • Confusing filter condition direction
  • Thinking missing columns cause errors
4. You created a view with:
CREATE VIEW recent_sales AS SELECT * FROM sales WHERE sale_date > CURRENT_DATE - INTERVAL '7 days';

But running SELECT * FROM recent_sales; returns an error. What is the likely cause?
medium
A. CURRENT_DATE cannot be used in a view definition
B. The view definition is correct; error is elsewhere
C. The view needs to be refreshed manually to update data
D. The INTERVAL syntax is invalid in the view definition

Solution

  1. Step 1: Check if INTERVAL and CURRENT_DATE are valid

    Both INTERVAL and CURRENT_DATE are valid in PostgreSQL and can be used in views.
  2. Step 2: Understand view behavior

    Views are virtual and always reflect current data; no manual refresh needed.
  3. Final Answer:

    The view definition is correct; error is elsewhere -> Option B
  4. Quick Check:

    Valid syntax means error is not in view code = A [OK]
Hint: Check error source; valid syntax means problem is outside view [OK]
Common Mistakes:
  • Assuming CURRENT_DATE is disallowed in views
  • Thinking views store data needing refresh
  • Blaming INTERVAL syntax without checking error message
5. You want to restrict users to see only active employees' names and departments without exposing salaries. Which approach using views is best?
hard
A. Create a view selecting name, department, and salary for all employees
B. Create a view selecting all columns but filter status = 'active'
C. Create a view selecting only salary and status columns
D. Create a view selecting only name and department from employees where status = 'active'

Solution

  1. Step 1: Identify data to expose

    Only active employees' names and departments should be visible, no salaries.
  2. Step 2: Choose view that filters and limits columns

    Create a view selecting only name and department from employees where status = 'active' selects only needed columns and filters active status, protecting salary data.
  3. Final Answer:

    Create a view selecting only name and department from employees where status = 'active' -> Option D
  4. Quick Check:

    View limits columns and filters rows = C [OK]
Hint: Select only needed columns and filter rows in view [OK]
Common Mistakes:
  • Including salary column exposing sensitive data
  • Not filtering active status
  • Selecting all columns unnecessarily
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