RELATIONSHIPS

AND JOINS

Finally.

So Far We've Been Working With Very Simple Data

But that's about to change

Real World Data Is Messy and Interrelated

Books

Authors

Customers

Orders

Genres

Reviews

Versions

So Where Do We Start?

Relationship Basics

This is not marriage counseling

  1. One to One Relationship
  2. One to Many Relationship
  3. Many to Many Relationship

Books

Authors

Customers

Orders

Genres

Reviews

Versions

Books

Authors

Customers

Orders

Genres

Reviews

Versions

Books

Authors

Customers

Orders

Genres

Reviews

Versions

1:MANY

The Most Common Relationship

CUSTOMERS & ORDERS

  • A customer's first and last name
  • A customer's email
  • The date of the purchase
  • The price of the order

We Want To Store...

first_name last_name email order_date amount
Boy  George george@gmail.com '2016/02/10' 99.99
Boy  ​George george@gmail.com '2017/11/11' 35.50
George Michael gm@gmail.com '2014/12/12' 800.67
George Michael gm@gmail.com '2015/01/03' 12.50
David  Bowie david@gmail.com NULL NULL
Blue Steele blue@gmail.com NULL NULL

We Could Use One Table...

NOT A GOOD IDEA

Customers

  • customer_id
  • first_name
  • last_name
  • email

Orders

  • order_id
  • order_date
  • amount
  • customer_id
customer_id first_name last_name email
1 Boy  George george@gmail.com
2 George Michael gm@gmail.com
3 David  Bowie david@gmail.com
4 Blue Steele blue@gmail.com
order_id order_date amount customer_id
1 '2016/02/10' 99.99 1
2 '2017/11/11' 35.50 1
3 '2014/12/12' 800.67 2
4 '2015/01/03' 12.50 2

CUSTOMERS

ORDERS

PRIMARY KEY

customer_id first_name last_name email
1 Boy  George george@gmail.com
2 George Michael gm@gmail.com
3 David  Bowie david@gmail.com
4 Blue Steele blue@gmail.com
order_id order_date amount customer_id
1 '2016/02/10' 99.99 1
2 '2017/11/11' 35.50 1
3 '2014/12/12' 800.67 2
4 '2015/01/03' 12.50 2

CUSTOMERS

ORDERS

FOREIGNKEY

id first_name last_name email
1 Boy  George george@gmail.com
2 George Michael gm@gmail.com
3 David  Bowie david@gmail.com
4 Blue Steele blue@gmail.com
id order_date amount customer_id
1 '2016/02/10' 99.99 1
2 '2017/11/11' 35.50 1
3 '2014/12/12' 800.67 2
4 '2015/01/03' 12.50 2

CUSTOMERS

ORDERS

Let's Get Coding!

I'm Sorry This Diagram Is So Ugly

INNER JOIN

A

B

Select all records from A and B where the join condition is met

SELECT * FROM customers
JOIN orders
    ON customers.id = orders.customer_id;

INNER JOIN

Customers

SELECT * FROM customers
JOIN orders
    ON customers.id = orders.customer_id;

Orders

LEFT JOIN

A

B

Select everything from A, along with any matching records in B

RIGHT JOIN

Select everything from B, along with any matching records in A

B

A

YOUR

TURN

STUDENTS

  • id
  • first_name

PAPERS

  • title
  • grade
  • student_id

WRITE THIS SCHEMA

INSERT INTO students (first_name) VALUES 
('Caleb'), ('Samantha'), ('Raj'), ('Carlos'), ('Lisa');

INSERT INTO papers (student_id, title, grade ) VALUES
(1, 'My First Book Report', 60),
(1, 'My Second Book Report', 75),
(2, 'Russian Lit Through The Ages', 94),
(2, 'De Montaigne and The Art of The Essay', 98),
(4, 'Borges and Magical Realism', 89);

INSERT THIS DATA

(COPY AND PASTE IT)

+------------+---------------------------------------+-------+
| first_name | title                                 | grade |
+------------+---------------------------------------+-------+
| Samantha   | De Montaigne and The Art of The Essay |    98 |
| Samantha   | Russian Lit Through The Ages          |    94 |
| Carlos     | Borges and Magical Realism            |    89 |
| Caleb      | My Second Book Report                 |    75 |
| Caleb      | My First Book Report                  |    60 |
+------------+---------------------------------------+-------+

PRINT THIS

+------------+---------------------------------------+-------+
| first_name | title                                 | grade |
+------------+---------------------------------------+-------+
| Caleb      | My First Book Report                  |    60 |
| Caleb      | My Second Book Report                 |    75 |
| Samantha   | Russian Lit Through The Ages          |    94 |
| Samantha   | De Montaigne and The Art of The Essay |    98 |
| Raj        | NULL                                  |  NULL |
| Carlos     | Borges and Magical Realism            |    89 |
| Lisa       | NULL                                  |  NULL |
+------------+---------------------------------------+-------+

PRINT THIS

+------------+---------------------------------------+-------+
| first_name | title                                 | grade |
+------------+---------------------------------------+-------+
| Caleb      | My First Book Report                  | 60    |
| Caleb      | My Second Book Report                 | 75    |
| Samantha   | Russian Lit Through The Ages          | 94    |
| Samantha   | De Montaigne and The Art of The Essay | 98    |
| Raj        | MISSING                               | 0     |
| Carlos     | Borges and Magical Realism            | 89    |
| Lisa       | MISSING                               | 0     |
+------------+---------------------------------------+-------+

PRINT THIS

+------------+---------+
| first_name | average |
+------------+---------+
| Samantha   | 96.0000 |
| Carlos     | 89.0000 |
| Caleb      | 67.5000 |
| Raj        | 0       |
| Lisa       | 0       |
+------------+---------+

PRINT THIS

+------------+---------+----------------+
| first_name | average | passing_status |
+------------+---------+----------------+
| Samantha   | 96.0000 | PASSING        |
| Carlos     | 89.0000 | PASSING        |
| Caleb      | 67.5000 | FAILING        |
| Raj        | 0       | FAILING        |
| Lisa       | 0       | FAILING        |
+------------+---------+----------------+

PRINT THIS

MANY:MANY

The Tiny Bit Trickier Relationship

Books       <-> Authors

Blog Post <-> Tags

Students  <-> Classes

Some Examples

Imagine we're building a  tv show reviewing application

Series Data

Reviewers Data

Reviews Data

id
first_name
last_name
id
title
released_year
genre
id
rating
series_id
reviewer_id

Reviewers

Series

Reviews

id first_name last_name
1 Blue Steele
2 Wyatt Earp
id title released_year genre
1 Archer 2009 Animation
2 Fargo 2014 Drama

Reviewers

Series

id rating reviewer_id series_id
1 8.9 1 2
2 9.5 2 2

Reviews

INSERT INTO series (title, released_year, genre) VALUES
    ('Archer', 2009, 'Animation'),
    ('Arrested Development', 2003, 'Comedy'),
    ("Bob's Burgers", 2011, 'Animation'),
    ('Bojack Horseman', 2014, 'Animation'),
    ("Breaking Bad", 2008, 'Drama'),
    ('Curb Your Enthusiasm', 2000, 'Comedy'),
    ("Fargo", 2014, 'Drama'),
    ('Freaks and Geeks', 1999, 'Comedy'),
    ('General Hospital', 1963, 'Drama'),
    ('Halt and Catch Fire', 2014, 'Drama'),
    ('Malcolm In The Middle', 2000, 'Comedy'),
    ('Pushing Daisies', 2007, 'Comedy'),
    ('Seinfeld', 1989, 'Comedy'),
    ('Stranger Things', 2016, 'Drama');

INSERT SERIES

INSERT INTO reviewers (first_name, last_name) VALUES
    ('Thomas', 'Stoneman'),
    ('Wyatt', 'Skaggs'),
    ('Kimbra', 'Masters'),
    ('Domingo', 'Cortes'),
    ('Colt', 'Steele'),
    ('Pinkie', 'Petit'),
    ('Marlon', 'Crafford');

INSERT REVIEWERS

INSERT INTO reviews(series_id, reviewer_id, rating) VALUES
    (1,1,8.0),(1,2,7.5),(1,3,8.5),(1,4,7.7),(1,5,8.9),
    (2,1,8.1),(2,4,6.0),(2,3,8.0),(2,6,8.4),(2,5,9.9),
    (3,1,7.0),(3,6,7.5),(3,4,8.0),(3,3,7.1),(3,5,8.0),
    (4,1,7.5),(4,3,7.8),(4,4,8.3),(4,2,7.6),(4,5,8.5),
    (5,1,9.5),(5,3,9.0),(5,4,9.1),(5,2,9.3),(5,5,9.9),
    (6,2,6.5),(6,3,7.8),(6,4,8.8),(6,2,8.4),(6,5,9.1),
    (7,2,9.1),(7,5,9.7),
    (8,4,8.5),(8,2,7.8),(8,6,8.8),(8,5,9.3),
    (9,2,5.5),(9,3,6.8),(9,4,5.8),(9,6,4.3),(9,5,4.5),
    (10,5,9.9),
    (13,3,8.0),(13,4,7.2),
    (14,2,8.5),(14,3,8.9),(14,4,8.9);

INSERT REVIEWS

NOW LET'S DO STUFF

+----------------------+--------+
| title                | rating |
+----------------------+--------+
| Archer               |    8.0 |
| Archer               |    7.5 |
| Archer               |    8.5 |
| Archer               |    7.7 |
| Archer               |    8.9 |
| Arrested Development |    8.1 |
| Arrested Development |    6.0 |
| Arrested Development |    8.0 |
| Arrested Development |    8.4 |
| Arrested Development |    9.9 |
| Bob's Burgers        |    7.0 |
| Bob's Burgers        |    7.5 |
| Bob's Burgers        |    8.0 |
| Bob's Burgers        |    7.1 |
| Bob's Burgers        |    8.0 |
+----------------------+--------+
+----------------------+------------+
| title                | avg_rating |
+----------------------+------------+
| General Hospital     |    5.38000 |
| Bob's Burgers        |    7.52000 |
| Seinfeld             |    7.60000 |
| Bojack Horseman      |    7.94000 |
| Arrested Development |    8.08000 |
| Curb Your Enthusiasm |    8.12000 |
| Archer               |    8.12000 |
| Freaks and Geeks     |    8.60000 |
| Stranger Things      |    8.76667 |
| Breaking Bad         |    9.36000 |
| Fargo                |    9.40000 |
| Halt and Catch Fire  |    9.90000 |
+----------------------+------------+
+------------+-----------+--------+
| first_name | last_name | rating |
+------------+-----------+--------+
| Thomas     | Stoneman  |    8.0 |
| Thomas     | Stoneman  |    8.1 |
| Thomas     | Stoneman  |    7.0 |
| Thomas     | Stoneman  |    7.5 |
| Thomas     | Stoneman  |    9.5 |
| Wyatt      | Skaggs    |    7.5 |
| Wyatt      | Skaggs    |    7.6 |
| Wyatt      | Skaggs    |    9.3 |
| Wyatt      | Skaggs    |    6.5 |
| Wyatt      | Skaggs    |    8.4 |
| Wyatt      | Skaggs    |    9.1 |
| Wyatt      | Skaggs    |    7.8 |
| Wyatt      | Skaggs    |    5.5 |
| Wyatt      | Skaggs    |    8.5 |
| Kimbra     | Masters   |    8.5 |
| Kimbra     | Masters   |    8.0 |
| Kimbra     | Masters   |    7.1 |
| Kimbra     | Masters   |    7.8 |
| Kimbra     | Masters   |    9.0 |
| Kimbra     | Masters   |    7.8 |
+------------+-----------+--------+
+-----------------------+
| unreviewed_series     |
+-----------------------+
| Malcolm In The Middle |
| Pushing Daisies       |
+-----------------------+
+-----------+------------+
| genre     | avg_rating |
+-----------+------------+
| Animation |    7.86000 |
| Comedy    |    8.16250 |
| Drama     |    8.04375 |
+-----------+------------+
+------------+-----------+-------+-----+-----+---------+----------+
| first_name | last_name | COUNT | MIN | MAX | AVG     | STATUS   |
+------------+-----------+-------+-----+-----+---------+----------+
| Thomas     | Stoneman  |     5 | 7.0 | 9.5 | 8.02000 | ACTIVE   |
| Wyatt      | Skaggs    |     9 | 5.5 | 9.3 | 7.80000 | ACTIVE   |
| Kimbra     | Masters   |     9 | 6.8 | 9.0 | 7.98889 | ACTIVE   |
| Domingo    | Cortes    |    10 | 5.8 | 9.1 | 7.83000 | ACTIVE   |
| Colt       | Steele    |    10 | 4.5 | 9.9 | 8.77000 | ACTIVE   |
| Pinkie     | Petit     |     4 | 4.3 | 8.8 | 7.25000 | ACTIVE   |
| Marlon     | Crafford  |     0 | 0.0 | 0.0 | 0.00000 | INACTIVE |
+------------+-----------+-------+-----+-----+---------+----------+
+----------------------+--------+-----------------+
| title                | rating | reviewer        |
+----------------------+--------+-----------------+
| Archer               |    8.0 | Thomas Stoneman |
| Archer               |    7.7 | Domingo Cortes  |
| Archer               |    8.5 | Kimbra Masters  |
| Archer               |    7.5 | Wyatt Skaggs    |
| Archer               |    8.9 | Colt Steele     |
| Arrested Development |    8.4 | Pinkie Petit    |
| Arrested Development |    9.9 | Colt Steele     |
| Arrested Development |    8.1 | Thomas Stoneman |
| Arrested Development |    6.0 | Domingo Cortes  |
| Arrested Development |    8.0 | Kimbra Masters  |
| Bob's Burgers        |    7.0 | Thomas Stoneman |
| Bob's Burgers        |    8.0 | Domingo Cortes  |
| Bob's Burgers        |    7.1 | Kimbra Masters  |
| Bob's Burgers        |    7.5 | Pinkie Petit    |
| Bob's Burgers        |    8.0 | Colt Steele     |
+----------------------+--------+-----------------+

MySQL

VIEWS

GROUP BY HAVING

GROUP BY ROLL UP

SQL

 MODES

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

Viewing Modes

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';

SETTING Modes

Copy of MySQL 2.0: Relationships and Joins

By Colt Steele

Copy of MySQL 2.0: Relationships and Joins

  • 5,156