SQL Joins
You Are Here
Objectives
- Define "Foreign Key"
- Define "Join" as it relates to databases
- Write join queries in SQL
- Distinguish between different join types
Foreign Key
Database tables have references to other tables.
user
blog_post
User Id
Foreign Key
user
blog_post
user_id
CREATE TABLE user (
user_id bigserial primary key,
username text NOT NULL
);
CREATE TABLE blog_post (
blog_post_id bigserial primary key,
user_id bigserial references user(user_id),
post_text text
);
- One table "points" to another table using a foreign key
- In our case, each `blog_post` points to exactly one `user`
Foreign Key
user
blog_post
user_id
1; teb-a-licious
2; liz-a-tronic
3; cho-a-ramic
1; 1; "blogs rule"
2; 1; "blogs are fine"
3; 3; "I like blogging"
4; 2; "blogs are divine"
Foreign Key relationships are "One to Many"
Foreign Key
user
blog_post
user_id
1; teb-a-licious
2; liz-a-tronic
3; cho-a-ramic
1; 1; "blogs rule"
2; 1; "blogs are fine"
3; 3; "I like blogging"
4; 2; "blogs are divine"
CREATE TABLE user (
user_id bigserial primary key,
username text NOT NULL
);
CREATE TABLE blog_post (
blog_post_id bigserial primary key,
user_id bigserial references user(user_id),
post_text text
);
Joins
-
Joins require two tables.
-
The result is a temporary table.
-
This table has data from both input tables.
-
Joins use an "on" clause to define the relationship between the tables.
-
To join user and blog_post with the shared user_id:
select * from user
join blog_post on user.user_id=blog_post.user_id;
Simple Join
result: "temporary table"
teb-a-licious
teb-a-licious
liz-a-tronic
cho-a-ramic
"blogs rule"
"blogs are fine"
"blogs are divine"
"I like blogging"
select
user.username,
blog_post.post_text
from user
join blog_post on user.user_id=blog_post.user_id;
Chain Joins
In SQL you can chain joins together as much as you'd like
user
blog_post
user_id
comment
blog_post_id
Chain Joins
Lets say we want all the comments on a blog post as well as the original author and the original blog_text.
select
user.username as author,
blog_post.post_text as post_text,
comment.comment_text as comment_content,
from user
join blog_post on user.user_id=blog_post.user_id
join comment on comment.blog_post_id=blog_post.blog_post_id;
author | post_text | comment_text |
---|
Join Types
Set Theory in Venn Diagrams
You Are Here
Join Types
Remember, you're always joining exactly 2 tables
id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja
Lets use this sample dataset to explore join types
(http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/)
Join Types
There are 4 main join types
Inner
Full Outer
Left
Right
Inner Join
Inner joins target records where both tables match. Inner joins do not result in nulls since they require a match by definition.
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 Ninja
Full Outer Join
Full Outer Joins target ALL records from BOTH tables. Nulls appear when either side has an unmatched record.
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader
Full Outer Join+
We can target the opposite of an inner join using a where clause
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null
id name id name
-- ---- -- ----
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader
Left Outer Join
Left Outer Joins target records from the first table and then attach the data from the second table. Nulls appear when there isn't a match on the right hand table
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
Left Outer Join+
If we add a where clause, we can select only results which don't have a right hand side match for our temporary table
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
where TableB.id IS null
id name id name
-- ---- -- ----
2 Monkey null null
4 Spaghetti null null
Right Joins use the second table as their starting point
Recap!
- Define "Foreign Key"
- Define "Join" as it relates to databases
- Write join queries in SQL
- Distinguish between different join types
Questions?
Database Joins
By Tyler Bettilyon
Database Joins
- 1,658