Lab 08: Subqueries
Overview
Step 1: Setup
docker run -d --name mysql-lab -e MYSQL_ROOT_PASSWORD=rootpass mysql:8.0
for i in $(seq 1 30); do docker exec mysql-lab mysql -uroot -prootpass -e "SELECT 1" 2>/dev/null && break || sleep 2; done
docker exec mysql-lab mysql -uroot -prootpass << 'EOF'
CREATE DATABASE subquery_lab;
USE subquery_lab;
CREATE TABLE departments (
dept_id INT NOT NULL AUTO_INCREMENT,
dept_name VARCHAR(50) NOT NULL,
PRIMARY KEY (dept_id)
);
CREATE TABLE employees (
emp_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
dept_id INT,
salary DECIMAL(10,2),
hire_date DATE,
PRIMARY KEY (emp_id),
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
CREATE TABLE orders (
order_id INT NOT NULL AUTO_INCREMENT,
emp_id INT,
amount DECIMAL(10,2),
order_date DATE,
PRIMARY KEY (order_id),
FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);
INSERT INTO departments VALUES
(1,'Engineering'),(2,'Marketing'),(3,'HR'),(4,'Finance'),(5,'Legal');
INSERT INTO employees (name, dept_id, salary, hire_date) VALUES
('Alice Johnson', 1, 95000, '2020-03-15'),
('Bob Smith', 2, 72000, '2019-07-22'),
('Carol Davis', 1, 110000, '2018-01-10'),
('David Wilson', 3, 65000, '2021-09-01'),
('Eve Martinez', 1, 98000, '2020-11-30'),
('Frank Anderson', 2, 68000, '2022-02-14'),
('Grace Taylor', 3, 70000, '2019-05-20'),
('Henry Thomas', 1, 125000, '2017-08-05'),
('Isabel Jackson', 4, 88000, '2021-12-01'),
('Jack White', 4, 92000, '2020-06-18');
INSERT INTO orders (emp_id, amount, order_date) VALUES
(1, 1200.00, '2024-01-10'),
(1, 850.00, '2024-01-25'),
(2, 300.00, '2024-02-01'),
(3, 2100.00, '2024-02-15'),
(5, 950.00, '2024-03-01'),
(8, 3200.00, '2024-03-10'),
(9, 780.00, '2024-03-15');
EOFStep 2: Scalar Subquery
Step 3: IN / NOT IN Subquery
Step 4: EXISTS / NOT EXISTS
Step 5: Correlated Subquery
Step 6: Subquery in FROM (Derived Table)
Step 7: Subquery vs JOIN Comparison
Approach
When to use
Step 8: Capstone — Nested Subquery Report
Summary
Subquery Type
Returns
Typical Use
Last updated
