Basic SQL Interview Questions
Basic SQL Interview Questions
– PRAGYA RATHI
BASIC
SELECT *
FROM employees
WHERE salary > 5000;
Question: List all employees who joined within the last 12 months.
-- Create table
CREATE TABLE employee_details (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
joining_date DATE
);
-- Insert data
INSERT INTO employee_details (emp_id, emp_name, joining_date) VALUES
(1, 'John', '2023-10-01'),
(2, 'Jane', '2022-12-15'),
(3, 'Mike', '2024-01-10'),
(4, 'Emily', '2023-09-20'),
(5, 'Alex', '2022-07-30');
-- Query
SELECT *
FROM employee_details
WHERE joining_date >= CURRENT_DATE - INTERVAL '1 year';
-- Query
SELECT *
FROM employees
WHERE department = 'IT';
-- Query
SELECT * FROM employees WHERE emp_name LIKE '%a%';
-- Create table
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(50),
price DECIMAL(10, 2)
);
-- Insert data
INSERT INTO products (product_id, product_name, price) VALUES
(1, 'Laptop', 800.00),
(2, 'Smartphone', 300.00),
(3, 'Tablet', 150.00),
(4, 'Headphones', 50.00),
(5, 'Monitor', 250.00);
-- Query
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
-- Query
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
-- Query
SELECT * FROM products ORDER BY price DESC LIMIT 1;
-- Query
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;
-- Query
SELECT * FROM employees WHERE salary < (SELECT AVG(salary) FROM employees);
-- Insert data
INSERT INTO orders (order_id, customer_name, total_amount) VALUES
(1, 'John', 150.00),
(2, 'Anna', 250.50),
(3, 'John', 175.75),
(4, 'Laura', 120.00);
-- Query
SELECT * FROM orders WHERE customer_name = 'John';
-- Create table
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(50)
);
-- Insert data
INSERT INTO customers (customer_id, customer_name) VALUES
(1, 'John'),
(2, 'Anna'),
(3, 'Sam'),
(4, 'Laura');
-- Query
SELECT c.customer_name
FROM customers c
LEFT JOIN orders o ON c.customer_name = o.customer_name
WHERE o.order_id IS NULL;
Retrieve orders placed within the last 30 days.
-- Query
SELECT * FROM orders WHERE order_id IN
(SELECT order_id FROM orders WHERE order_date >= CURRENT_DATE - INTERVAL '30
DAY');
-- Query
SELECT customer_name, COUNT(*) AS order_count
FROM orders
GROUP BY customer_name
HAVING COUNT(*) > 1;
Get the date when the maximum number of orders were placed.
-- Query
SELECT order_date, COUNT(*) AS order_count
FROM orders
GROUP BY order_date
ORDER BY order_count DESC LIMIT 1;
-- Create table
CREATE TABLE sales (
sale_id INT PRIMARY KEY,
product_id INT,
quantity_sold INT,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
-- Insert data
INSERT INTO sales (sale_id, product_id, quantity_sold) VALUES
(1, 1, 50),
(2, 2, 150),
(3, 3, 200),
(4, 1, 75),
(5, 2, 80);
-- Query
SELECT p.product_name, SUM(s.quantity_sold) AS total_sold
FROM sales s
JOIN products p ON s.product_id = p.product_id
GROUP BY p.product_name
HAVING total_sold > 100;
-- Query
SELECT * FROM orders WHERE total_amount > 500;
-- Query
SELECT AVG(total_amount) AS average_order_value FROM orders;
-- Insert data
INSERT INTO employee_hiring (emp_id, emp_name, hiring_date) VALUES
(1, 'John', '2019-06-15'),
(2, 'Jane', '2021-01-20'),
(3, 'Mike', '2018-11-30'),
(4, 'Emily', '2020-05-15');
-- Query
SELECT * FROM employee_hiring WHERE hiring_date < '2020-01-01';
-- Insert data
INSERT INTO product_purchases (purchase_id, customer_name, product_name)
VALUES
(1, 'John', 'Laptop'),
(2, 'Anna', 'Smartphone'),
(3, 'Mike', 'Laptop'),
(4, 'Laura', 'Tablet');
-- Query
SELECT DISTINCT customer_name
FROM product_purchases
WHERE product_name = 'Laptop';
-- Insert data
INSERT INTO order_shipping (order_id, shipping_city) VALUES
(1, 'New York'),
(2, 'Los Angeles'),
(3, 'New York'),
(4, 'Chicago');
-- Query
SELECT o.*
FROM orders o
JOIN order_shipping s ON o.order_id = s.order_id
WHERE s.shipping_city = 'New York';
-- Query
SELECT p.product_name
FROM products p
LEFT JOIN sales s ON p.product_id = s.product_id
WHERE s.sale_id IS NULL;
Count the number of orders placed in each month.
-- Query
SELECT DATE_TRUNC('month', order_date) AS month, COUNT(*) AS total_orders
FROM orders
GROUP BY month;
List employees who have held more than one job title.
-- Insert data
INSERT INTO employee_jobs (emp_id, job_title) VALUES
(1, 'Manager'),
(1, 'Senior Manager'),
(2, 'Analyst'),
(3, 'Analyst'),
(3, 'Senior Analyst');
-- Query
SELECT emp_id, COUNT(DISTINCT job_title) AS job_count
FROM employee_jobs
GROUP BY emp_id
HAVING COUNT(DISTINCT job_title) > 1;
-- Query
SELECT customer_name, MIN(order_id) AS first_order_id
FROM orders
GROUP BY customer_name;
Find the percentage of total sales contributed by each product.
-- Query
SELECT p.product_name,
SUM(s.quantity_sold) * 100.0 / (SELECT SUM(quantity_sold) FROM sales) AS
sales_percentage
FROM sales s
JOIN products p ON s.product_id = p.product_id
GROUP BY p.product_name;
-- Query
SELECT customer_name, SUM(total_amount) AS total_purchase
FROM orders
GROUP BY customer_name
ORDER BY total_purchase DESC
LIMIT 1;
-- Insert data
INSERT INTO employee_salaries (emp_id, salary, hiring_year) VALUES
(1, 4000, 2019),
(2, 5000, 2020),
(3, 6000, 2021),
(4, 7000, 2022);
-- Query
SELECT hiring_year, AVG(salary) AS average_salary
FROM employee_salaries
GROUP BY hiring_year;
-- Insert data
INSERT INTO product_stock (product_id, stock) VALUES
(1, 50),
(2, 20),
(3, 10),
(4, 0);
-- Query
SELECT p.product_name
FROM products p
JOIN product_stock ps ON p.product_id = ps.product_id
WHERE ps.stock < 20;
-- Insert data
INSERT INTO product_stock (product_id, stock) VALUES
(1, 50),
(2, 20),
(3, 10),
(4, 0);
-- Query
SELECT p.product_name
FROM products p
JOIN product_stock ps ON p.product_id = ps.product_id
WHERE ps.stock < 20;
-- Query
SELECT job_title, GROUP_CONCAT(emp_name) AS employees
FROM employee_jobs
GROUP BY job_title
HAVING COUNT(emp_id) > 1;
-- Query
SELECT * FROM employee_hiring WHERE hiring_date > '2020-01-01';
-- Query
SELECT c.customer_name
FROM customers c
LEFT JOIN product_purchases pp ON c.customer_name = pp.customer_name
WHERE pp.purchase_id IS NULL;
Count how many orders are in each status (e.g., shipped, pending).
-- Insert data
INSERT INTO order_status (order_id, status) VALUES
(1, 'Shipped'),
(2, 'Pending'),
(3, 'Shipped'),
(4, 'Pending');
-- Query
SELECT status, COUNT(*) AS order_count
FROM order_status
GROUP BY status;
Find employees who are within 5 years of retirement age (assumed to be 60).
-- Insert data
INSERT INTO employee_age (emp_id, emp_name, age) VALUES
(1, 'John', 55),
(2, 'Jane', 40),
(3, 'Mike', 59),
(4, 'Emily', 45);
-- Query
SELECT emp_name
FROM employee_age
WHERE age >= 55; -- Within 5 years of 60
-- Insert data
INSERT INTO sales_region (sale_id, region, amount) VALUES
(1, 'North', 150.00),
(2, 'South', 250.50),
(3, 'North', 175.75),
(4, 'East', 120.00);
-- Query
SELECT region, SUM(amount) AS total_sales
FROM sales_region
GROUP BY region;
-- Insert data
INSERT INTO employee_status (emp_id, status, termination_date) VALUES
(1, 'Active', NULL),
(2, 'Terminated', '2023-08-15'),
(3, 'Active', NULL),
(4, 'Terminated', '2024-02-01');
-- Query
SELECT (SELECT COUNT(*) FROM employee_status WHERE status = 'Terminated' AND
termination_date >= CURRENT_DATE - INTERVAL '1 year')::DECIMAL /
(SELECT COUNT(*) FROM employee_status) AS turnover_rate;
Calculate the average order value for each customer.
-- Query
SELECT customer_name, AVG(total_amount) AS average_order_value
FROM orders
GROUP BY customer_name;
-- Insert data
INSERT INTO product_returns (return_id, product_id, returned_quantity) VALUES
(1, 1, 5),
(2, 2, 15),
(3, 2, 2),
(4, 3, 1);
-- Query
SELECT p.product_name,
SUM(pr.returned_quantity) * 100.0 / SUM(s.quantity_sold) AS return_rate
FROM products p
JOIN product_returns pr ON p.product_id = pr.product_id
JOIN sales s ON p.product_id = s.product_id
GROUP BY p.product_name
HAVING return_rate > 10;
-- Insert data
INSERT INTO product_discounts (product_id, discount_percentage) VALUES
(1, 10.00),
(2, 25.00),
(3, 30.00),
(4, 15.00);
-- Query
SELECT p.product_name
FROM products p
JOIN product_discounts d ON p.product_id = d.product_id
WHERE d.discount_percentage > 20;
-- Query
SELECT p.product_name, SUM(s.quantity_sold) AS total_quantity_sold
FROM sales s
JOIN products p ON s.product_id = p.product_id
GROUP BY p.product_name
ORDER BY total_quantity_sold DESC
LIMIT 5;