runtime
63 / 88

lesson 63 Database engineering · advanced

Views: reusable query definitions

Define a reusable query as a view.

the idea

A view is a stored query with a name. Selecting from it runs the query against the current data, so it always reflects the latest rows. Views give a stable, reusable definition (for example, “net sales per customer”) without copying data.

Dataset: Retail

The tables the challenges use, with their first 6 rows. Under each column name: the kind of value it holds, and which table it links to.

orders6 columns · 6,722 rows
order_idnumber · unique idinvoice_notextcustomer_idnumber · links to customersordered_atdate & timecountrytextorder_typetext
1489438181022009-12-01 09:24:00United Kingdomsale
2489517163292009-12-01 11:34:00United Kingdomsale
3C489528167142009-12-01 11:50:00United Kingdomcancellation
4489529179842009-12-01 11:51:00United Kingdomsale
5489532133942009-12-01 11:58:00United Kingdomsale
6489540129132009-12-01 12:18:00United Kingdomsale
order_idnumber · unique id
1
invoice_notext
489438
customer_idnumber · links to customers
18102
ordered_atdate & time
2009-12-01 09:24:00
countrytext
United Kingdom
order_typetext
sale
order_idnumber · unique id
2
invoice_notext
489517
customer_idnumber · links to customers
16329
ordered_atdate & time
2009-12-01 11:34:00
countrytext
United Kingdom
order_typetext
sale
order_idnumber · unique id
3
invoice_notext
C489528
customer_idnumber · links to customers
16714
ordered_atdate & time
2009-12-01 11:50:00
countrytext
United Kingdom
order_typetext
cancellation
order_idnumber · unique id
4
invoice_notext
489529
customer_idnumber · links to customers
17984
ordered_atdate & time
2009-12-01 11:51:00
countrytext
United Kingdom
order_typetext
sale
order_idnumber · unique id
5
invoice_notext
489532
customer_idnumber · links to customers
13394
ordered_atdate & time
2009-12-01 11:58:00
countrytext
United Kingdom
order_typetext
sale
order_idnumber · unique id
6
invoice_notext
489540
customer_idnumber · links to customers
12913
ordered_atdate & time
2009-12-01 12:18:00
countrytext
United Kingdom
order_typetext
sale

first 6 of 6,722 rows · your queries use all of them

order_items7 columns · 125,613 rows
order_item_idnumber · unique idorder_idnumber · links to ordersline_numbernumberstock_codetext · links to productsdescriptiontextquantitynumberunit_pricedecimal
11121329DINOSAURS WRITING SET280.98
21221252SET OF MEADOW FLOWER STICKERS301.69
31321100CHARLIE AND LOLA CHARLOTTE BAG301.15
41421033JUMBO BAG CHARLIE AND LOLA TOYS302
51520711JUMBO BAG TOYS601.3
61621410COUNTRY COTTAGE DOORSTOP GREEN322.5
order_item_idnumber · unique id
1
order_idnumber · links to orders
1
line_numbernumber
1
stock_codetext · links to products
21329
descriptiontext
DINOSAURS WRITING SET
quantitynumber
28
unit_pricedecimal
0.98
order_item_idnumber · unique id
2
order_idnumber · links to orders
1
line_numbernumber
2
stock_codetext · links to products
21252
descriptiontext
SET OF MEADOW FLOWER STICKERS
quantitynumber
30
unit_pricedecimal
1.69
order_item_idnumber · unique id
3
order_idnumber · links to orders
1
line_numbernumber
3
stock_codetext · links to products
21100
descriptiontext
CHARLIE AND LOLA CHARLOTTE BAG
quantitynumber
30
unit_pricedecimal
1.15
order_item_idnumber · unique id
4
order_idnumber · links to orders
1
line_numbernumber
4
stock_codetext · links to products
21033
descriptiontext
JUMBO BAG CHARLIE AND LOLA TOYS
quantitynumber
30
unit_pricedecimal
2
order_item_idnumber · unique id
5
order_idnumber · links to orders
1
line_numbernumber
5
stock_codetext · links to products
20711
descriptiontext
JUMBO BAG TOYS
quantitynumber
60
unit_pricedecimal
1.3
order_item_idnumber · unique id
6
order_idnumber · links to orders
1
line_numbernumber
6
stock_codetext · links to products
21410
descriptiontext
COUNTRY COTTAGE DOORSTOP GREEN
quantitynumber
32
unit_pricedecimal
2.5

first 6 of 125,613 rows · your queries use all of them

worked example

Run these steps in order to see the idea before you write your own query. The step marked “the pattern” is what the challenges ask for. Running the example does not count toward progress.

  1. Create a view and count from it. sale_lines is a saved join of order_items and orders filtered to sales. COUNT(*) runs that definition against whatever rows exist now.

    step-1.sql
    CREATE VIEW sale_lines AS
    SELECT i.*, o.ordered_at, o.customer_id
    FROM order_items i
    JOIN orders o ON o.order_id = i.order_id
    WHERE o.order_type = 'sale';
    SELECT COUNT(*) AS sale_lines
    FROM sale_lines;
  2. See a view refresh with new data. The view does not store results—it re-queries. When order 1 becomes a cancellation, the cancellation count changes immediately.

    step-2.sql
    CREATE VIEW cancellations AS
    SELECT order_id
    FROM orders
    WHERE order_type = 'cancellation';
    UPDATE orders
    SET order_type = 'cancellation'
    WHERE order_id = 1;
    SELECT COUNT(*) AS cancellation_orders
    FROM cancellations;
  3. Put it together. The lesson's pattern in one query.the pattern

    example.sql
    CREATE VIEW sale_lines AS
    SELECT i.*, o.ordered_at, o.customer_id
    FROM order_items i
    JOIN orders o ON o.order_id = i.order_id
    WHERE o.order_type = 'sale';
    SELECT COUNT(*)
    FROM sale_lines;

common mistake

A view does not store results; it is not a snapshot and does not make the underlying query faster.

challenge 1

Create view customer_sales with customer_id, sale_orders (distinct sale orders) and net_sales (quantity × unit_price over all lines, rounded to 2) for identified customers.

Return customer_id, sale_orders and net_sales from the view for customers with net_sales above 10000.

what to return

Columns
customer_idsale_ordersnet_sales in this order
Rows
any order
Also checked
TEMP / table changes from your script
challenge-1.sql
 
To master this lesson, solve both challenges without hints and pass the concept check. 3 of 3 to go.
Views: reusable query definitions — Database engineering · Runtime