[ { "id": "q1", "title": "List all science fiction books", "difficulty": "Beginner", "description": "Retrieve the titles and authors of all books in the Science Fiction genre.", "hint": "Use a WHERE clause to filter by genre.", "expected_sql": "SELECT title, author FROM books WHERE genre = 'Science Fiction';" }, { "id": "q2", "title": "Find books with low availability", "difficulty": "Beginner", "description": "Show books with fewer than 2 available copies.", "hint": "Use a WHERE clause to filter by available_copies.", "expected_sql": "SELECT title, available_copies FROM books WHERE available_copies < 2;" }, { "id": "q3", "title": "List loans for user ID 101", "difficulty": "Beginner", "description": "Retrieve all loan details for the user with ID 101.", "hint": "Use a WHERE clause to filter by user_id.", "expected_sql": "SELECT loan_id, book_id, issue_date, due_date FROM loans WHERE user_id = 101;" }, { "id": "q4", "title": "Find books published after 2000", "difficulty": "Beginner", "description": "Show titles and publication years of books published after 2000.", "hint": "Use a WHERE clause with year comparison.", "expected_sql": "SELECT title, year FROM books WHERE year > 2000;" }, { "id": "q5", "title": "List unique genres", "difficulty": "Beginner", "description": "Retrieve all unique genres from the books table.", "hint": "Use DISTINCT to avoid duplicate genres.", "expected_sql": "SELECT DISTINCT genre FROM books;" }, { "id": "q6", "title": "Find overdue loans", "difficulty": "Beginner", "description": "Show loans that are overdue as of '2023-03-01' (due_date before '2023-03-01' and not returned).", "hint": "Use a WHERE clause to check due_date and NULL return_date.", "expected_sql": "SELECT loan_id, book_id, due_date FROM loans WHERE due_date < '2023-03-01' AND return_date IS NULL;" }, { "id": "q7", "title": "List users joined after 2020", "difficulty": "Beginner", "description": "Show names and emails of users who joined after December 31, 2020.", "hint": "Use a WHERE clause with membership_date.", "expected_sql": "SELECT name, email FROM users WHERE membership_date > '2020-12-31';" }, { "id": "q8", "title": "Books by George Orwell", "difficulty": "Beginner", "description": "Retrieve all books written by George Orwell.", "hint": "Use a WHERE clause to filter by author.", "expected_sql": "SELECT title, genre FROM books WHERE author = 'George Orwell';" }, { "id": "q9", "title": "List active loans", "difficulty": "Beginner", "description": "Show all loans that have not been returned.", "hint": "Use a WHERE clause to check for NULL return_date.", "expected_sql": "SELECT loan_id, book_id, user_id, issue_date FROM loans WHERE return_date IS NULL;" }, { "id": "q10", "title": "List books by publication year", "difficulty": "Beginner", "description": "Show all book titles and their publication years, ordered by year ascending.", "hint": "Use ORDER BY clause on year.", "expected_sql": "SELECT title, year FROM books ORDER BY year ASC;" }, { "id": "q11", "title": "Count loans per book", "difficulty": "Intermediate", "description": "Show the number of loans for each book, including books with zero loans.", "hint": "Use a LEFT JOIN and GROUP BY book title.", "expected_sql": "SELECT b.title, COUNT(l.loan_id) AS loan_count FROM books b LEFT JOIN loans l ON b.book_id = l.book_id GROUP BY b.title;" }, { "id": "q12", "title": "Total loans per user", "difficulty": "Intermediate", "description": "Calculate the total number of loans for each user, including users with zero loans.", "hint": "Use a LEFT JOIN and GROUP BY user name.", "expected_sql": "SELECT u.name, COUNT(l.loan_id) AS total_loans FROM users u LEFT JOIN loans l ON u.user_id = l.user_id GROUP BY u.name;" }, { "id": "q13", "title": "Books by genre count", "difficulty": "Intermediate", "description": "Count the number of books in each genre.", "hint": "Use GROUP BY on genre and COUNT.", "expected_sql": "SELECT genre, COUNT(book_id) AS book_count FROM books GROUP BY genre;" }, { "id": "q14", "title": "Active loans by genre", "difficulty": "Intermediate", "description": "Show the number of active loans (not returned) for each book genre.", "hint": "Join books and loans, filter by NULL return_date, and GROUP BY genre.", "expected_sql": "SELECT b.genre, COUNT(l.loan_id) AS active_loans FROM books b JOIN loans l ON b.book_id = l.book_id WHERE l.return_date IS NULL GROUP BY b.genre;" }, { "id": "q15", "title": "Users with multiple loans", "difficulty": "Intermediate", "description": "Find users who have taken out more than one loan.", "hint": "Use GROUP BY on user name and HAVING clause.", "expected_sql": "SELECT u.name, COUNT(l.loan_id) AS loan_count FROM users u JOIN loans l ON u.user_id = l.user_id GROUP BY u.name HAVING COUNT(l.loan_id) > 1;" }, { "id": "q16", "title": "Books never loaned", "difficulty": "Intermediate", "description": "List books that have never been loaned.", "hint": "Use a LEFT JOIN and check for NULL in the loans table.", "expected_sql": "SELECT b.title FROM books b LEFT JOIN loans l ON b.book_id = l.book_id WHERE l.loan_id IS NULL;" }, { "id": "q17", "title": "Loan details with book and user", "difficulty": "Intermediate", "description": "Show loan details including book title, user name, and issue date for all loans.", "hint": "Join books, users, and loans tables.", "expected_sql": "SELECT l.loan_id, b.title, u.name, l.issue_date FROM loans l JOIN books b ON l.book_id = b.book_id JOIN users u ON l.user_id = u.user_id;" }, { "id": "q18", "title": "Books loaned in 2022", "difficulty": "Intermediate", "description": "List all books that were loaned in 2022.", "hint": "Use a WHERE clause with LIKE on issue_date and JOIN with books.", "expected_sql": "SELECT DISTINCT b.title FROM books b JOIN loans l ON b.book_id = l.book_id WHERE l.issue_date LIKE '2022%';" }, { "id": "q19", "title": "Average loan duration for returned books", "difficulty": "Intermediate", "description": "Calculate the average number of days for loans that have been returned.", "hint": "Use JULIANDAY to calculate date difference and AVG.", "expected_sql": "SELECT AVG(JULIANDAY(return_date) - JULIANDAY(issue_date)) AS avg_loan_days FROM loans WHERE return_date IS NOT NULL;" }, { "id": "q20", "title": "Most popular author by loans", "difficulty": "Intermediate", "description": "Find the author with the most loans.", "hint": "Join books and loans, GROUP BY author, and use LIMIT.", "expected_sql": "SELECT b.author, COUNT(l.loan_id) AS loan_count FROM books b JOIN loans l ON b.book_id = l.book_id GROUP BY b.author ORDER BY loan_count DESC LIMIT 1;" }, { "id": "q21", "title": "Overdue loans with user details", "difficulty": "Advanced", "description": "Show user names, book titles, and days overdue for loans not returned by '2023-03-01'.", "hint": "Join tables, filter for overdue loans, and calculate days overdue.", "expected_sql": "SELECT u.name, b.title, ROUND(JULIANDAY('2023-03-01') - JULIANDAY(l.due_date), 1) AS days_overdue FROM loans l JOIN books b ON l.book_id = b.book_id JOIN users u ON l.user_id = u.user_id WHERE l.due_date < '2023-03-01' AND l.return_date IS NULL;" }, { "id": "q22", "title": "Most active user by loan duration", "difficulty": "Advanced", "description": "Find the user with the highest total loan duration for returned books.", "hint": "Join users and loans, calculate duration, GROUP BY user, and use LIMIT.", "expected_sql": "SELECT u.name, SUM(JULIANDAY(l.return_date) - JULIANDAY(l.issue_date)) AS total_loan_days FROM users u JOIN loans l ON u.user_id = l.user_id WHERE l.return_date IS NOT NULL GROUP BY u.name ORDER BY total_loan_days DESC LIMIT 1;" }, { "id": "q23", "title": "Books with high demand", "difficulty": "Advanced", "description": "Identify books with more loans than their available copies.", "hint": "Join books and loans, GROUP BY book, and use HAVING clause.", "expected_sql": "SELECT b.title, COUNT(l.loan_id) AS loan_count, b.available_copies FROM books b JOIN loans l ON b.book_id = l.book_id GROUP BY b.title, b.available_copies HAVING COUNT(l.loan_id) > b.available_copies;" }, { "id": "q24", "title": "Longest overdue loan", "difficulty": "Advanced", "description": "Find the loan with the longest overdue period as of '2023-03-01'.", "hint": "Calculate days overdue, filter for overdue loans, and use LIMIT.", "expected_sql": "SELECT l.loan_id, b.title, ROUND(JULIANDAY('2023-03-01') - JULIANDAY(l.due_date), 1) AS days_overdue FROM loans l JOIN books b ON l.book_id = b.book_id WHERE l.return_date IS NULL AND l.due_date < '2023-03-01' ORDER BY days_overdue DESC LIMIT 1;" }, { "id": "q25", "title": "Loan activity by month", "difficulty": "Advanced", "description": "Show the number of loans issued per month in 2022 and 2023.", "hint": "Use STRFTIME to extract the month and GROUP BY.", "expected_sql": "SELECT STRFTIME('%Y-%m', issue_date) AS month, COUNT(loan_id) AS loan_count FROM loans GROUP BY month;" }, { "id": "q26", "title": "Users with no returns", "difficulty": "Advanced", "description": "List users who have loans but no returned books.", "hint": "Use JOIN and check for NULL return_date with HAVING clause.", "expected_sql": "SELECT u.name FROM users u JOIN loans l ON u.user_id = l.user_id GROUP BY u.name HAVING COUNT(l.return_date) = 0;" }, { "id": "q27", "title": "Books loaned by multiple users", "difficulty": "Advanced", "description": "Find books that have been loaned by more than one distinct user.", "hint": "Use COUNT and DISTINCT on user_id, GROUP BY book title.", "expected_sql": "SELECT b.title, COUNT(DISTINCT l.user_id) AS user_count FROM books b JOIN loans l ON b.book_id = l.book_id GROUP BY b.title HAVING COUNT(DISTINCT l.user_id) > 1;" }, { "id": "q28", "title": "Average loan duration by genre", "difficulty": "Advanced", "description": "Calculate the average loan duration for returned books by genre.", "hint": "Join books and loans, calculate duration, and GROUP BY genre.", "expected_sql": "SELECT b.genre, AVG(JULIANDAY(l.return_date) - JULIANDAY(l.issue_date)) AS avg_loan_days FROM books b JOIN loans l ON b.book_id = l.book_id WHERE l.return_date IS NOT NULL GROUP BY b.genre;" }, { "id": "q29", "title": "Users borrowing all science fiction books", "difficulty": "Advanced", "description": "List users who have borrowed every book in the Science Fiction genre.", "hint": "Count distinct Science Fiction books per user and compare with total Science Fiction books.", "expected_sql": "SELECT u.name FROM users u JOIN loans l ON u.user_id = l.user_id JOIN books b ON l.book_id = b.book_id WHERE b.genre = 'Science Fiction' GROUP BY u.name HAVING COUNT(DISTINCT b.book_id) = (SELECT COUNT(*) FROM books WHERE genre = 'Science Fiction');" }, { "id": "q30", "title": "Earliest and latest loan per book", "difficulty": "Advanced", "description": "Show the earliest and latest issue dates for each book that has been loaned.", "hint": "Use MIN and MAX on issue_date, GROUP BY book title.", "expected_sql": "SELECT b.title, MIN(l.issue_date) AS earliest_loan, MAX(l.issue_date) AS latest_loan FROM books b JOIN loans l ON b.book_id = l.book_id GROUP BY b.title;" } ]