Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Create and Use Composite Types in PostgreSQL
📖 Scenario: You are building a simple database for a library. Each book has a title, an author, and a publication year. You want to group these details into a single composite type to keep your database organized.
🎯 Goal: Create a composite type called book_info with fields for title, author, and year. Then create a table that uses this composite type to store book records.
📋 What You'll Learn
Create a composite type named book_info with fields title (text), author (text), and year (integer).
Create a table named library with a column info of type book_info.
Insert at least two records into the library table using the composite type.
Write a SELECT query to retrieve all records from the library table.
💡 Why This Matters
🌍 Real World
Composite types help organize related data fields together, making database design cleaner and queries easier to write and read.
💼 Career
Understanding composite types is useful for database developers and administrators working with PostgreSQL to build efficient and maintainable data models.
Progress0 / 4 steps
1
Create the composite type book_info
Write a SQL statement to create a composite type called book_info with three fields: title of type text, author of type text, and year of type integer.
PostgreSQL
Hint
Use CREATE TYPE followed by the type name and define fields inside parentheses.
2
Create the library table with a column of type book_info
Write a SQL statement to create a table called library with one column named info of type book_info.
PostgreSQL
Hint
Use CREATE TABLE and specify the column info with the composite type book_info.
3
Insert records into the library table using the composite type
Write two SQL INSERT statements to add these books into the library table: (1) Title: '1984', Author: 'George Orwell', Year: 1949; (2) Title: 'To Kill a Mockingbird', Author: 'Harper Lee', Year: 1960. Use the composite type book_info to insert the data.
PostgreSQL
Hint
Use INSERT INTO library VALUES (ROW(...)) with the values matching the composite type fields.
4
Select all records from the library table
Write a SQL SELECT statement to retrieve all records from the library table, showing the info column.
PostgreSQL
Hint
Use SELECT info FROM library; to get all records.
Practice
(1/5)
1. What is a composite type in PostgreSQL?
easy
A. A special index type for faster queries
B. A built-in type for storing large text data
C. A custom type that groups multiple related fields together
D. A function that returns multiple rows
Solution
Step 1: Understand the definition of composite types
Composite types are user-defined types that group several fields into one unit, like a record.
Step 2: Compare with other options
Options A, B, and D describe unrelated PostgreSQL features, not composite types.
Final Answer:
A custom type that groups multiple related fields together -> Option C
Quick Check:
Composite type = grouped fields [OK]
Hint: Composite types group fields like a mini table row [OK]
Common Mistakes:
Confusing composite types with arrays
Thinking composite types are indexes
Mixing composite types with functions
2. Which of the following is the correct syntax to define a composite type named person with fields name (text) and age (integer)?
easy
A. CREATE TYPE person AS (name text, age integer);
B. CREATE TABLE person (name text, age integer);
C. CREATE TYPE person (name text, age integer);
D. CREATE COMPOSITE person AS (name text, age integer);
Solution
Step 1: Recall the syntax for creating composite types
The correct syntax uses CREATE TYPE with AS and parentheses listing fields and types.
Step 2: Check each option
CREATE TYPE person AS (name text, age integer); matches the correct syntax. CREATE TABLE person (name text, age integer); creates a table, not a type. CREATE TYPE person (name text, age integer); misses AS keyword. CREATE COMPOSITE person AS (name text, age integer); uses invalid keyword COMPOSITE.
Final Answer:
CREATE TYPE person AS (name text, age integer); -> Option A
Quick Check:
CREATE TYPE ... AS (...) is correct [OK]
Hint: Use CREATE TYPE name AS (fields) for composite types [OK]
Common Mistakes:
Using CREATE TABLE instead of CREATE TYPE
Omitting AS keyword
Using non-existent COMPOSITE keyword
3. Given the composite type and table: CREATE TYPE address AS (city text, zip integer); CREATE TABLE users (id serial, home address); What will the query return? SELECT (home).city FROM users WHERE id = 1;
medium
A. An error because you cannot access composite fields like this
B. The zip code of the home address for user with id 1
C. The entire home composite value as text
D. The city name stored in the home column for user with id 1
Solution
Step 1: Understand composite field access syntax
Using (home).city extracts the city field from the composite column home.
Step 2: Analyze the query result
The query selects city from home for user with id 1, so it returns that city name.
Final Answer:
The city name stored in the home column for user with id 1 -> Option D
Quick Check:
(column).field extracts field from composite [OK]
Hint: Use (column).field to get composite field value [OK]
Common Mistakes:
Trying to access composite fields without parentheses
Expecting entire composite instead of single field
Confusing city with zip field
4. Identify the error in this code snippet: CREATE TYPE product_info AS (name text, price numeric); CREATE TABLE products (id serial, info product_info); INSERT INTO products (info) VALUES ('Laptop', 999.99);
medium
A. The serial type is invalid for id column
B. The INSERT statement syntax is incorrect for composite type
C. The table products should not use composite types
D. The CREATE TYPE statement is missing a semicolon
Solution
Step 1: Check INSERT syntax for composite types
When inserting a composite type, values must be wrapped in parentheses or ROW(), not as separate values.
Step 2: Identify the error in the INSERT statement
The statement tries to insert two separate values without wrapping them as a composite, causing syntax error.
Final Answer:
The INSERT statement syntax is incorrect for composite type -> Option B
Quick Check:
Insert composite as (value1, value2) or ROW(...) [OK]
Hint: Wrap composite values in parentheses or use ROW() [OK]
Common Mistakes:
Inserting composite fields as separate values
Forgetting parentheses around composite values
Misunderstanding serial type usage
5. You have a composite type location with fields latitude and longitude. You want to create a function that returns this composite type and use it in a query. Which of the following is the correct way to define the function?
hard
A. CREATE FUNCTION get_location() RETURNS location AS $$ BEGIN RETURN ROW(40.7128, -74.0060); END; $$ LANGUAGE plpgsql;
B. CREATE FUNCTION get_location() RETURNS location AS $$ BEGIN RETURN 40.7128, -74.0060; END; $$ LANGUAGE plpgsql;
C. CREATE FUNCTION get_location() RETURNS TABLE(latitude float, longitude float) AS $$ BEGIN RETURN (40.7128, -74.0060); END; $$ LANGUAGE plpgsql;
D. CREATE FUNCTION get_location() RETURNS location AS $$ BEGIN RETURN '40.7128, -74.0060'; END; $$ LANGUAGE plpgsql;
Solution
Step 1: Understand how to return composite types from functions
Functions returning composite types must return a row value, typically using ROW() constructor.
Step 2: Analyze each option
CREATE FUNCTION get_location() RETURNS location AS $$ BEGIN RETURN ROW(40.7128, -74.0060); END; $$ LANGUAGE plpgsql; correctly uses RETURN ROW(...) to return the composite type. CREATE FUNCTION get_location() RETURNS location AS $$ BEGIN RETURN 40.7128, -74.0060; END; $$ LANGUAGE plpgsql; returns multiple values without row constructor (parentheses or ROW()), causing syntax error. CREATE FUNCTION get_location() RETURNS TABLE(latitude float, longitude float) AS $$ BEGIN RETURN (40.7128, -74.0060); END; $$ LANGUAGE plpgsql; returns a table, not the composite type. CREATE FUNCTION get_location() RETURNS location AS $$ BEGIN RETURN '40.7128, -74.0060'; END; $$ LANGUAGE plpgsql; returns a string, not composite.
Final Answer:
CREATE FUNCTION get_location() RETURNS location AS $$ BEGIN RETURN ROW(40.7128, -74.0060); END; $$ LANGUAGE plpgsql; -> Option A
Quick Check:
Use RETURN ROW(...) for composite return [OK]
Hint: Use RETURN ROW(...) to return composite types in functions [OK]