Bird
Raised Fist0
PostgreSQLquery~20 mins

SELECT with PostgreSQL-specific features - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
PostgreSQL SELECT Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
What is the output of this query using PostgreSQL's DISTINCT ON?
Consider the table employees with columns department and salary. What rows does this query return?
SELECT DISTINCT ON (department) department, salary FROM employees ORDER BY department, salary DESC;
PostgreSQL
CREATE TABLE employees (department TEXT, salary INT);
INSERT INTO employees VALUES
('Sales', 5000),
('Sales', 6000),
('HR', 4500),
('HR', 4700),
('IT', 7000);

SELECT DISTINCT ON (department) department, salary FROM employees ORDER BY department, salary DESC;
A[{'Sales', 5000}, {'HR', 4500}, {'IT', 7000}]
B[{'Sales', 6000}, {'HR', 4700}, {'IT', 7000}]
C[{'Sales', 6000}, {'HR', 4500}, {'IT', 7000}]
D[{'Sales', 5000}, {'HR', 4700}, {'IT', 7000}]
Attempts:
2 left
💡 Hint
DISTINCT ON returns the first row of each group based on the ORDER BY clause.
❓ query_result
intermediate
2:00remaining
What does this query using PostgreSQL's RETURNING clause output?
Given the table products with columns id and price, what is the output of this query?
UPDATE products SET price = price * 1.1 WHERE id = 2 RETURNING id, price;
PostgreSQL
CREATE TABLE products (id INT PRIMARY KEY, price NUMERIC);
INSERT INTO products VALUES (1, 100), (2, 200);

UPDATE products SET price = price * 1.1 WHERE id = 2 RETURNING id, price;
A[{id: 2, price: 220}]
B[{id: 1, price: 100}, {id: 2, price: 220}]
C[]
D[{id: 2, price: 200}]
Attempts:
2 left
💡 Hint
RETURNING shows the rows affected by the UPDATE.
📝 Syntax
advanced
2:00remaining
Which option correctly uses PostgreSQL's JSONB operators to extract a value?
Given a table data with a JSONB column info, which query correctly extracts the text value of the key name?
PostgreSQL
SELECT info->>'name' FROM data;
ASELECT info->>name FROM data;
BSELECT info->'name' FROM data;
CSELECT info->>'name' FROM data;
DSELECT info->name FROM data;
Attempts:
2 left
💡 Hint
Use ->> with quotes around the key to get text.
❓ optimization
advanced
2:00remaining
Which index type is best for optimizing full-text search in PostgreSQL?
You want to speed up searches on a text column using PostgreSQL's full-text search. Which index type should you create?
ACREATE INDEX idx ON table USING gin (to_tsvector('english', column));
BCREATE INDEX idx ON table USING btree (column);
CCREATE INDEX idx ON table USING hash (column);
DCREATE INDEX idx ON table USING gist (column);
Attempts:
2 left
💡 Hint
Full-text search uses tsvector and GIN indexes.
🧠 Conceptual
expert
2:00remaining
What is the effect of the PostgreSQL-specific clause FOR UPDATE SKIP LOCKED in a SELECT query?
Consider a SELECT query with FOR UPDATE SKIP LOCKED. What does this clause do?
AIt causes the query to wait until all rows are unlocked before returning.
BIt skips locking any rows and returns all rows immediately.
CIt locks all rows in the table regardless of selection.
DIt locks selected rows and skips rows already locked by other transactions.
Attempts:
2 left
💡 Hint
SKIP LOCKED avoids waiting on locked rows.

Practice

(1/5)
1. What does the LIMIT clause do in a PostgreSQL SELECT query?
easy
A. It combines rows from two tables.
B. It restricts the number of rows returned by the query.
C. It removes duplicate rows from the result.
D. It sorts the rows in ascending order.

Solution

  1. Step 1: Understand the purpose of LIMIT

    The LIMIT clause is used to specify the maximum number of rows to return from a query result.
  2. Step 2: Compare with other options

    Sorting is done by ORDER BY, removing duplicates by DISTINCT, and combining tables by JOIN, so these are not correct.
  3. Final Answer:

    It restricts the number of rows returned by the query. -> Option B
  4. Quick Check:

    LIMIT = restrict rows [OK]
Hint: LIMIT caps rows returned, like a page size [OK]
Common Mistakes:
  • Confusing LIMIT with ORDER BY
  • Thinking LIMIT removes duplicates
  • Mixing LIMIT with JOIN functionality
2. Which of the following is the correct syntax to select distinct city names from a table called customers?
easy
A. SELECT city FROM DISTINCT customers;
B. SELECT city DISTINCT FROM customers;
C. SELECT DISTINCT city FROM customers;
D. SELECT city FROM customers DISTINCT;

Solution

  1. Step 1: Recall correct DISTINCT syntax

    In PostgreSQL, DISTINCT comes immediately after SELECT and before the column list.
  2. Step 2: Validate each option

    SELECT DISTINCT city FROM customers; correctly places DISTINCT after SELECT. Options A, B, and D misuse DISTINCT placement causing syntax errors.
  3. Final Answer:

    SELECT DISTINCT city FROM customers; -> Option C
  4. Quick Check:

    SELECT DISTINCT = correct syntax [OK]
Hint: DISTINCT always follows SELECT keyword [OK]
Common Mistakes:
  • Placing DISTINCT after column names
  • Using DISTINCT after FROM clause
  • Misordering keywords causing syntax errors
3. Given the table products with columns id, name, and price, what will this query return?
SELECT name FROM products ORDER BY price DESC LIMIT 2;
medium
A. The two products with the lowest prices.
B. An error because LIMIT cannot be used with ORDER BY.
C. All products sorted by price descending.
D. The two products with the highest prices.

Solution

  1. Step 1: Understand ORDER BY with DESC

    ORDER BY price DESC sorts products from highest to lowest price.
  2. Step 2: Apply LIMIT 2

    LIMIT 2 restricts the output to only the first two rows after sorting, so the two most expensive products.
  3. Final Answer:

    The two products with the highest prices. -> Option D
  4. Quick Check:

    ORDER BY DESC + LIMIT = top rows [OK]
Hint: ORDER BY DESC + LIMIT picks top items [OK]
Common Mistakes:
  • Thinking LIMIT returns lowest prices
  • Believing LIMIT causes syntax error with ORDER BY
  • Ignoring DESC means descending order
4. Identify the error in this PostgreSQL query:
SELECT DISTINCT name, price FROM products LIMIT;
medium
A. LIMIT requires a number to specify how many rows to return.
B. DISTINCT cannot be used with multiple columns.
C. SELECT must include WHERE clause when using LIMIT.
D. The table name is missing.

Solution

  1. Step 1: Check LIMIT usage

    LIMIT must be followed by a number indicating how many rows to return; here it is missing.
  2. Step 2: Validate other parts

    DISTINCT can be used with multiple columns, WHERE is optional, and table name is present as products.
  3. Final Answer:

    LIMIT requires a number to specify how many rows to return. -> Option A
  4. Quick Check:

    LIMIT needs a number [OK]
Hint: Always put a number after LIMIT [OK]
Common Mistakes:
  • Omitting number after LIMIT
  • Thinking DISTINCT can't use multiple columns
  • Assuming WHERE is mandatory with LIMIT
5. You want to get the third and fourth highest salaries from the employees table with column salary. Which query correctly achieves this in PostgreSQL?
hard
A. SELECT salary FROM employees ORDER BY salary DESC LIMIT 2 OFFSET 2;
B. SELECT salary FROM employees ORDER BY salary ASC LIMIT 2 OFFSET 3;
C. SELECT DISTINCT salary FROM employees LIMIT 2 OFFSET 3 ORDER BY salary DESC;
D. SELECT salary FROM employees LIMIT 2 OFFSET 2 ORDER BY salary DESC;

Solution

  1. Step 1: Understand OFFSET and LIMIT

    OFFSET 2 skips the first two highest salaries, LIMIT 2 returns the next two rows.
  2. Step 2: Check ORDER BY direction

    ORDER BY salary DESC sorts salaries from highest to lowest, so OFFSET 2 skips top two highest.
  3. Step 3: Validate options

    SELECT salary FROM employees ORDER BY salary DESC LIMIT 2 OFFSET 2; correctly orders DESC, uses LIMIT 2 and OFFSET 2. SELECT salary FROM employees ORDER BY salary ASC LIMIT 2 OFFSET 3; orders ASC (wrong direction), C misplaces ORDER BY, D places ORDER BY after LIMIT (syntax error).
  4. Final Answer:

    SELECT salary FROM employees ORDER BY salary DESC LIMIT 2 OFFSET 2; -> Option A
  5. Quick Check:

    OFFSET skips rows, LIMIT picks next [OK]
Hint: Use OFFSET to skip, LIMIT to pick rows [OK]
Common Mistakes:
  • Using ASC instead of DESC for highest values
  • Placing ORDER BY after LIMIT
  • Confusing OFFSET number with row count
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