SQL SELECT Queries - Complete Guide
🎯 Quick Reference
Basic SELECT Statement
-- Select all columns from table
SELECT * FROM students;
-- Select specific columns
SELECT student_id, first_name, last_name FROM students;
-- Select with condition
SELECT * FROM students WHERE grade = 'A';
-- Select with multiple conditions
SELECT * FROM students WHERE grade = 'A' AND age >= 18;
SELECT with WHERE Clause
-- Numeric comparisons
SELECT * FROM products WHERE price > 100;
SELECT * FROM products WHERE price BETWEEN 50 AND 200;
-- String comparisons
SELECT * FROM users WHERE username LIKE 'john%';
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- Date comparisons
SELECT * FROM orders WHERE order_date >= '2024-01-01';
SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';
-- NULL checks
SELECT * FROM customers WHERE phone IS NULL;
SELECT * FROM customers WHERE phone IS NOT NULL;
ORDER BY Clause
-- Sort by single column (ascending)
SELECT * FROM students ORDER BY last_name;
-- Sort by single column (descending)
SELECT * FROM students ORDER BY grade DESC;
-- Sort by multiple columns
SELECT * FROM students ORDER BY grade DESC, last_name ASC;
-- Sort by calculated column
SELECT *, (math_score + science_score) AS total_score
FROM results
ORDER BY total_score DESC;
LIMIT and OFFSET
-- Limit results (MySQL/PostgreSQL)
SELECT * FROM students LIMIT 10;
-- Limit with offset (pagination)
SELECT * FROM students LIMIT 10 OFFSET 20;
-- SQL Server syntax
SELECT TOP 10 * FROM students;
SELECT * FROM students
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
Aggregate Functions
-- Count records
SELECT COUNT(*) FROM students;
SELECT COUNT(DISTINCT grade) FROM students;
-- Sum and Average
SELECT SUM(price) FROM products;
SELECT AVG(price) FROM products;
-- Min and Max
SELECT MIN(price), MAX(price) FROM products;
-- Multiple aggregates
SELECT
COUNT(*) as total_students,
AVG(score) as average_score,
MIN(score) as min_score,
MAX(score) as max_score
FROM results;
GROUP BY and HAVING
-- Group by single column
SELECT grade, COUNT(*) as student_count
FROM students
GROUP BY grade;
-- Group by multiple columns
SELECT grade, age, COUNT(*) as student_count
FROM students
GROUP BY grade, age;
-- Having clause (filter groups)
SELECT grade, COUNT(*) as student_count
FROM students
GROUP BY grade
HAVING COUNT(*) > 5;
-- Complex grouping
SELECT grade,
AVG(score) as avg_score,
COUNT(*) as student_count
FROM results
WHERE score >= 60
GROUP BY grade
HAVING AVG(score) >= 75
ORDER BY avg_score DESC;
JOIN Operations
-- Inner Join
SELECT s.student_id, s.first_name, c.course_name
FROM students s
INNER JOIN courses c ON s.course_id = c.course_id;
-- Left Join
SELECT s.student_id, s.first_name, e.enrollment_date
FROM students s
LEFT JOIN enrollments e ON s.student_id = e.student_id;
-- Right Join
SELECT s.student_id, s.first_name, e.enrollment_date
FROM students s
RIGHT JOIN enrollments e ON s.student_id = e.student_id;
-- Full Outer Join
SELECT s.student_id, s.first_name, e.enrollment_date
FROM students s
FULL OUTER JOIN enrollments e ON s.student_id = e.student_id;
Subqueries
-- Subquery in WHERE clause
SELECT * FROM students
WHERE student_id IN (
SELECT student_id FROM enrollments
WHERE course_id = 101
);
-- Subquery in SELECT clause
SELECT
student_id,
first_name,
(SELECT COUNT(*) FROM enrollments e
WHERE e.student_id = s.student_id) as enrollment_count
FROM students s;
-- Subquery in FROM clause
SELECT grade, student_count
FROM (
SELECT grade, COUNT(*) as student_count
FROM students
GROUP BY grade
) AS grade_summary
WHERE student_count > 10;
Common Patterns
-- Search functionality
SELECT * FROM products
WHERE product_name LIKE '%laptop%'
OR description LIKE '%laptop%';
-- Pagination
SELECT * FROM articles
ORDER BY published_date DESC
LIMIT 10 OFFSET 20;
-- Data validation
SELECT * FROM users
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$';
-- Performance optimization
SELECT * FROM large_table
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
INDEX (created_at);
-- Statistical analysis
SELECT
DATE(order_date) as order_date,
COUNT(*) as order_count,
SUM(amount) as total_amount
FROM orders
WHERE status = 'completed'
GROUP BY DATE(order_date)
ORDER BY order_date;
📚 Learn SQL Theory →