📖 Scenario: You are managing a small bookstore database. You want to quickly add some new books' data inline without creating a permanent table first.
🎯 Goal: Build a PostgreSQL query using the VALUES clause to create inline data for books with their title and price. Then select all the data from this inline table.
📋 What You'll Learn
Create inline data using the VALUES clause with three books
Each book entry must have a title and a price
Assign column names title and price to the inline data
Write a SELECT query to retrieve all rows from the inline data
💡 Why This Matters
🌍 Real World
Inline data with VALUES is useful when you want to quickly test queries or join small sets of data without creating permanent tables.
💼 Career
Database developers and analysts often use VALUES for quick data input, testing, or combining data from different sources in PostgreSQL.
Progress0 / 4 steps
1
Create inline data with VALUES clause
Write a PostgreSQL query that uses the VALUES clause to create inline data with these exact rows: ('The Hobbit', 15.99), ('1984', 12.50), and ('Dune', 18.00). Do not assign column names yet.
PostgreSQL
Hint
Use the VALUES keyword followed by parentheses for each row, separated by commas.
2
Assign column names to inline data
Add column names title and price to the inline data by adding AS books(title, price) after the VALUES clause.
PostgreSQL
Hint
Use AS followed by a table alias and parentheses with column names.
3
Select all data from inline table
Write a SELECT query to retrieve all columns from the inline table named books.
PostgreSQL
Hint
Wrap the VALUES clause in parentheses and use SELECT * FROM to get all rows.
4
Complete the inline data query
Ensure the full query selects all columns from the inline data with alias books and columns title and price. The query should be exactly: SELECT * FROM (VALUES ('The Hobbit', 15.99), ('1984', 12.50), ('Dune', 18.00)) AS books(title, price).
PostgreSQL
Hint
This is the complete query to get all inline book data.
Practice
(1/5)
1. What does the VALUES clause do in PostgreSQL?
easy
A. Creates inline rows of data without needing a table
B. Deletes rows from a table
C. Updates existing rows in a table
D. Creates a new table in the database
Solution
Step 1: Understand the purpose of VALUES clause
The VALUES clause is used to create rows of data directly in a query without referencing an existing table.
Step 2: Compare with other SQL commands
DELETE removes rows, UPDATE modifies rows, and CREATE TABLE makes new tables, which are different from VALUES usage.
Final Answer:
Creates inline rows of data without needing a table -> Option A
Quick Check:
VALUES clause = inline data rows [OK]
Hint: VALUES = inline rows, no table needed [OK]
Common Mistakes:
Confusing VALUES with DELETE or UPDATE commands
Thinking VALUES creates tables
Assuming VALUES modifies existing data
2. Which of the following is the correct syntax to create two rows with columns id and name using VALUES?
easy
A. VALUES (id=1, name='Alice'), (id=2, name='Bob');
B. VALUES (1, 'Alice'), (2, 'Bob');
C. VALUES (1 'Alice'), (2 'Bob');
D. VALUES 1, 'Alice'; VALUES 2, 'Bob';
Solution
Step 1: Check VALUES row syntax
Each row must be enclosed in parentheses with values separated by commas, like (1, 'Alice').
Hint: Use parentheses and commas for each row [OK]
Common Mistakes:
Omitting parentheses around rows
Missing commas between values
Using assignment syntax inside VALUES
3. What is the output of this query?
SELECT * FROM (VALUES (1, 'Red'), (2, 'Blue')) AS colors(id, name);
medium
A. One row with array [(1, 'Red'), (2, 'Blue')]
B. Syntax error due to missing table
C. Empty result set
D. Two rows with columns id and name: (1, 'Red') and (2, 'Blue')
Solution
Step 1: Understand VALUES with alias
The VALUES clause creates two rows. The alias 'colors' names the columns as id and name.
Step 2: Result of SELECT * from VALUES
The query returns two rows: first row (1, 'Red'), second row (2, 'Blue'), with columns id and name.
Final Answer:
Two rows with columns id and name: (1, 'Red') and (2, 'Blue') -> Option D
Quick Check:
VALUES + alias = rows with named columns [OK]
Hint: VALUES with alias returns rows with named columns [OK]
Common Mistakes:
Expecting a syntax error without a real table
Thinking VALUES returns arrays
Assuming empty results without data
4. Identify the error in this query:
SELECT * FROM VALUES (1, 'A'), (2, 'B') AS t(id, name);
medium
A. Missing parentheses around the entire VALUES clause
B. Missing parentheses around VALUES rows
C. Alias must come before VALUES
D. No error, query is correct
Solution
Step 1: Check VALUES clause syntax
VALUES rows must be enclosed in parentheses as a table expression: (VALUES ...)
Step 2: Analyze the query
The query misses parentheses around the entire VALUES clause. It should be: FROM (VALUES ...) AS t(id, name)
Final Answer:
Missing parentheses around the entire VALUES clause -> Option A
Quick Check:
VALUES clause needs parentheses around all rows [OK]
Hint: Wrap all VALUES rows in parentheses when used in FROM [OK]
Common Mistakes:
Not wrapping VALUES in parentheses in FROM clause
Placing alias before VALUES
Assuming no parentheses needed for inline data
5. You want to create a temporary inline table of products with columns product_id, name, and price using VALUES. Which query correctly creates this and selects products priced over 10?
hard
A. SELECT * FROM (VALUES (product_id=1, name='Pen', price=5), (product_id=2, name='Notebook', price=15), (product_id=3, name='Eraser', price=8)) p(product_id, name, price) WHERE price > 10;
B. SELECT * FROM VALUES (1, 'Pen', 5), (2, 'Notebook', 15), (3, 'Eraser', 8) AS p(product_id, name, price) WHERE price > 10;
C. SELECT * FROM (VALUES (1, 'Pen', 5), (2, 'Notebook', 15), (3, 'Eraser', 8)) AS p(product_id, name, price) WHERE price > 10;
D. SELECT * FROM (VALUES (1, 'Pen', 5), (2, 'Notebook', 15), (3, 'Eraser', 8)) AS p WHERE price > 10;
Solution
Step 1: Check correct VALUES syntax with alias and columns
The VALUES clause must be enclosed in parentheses and aliased with column names, like SELECT * FROM (VALUES (1, 'Pen', 5), (2, 'Notebook', 15), (3, 'Eraser', 8)) AS p(product_id, name, price) WHERE price > 10.
Step 2: Validate options
A uses invalid assignment syntax (product_id=1 etc.) inside VALUES rows. B misses parentheses around the entire VALUES clause. C is correct. D misses column names in the alias, making 'price' undefined.
Final Answer:
SELECT * FROM (VALUES (1, 'Pen', 5), (2, 'Notebook', 15), (3, 'Eraser', 8)) AS p(product_id, name, price) WHERE price > 10; -> Option C
Quick Check:
VALUES + (parens) + AS alias(columns) + WHERE = correct [OK]
Hint: Wrap VALUES in parentheses, alias with columns, then filter [OK]
Common Mistakes:
Forgetting parentheses around VALUES
Not aliasing columns when filtering by column name
Using assignment syntax like product_id=1 in VALUES rows
Filtering on column without alias or column names
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.