Lab 07: Outer Joins
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 run -d --name pg-lab -e POSTGRES_PASSWORD=rootpass postgres:15
sleep 10
docker exec mysql-lab mysql -uroot -prootpass << 'EOF'
CREATE DATABASE joinlab;
USE joinlab;
CREATE TABLE customers (
customer_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100),
city VARCHAR(50),
PRIMARY KEY (customer_id)
);
CREATE TABLE orders (
order_id INT NOT NULL AUTO_INCREMENT,
customer_id INT,
total DECIMAL(10,2),
order_date DATE,
status VARCHAR(20) DEFAULT 'pending',
PRIMARY KEY (order_id),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CREATE TABLE categories (
cat_id INT NOT NULL AUTO_INCREMENT,
cat_name VARCHAR(50) NOT NULL,
PRIMARY KEY (cat_id)
);
CREATE TABLE products (
product_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100),
cat_id INT,
price DECIMAL(10,2),
PRIMARY KEY (product_id),
FOREIGN KEY (cat_id) REFERENCES categories(cat_id)
);
INSERT INTO customers (name, email, city) VALUES
('Alice Brown', '[email protected]', 'New York'),
('Bob Chen', '[email protected]', 'Chicago'),
('Carol Davis', '[email protected]', 'Houston'),
('David Evans', '[email protected]', 'Phoenix'),
('Eve Foster', NULL, 'Boston'); -- no email
INSERT INTO orders (customer_id, total, order_date, status) VALUES
(1, 299.99, '2024-01-10', 'completed'),
(1, 149.50, '2024-01-25', 'completed'),
(2, 89.99, '2024-02-05', 'completed'),
(3, 499.00, '2024-02-18', 'shipped'),
(1, 75.00, '2024-03-01', 'pending'),
(NULL, 55.00,'2024-03-05', 'pending'); -- guest order (no customer)
INSERT INTO categories (cat_name) VALUES
('Electronics'), ('Books'), ('Clothing'), ('Sports');
INSERT INTO products (name, cat_id, price) VALUES
('Laptop', 1, 999.99),
('Phone', 1, 499.99),
('SQL Guide', 2, 39.99),
('T-Shirt', 3, 19.99),
('Running Shoes',3, 89.99),
('Yoga Mat', NULL, 29.99); -- uncategorized product
EOFStep 2: LEFT JOIN
Step 3: RIGHT JOIN
Step 4: Finding Unmatched Rows — Anti-Join Pattern
Step 5: FULL OUTER JOIN (PostgreSQL)
Step 6: CROSS JOIN
Step 7: Multi-Table Outer Join
Step 8: Capstone — Category Coverage Report
Summary
Join Type
Returns
Syntax
Last updated
