Learn SQL/Intermediate/Joins/SQL Primary Keys and Foreign Keys

SQL Primary Keys and Foreign Keys

The two concepts that make every join in this series possible — a unique identifier on one side, and a reference to it on the other.

What & Why

A primary key (PK) uniquely identifies each row in a table — no two rows can share the same value, and it can't be NULL. A foreign key (FK) is a column in one table holding a primary key value from another table, creating the actual link a join relies on.

See How It Works

BUSINESS QUESTION

Marketing uses campaigns.id as the parent key and leads.campaign_id as its declared foreign key.

idcampaign_idemailcreated_atqualified_atconverted_atlead_scoresourcecountry
3011ana@example.com2024-01-21 09:10:00+002024-01-22 11:00:00+002024-02-02 10:00:00+0086google_adsUS
3021ben@example.com2024-01-24 12:40:00+00NULLNULL52google_adsCA
3032chloe@example.com2024-02-16 08:30:00+002024-02-18 14:20:00+00NULL74emailGB
3043dev@example.com2024-03-20 17:15:00+002024-03-21 09:00:00+002024-04-04 16:00:00+0091linkedinUS
idnamechannelspendstart_dateend_datestatustarget_segment
1Spring Launchgoogle_ads55000.002024-01-152024-03-31activesmb
2Retention Webinaremail45000.002024-02-102024-04-15activeenterprise
3Finance Retargetinglinkedin50000.002024-03-122024-05-31activeenterprise
4Enterprise Searchgoogle_ads60000.002024-04-012024-06-30activeenterprise
EXAMPLE QUERY
SELECT
  l.id AS lead_id,
  l.campaign_id,
  c.name AS campaign_name
FROM marketing.leads l
JOIN marketing.campaigns c
  ON c.id = l.campaign_id
ORDER BY lead_id;
RESULT — exact output from the displayed Queryflo rows
lead_idcampaign_idcampaign_name
3011Spring Launch
3021Spring Launch
3032Retention Webinar
3043Finance Retargeting

Every displayed foreign key resolves to its campaign primary key.

Now You Try

Practice this concept

Marketing wants each lead id and campaign foreign key beside the referenced campaign name, ordered by lead id.

Available schema
marketing

Prefix tables with marketing.table_name.

lead_idcampaign_idcampaign_name
marketing.campaigns
ColumnType
idinteger
nametext
channeltext
spendnumeric
start_datedate
end_datedate
statustext
target_segmenttext
legacy_idtext
marketing.leads
ColumnType
idinteger
campaign_idinteger
emailtext
created_attimestamp with time zone
qualified_attimestamp with time zone
converted_attimestamp with time zone
lead_scoreinteger
sourcetext
countrytext
archive_statustext
query.sql
Intermediate business practice

Sign up free to try it on a real business scenario