SQL VIEWS: Virtual Table Guide

Master database abstraction and storage decoupling: CREATE VIEW, replacing view definitions, updatability rules, WITH CHECK OPTION, DROP VIEW, materialized views, refresh pipelines, and structural trade-offs.

1. What is a View in SQL?

A view is a named, virtual table defined by a stored SQL SELECT statement. Unlike a regular table, a standard view does not store data rows permanently on disk. Instead, the relational database management system (RDBMS) stores only the query definition inside its data dictionary or catalog.

Whenever a client application queries a view, the database engine retrieves the stored query definition, merges it with the caller query, and executes the combined plan against the underlying base tables. Views provide several architectural advantages:

  • Query Simplification: Encapsulates multi-table joins, complex aggregations, and subqueries behind a clean, reusable interface.
  • Security and Access Control: Exposes a subset of rows or columns to specific users while concealing sensitive fields like password hashes, social security numbers, or internal margins.
  • Schema Decoupling: Shields reporting systems and frontend applications from structural database changes, such as table renaming or normalisation refactoring.
  • Consistency: Ensures that all developers and business intelligence analysts compute metrics using identical formulas.

How Query Merging Works

  • Query Rewrite Engine:When you execute SELECT * FROM active_users WHERE country = 'USA', the engine folds the view query into your outer statement.
  • No Intermediate Disk I/O:The optimizer executes a single execution plan directly against the physical base tables.

2. CREATE VIEW

To establish a new view, use the CREATE VIEW statement followed by the desired view name and the AS keyword containing the defining SELECT query.

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

Once created, the view can be queried exactly like any physical relational table, including support for WHERE filtering, ORDER BY sorting, joins to other tables, and aggregation.

Creating and Querying a View

SQL

Encapsulate a multi-table JOIN behind a clean virtual table interface

Best Practices for View Definitions

  • Explicit Column Projections:Avoid SELECT * inside views. Explicit column lists prevent breakage when base tables add or reorder columns.
  • Clear Column Aliases:Assign readable business names to computed expressions and joined keys: d.name AS department_name.

3. CREATE OR REPLACE VIEW

When schema requirements evolve, you may need to modify the projection list or join conditions of an existing view. Dialects such as PostgreSQL, MySQL, and Oracle support the CREATE OR REPLACE VIEW syntax:

CREATE OR REPLACE VIEW view_name AS
SELECT updated_column1, updated_column2, ...
FROM table_name;

This construct updates the view definition in-place without dropping the object, preserving all assigned security permissions and dependent grants.

In databases that do not implement CREATE OR REPLACE VIEW directly (such as SQLite and Microsoft SQL Server), the standard workflow is to drop the existing view conditionally before creating the replacement definition:

Replacing a View Definition

SQL

Safely update a stored view schema using conditional drop and recreation

Column Preservation Rules

  • Type Compatibility:Some engines (like PostgreSQL) require replacement views to preserve existing column positions and data types.
  • Adding Columns:New columns can be appended to the end of the SELECT list, but altering existing column names requires dropping the view.

4. Updating Data Through a View (Updatable Views)

An updatable view allows clients to execute INSERT, UPDATE, and DELETE statements directly against the view. The database engine translates these modifications into changes on the underlying base tables.

To qualify as directly updatable, a view must satisfy strict relational rules:

  • The view must reference exactly one underlying base table in its FROM clause.
  • The SELECT statement must not contain DISTINCT, GROUP BY, HAVING, or UNION.
  • The projection must not rely on window functions or aggregate calculations (such as SUM or AVG).
  • For INSERT operations, any base table column omitted from the view must either be nullable or have a DEFAULT value defined.

Modifying Base Table Records via View

SQL

Execute an UPDATE statement through a simple single-table view

WITH CHECK OPTION

  • Preventing Orphaned Rows:Without this clause, a user could update a row such that it no longer meets the view WHERE filter, making it vanish from view.
  • Constraint Enforcement:Appending WITH CHECK OPTION forces the engine to reject any INSERT or UPDATE that violates the view WHERE clause.
  • INSTEAD OF Triggers:For complex multi-table views, write INSTEAD OF triggers to define custom mutation logic for INSERT, UPDATE, and DELETE.

5. DROP VIEW

When a view is no longer required, remove its definition from the data catalog using the DROP VIEW statement. Dropping a view only removes its virtual definition; no data is deleted from the physical base tables.

DROP VIEW [IF EXISTS] view_name [CASCADE | RESTRICT];

Dropping a View Definition

SQL

Safely delete a virtual table without altering physical table records

Cascade vs Restrict Semantics

  • RESTRICT (Default):Aborts the drop operation if other views or procedures depend on this view.
  • CASCADE:Automatically drops all dependent views and foreign objects that reference the targeted view.
  • Base Table Safety:Dropping a view never deletes rows or drops columns from the underlying physical storage.

6. Materialized View

A materialized view is a database object that stores the actual physical results of its defining query on disk, rather than just the query string.

When an application reads from a standard view, the query executes from scratch every single time. For high-volume reporting dashboards, data warehouses, and queries joining millions of rows, re-executing aggregations on every page load causes severe server contention. Materialized views solve this problem by caching calculated outputs in advance.

-- PostgreSQL / Oracle syntax
CREATE MATERIALIZED VIEW monthly_sales_summary AS
SELECT
    DATE_TRUNC('month', order_date) AS sale_month,
    COUNT(id) AS total_orders,
    SUM(total_amount) AS revenue
FROM orders
GROUP BY DATE_TRUNC('month', order_date);

Refresh Strategies for Materialized Views

  • Manual Refresh:REFRESH MATERIALIZED VIEW monthly_sales_summary re-evaluates the query and updates stored data.
  • Concurrent Refresh:REFRESH MATERIALIZED VIEW CONCURRENTLY updates data without taking an exclusive read lock on the view.
  • Fast / Incremental Refresh:Using change logs, the engine applies only row deltas rather than scanning the entire base table.
  • Scheduled Pipelines:Production teams run automated cron jobs to refresh materialized tables during off-peak hours.

7. View vs Materialized View

Selecting between a standard virtual view and a materialized view depends on your performance requirements, tolerance for data latency, and storage budget.

AttributeStandard ViewMaterialized View
Data StorageStores query text only (0 row storage)Persists calculated rows physically on disk
Data FreshnessAlways real-time live dataSnapshot as of the most recent refresh
Read SpeedDepends on base query complexityExtremely fast table scan or index lookup
Indexing SupportCannot be indexed directlyCan have custom indexes on any projected column
Write OverheadZero overhead during base table writesRequires CPU and I/O cycles to refresh data
Primary Use CaseSecurity abstraction, query clarityData warehousing, heavy reporting dashboards

8. View vs Table

Understanding the distinction between physical relational tables and virtual views is foundational for database architecture and design.

CharacteristicTableView
ExistencePhysical data structure containing rows and columnsVirtual window pointing to underlying tables
Disk FootprintConsumes storage proportional to row countConsumes minimal metadata storage in catalog
Data ModificationFreely supports INSERT, UPDATE, and DELETESubject to strict updatability constraints
Constraints & KeysCan define PRIMARY KEY, FOREIGN KEY, and UNIQUEInherits constraints from underlying base tables
IndependenceIndependent data objectBreaks if referenced base table columns change

Architectural Decision Matrix

  • Use Tables When:You need authoritative persistence, primary key guarantees, and direct transactional write performance.
  • Use Standard Views When:You need real-time data access, custom authorization tiers, or simplified abstraction over complex joins.
  • Use Materialized Views When:Underlying data changes infrequently, queries take seconds or minutes, and slight data lag is acceptable.

Knowledge Check: SQL Views

1. What does a standard SQL view store on disk?

2. When does a standard view evaluate its underlying SELECT query?

3. Which condition generally prevents direct updates through a view?

4. What is the purpose of the WITH CHECK OPTION clause?

5. How does a materialized view differ from a standard view?

6. What command updates stored data in a PostgreSQL materialized view?