数据库中的连接运算

一、定义

连接一般定义为 R ∞ S A θ B \underset{A \theta B}{R \infty S} AθBRS,其中 ∞ \infty 表示连接运算符, θ \theta θ 为比较运算符, A θ B A\theta B AθB 是条件表达式。含义是 R R R S S S 的笛卡尔积 R × S R \times S R×S 中选取 R R R 关系在 A A A 属性组上的值与 S S S 关系在 B B B 属性组上的值满足比较关系 θ θ θ 的元组

连接操作是数据库中用于将两个或多个表的数据行合并在一起的操作,常用于在不同表之间建立关联以进行查询。连接操作有多种类型,包括内连接、外连接以及交叉连接。

  1. 内连接(Inner Join):内连接是连接操作的一种,它返回两个表之间满足连接条件的所有行,等值连接是一种特殊的内连接,而自然连接是一种特殊的等值连接。
    • 等值连接(Equi Join):比较运算符 θ \theta θ = = = 的连接运算称为等值连接,它是从关系 R R R S S S 的广义笛卡尔积中选取 A A A B B B 属性值相等的那些元组。
    • 自然连接(Natural Join):自然连接是等值连接的一种特殊形式,它会自动匹配两个表中具有相同列名的列,并将它们用作连接条件。此外自然连接还会自动去除重复的列,因此不需要指定连接条件。

  1. 外连接(Outer Join):外连接用于返回连接操作中的全部数据行,包括未匹配到的数据行,它分为左外连接、右外连接和全外连接。
    • 左外连接(Left Outer Join):左外连接会返回左表中的所有数据行,同时返回右表中与左表匹配的数据行。如果没有匹配的数据行,右表中的列将包含 NULL 值。
    • 右外连接(Right Outer Join):右外连接与左外连接类似,但会返回右表的所有数据行以及与左表匹配的数据行。如果没有匹配的数据行,左表中的列将包含 NULL 值。
    • 全外连接(Full Outer Join):全外连接返回左表和右表的所有数据行,如果没有匹配的数据行,对应的列将包含 NULL 值。

  1. 交叉连接(Cross Join):交叉连接返回两个表的笛卡尔积,即左表中的每个数据行都与右表中的所有数据行组合在一起。交叉连接得到的结果包含大量数据行,通常需要谨慎使用。

二、示例

省份表 provinces 与 省会表 capital

-- 创建省份表
DROP TABLE IF EXISTS provinces;
CREATE TABLE provinces
(
    province_name VARCHAR(255),
    country_name  VARCHAR(255),
    capital_name       VARCHAR(255)
);

-- 插入省份数据
INSERT INTO provinces (province_name, country_name, capital_name)
VALUES ('Guangdong', 'China', 'Guangzhou'),
       ('Sichuan', 'China', 'Chengdu'),
       ('Jiangsu', 'China', 'Nanjing'),
       ('California', 'USA', 'Sacramento'),
       ('Hawaii', 'USA', 'Honolulu'),
       ('Texas', 'USA', 'Houston');
province_namecountry_namecapital_name
GuangdongChinaGuangzhou
SichuanChinaChengdu
JiangsuChinaNanjing
CaliforniaUSASacramento
HawaiiUSAHonolulu
TexasUSAHouston
-- 创建省会表
DROP TABLE IF EXISTS capital;
CREATE TABLE capital
(
    capital_name VARCHAR(255),
    population   INT
);

-- 插入省会数据
INSERT INTO capital (capital_name, population)
VALUES ('Guangzhou', 15000000),
       ('Nanjing', 8000000),
       ('Sacramento', 500000),
       ('Honolulu', 380000),
       ('Tokyo', 14000000),
       ('London', 9000000);
capital_namepopulation
Guangzhou15000000
Nanjing8000000
Sacramento500000
Honolulu380000
Tokyo14000000
London9000000

2.1 等值连接

SELECT *
FROM provinces
JOIN capital ON provinces.capital_name = capital.capital_name;
province_namecountry_nameprovinces.capital_namecapital.capital_namepopulation
GuangdongChinaGuangzhouGuangzhou15000000
JiangsuChinaNanjingNanjing8000000
CaliforniaUSASacramentoSacramento500000
HawaiiUSAHonoluluHonolulu380000

2.2 自然连接

SELECT *
FROM provinces
NATURAL JOIN capital;
capital_nameprovince_namecountry_namepopulation
GuangzhouGuangdongChina15000000
NanjingJiangsuChina8000000
SacramentoCaliforniaUSA500000
HonoluluHawaiiUSA380000

2.3 左外连接

SELECT *
FROM provinces
LEFT JOIN capital ON provinces.capital_name = capital.capital_name;
province_namecountry_namecapital_namecapital_namepopulation
GuangdongChinaGuangzhouGuangzhou15000000
SichuanChinaChengdunullnull
JiangsuChinaNanjingNanjing8000000
CaliforniaUSASacramentoSacramento500000
HawaiiUSAHonoluluHonolulu380000
TexasUSAHoustonnullnull

2.4 右外连接

SELECT *
FROM provinces
RIGHT JOIN capital ON provinces.capital_name = capital.capital_name;
province_namecountry_namecapital_namecapital_namepopulation
GuangdongChinaGuangzhouGuangzhou15000000
JiangsuChinaNanjingNanjing8000000
CaliforniaUSASacramentoSacramento500000
HawaiiUSAHonoluluHonolulu380000
nullnullnullTokyo14000000
nullnullnullLondon9000000

2.5 全外连接

MySQL 不支持全外连接,这里只对相应结果进行展示。

province_namecountry_namecapital_namecapital_namepopulation
GuangdongChinaGuangzhouGuangzhou15000000
SichuanChinaChengdunullnull
JiangsuChinaNanjingNanjing8000000
CaliforniaUSASacramentoSacramento500000
HawaiiUSAHonoluluHonolulu380000
TexasUSAHoustonnullnull
nullnullnullTokyo14000000
nullnullnullLondon9000000

2.6 交叉连接

交叉连接得到的是两张表数据的乘积,所以以下两种写法是等价的:

SELECT *
FROM provinces
CROSS JOIN capital;

SELECT *
FROM provinces, capital;
province_namecountry_namecapital_namecapital_namepopulation
TexasUSAHoustonGuangzhou15000000
HawaiiUSAHonoluluGuangzhou15000000
CaliforniaUSASacramentoGuangzhou15000000
JiangsuChinaNanjingGuangzhou15000000
SichuanChinaChengduGuangzhou15000000
GuangdongChinaGuangzhouGuangzhou15000000
TexasUSAHoustonNanjing8000000
HawaiiUSAHonoluluNanjing8000000
CaliforniaUSASacramentoNanjing8000000
JiangsuChinaNanjingNanjing8000000
SichuanChinaChengduNanjing8000000
GuangdongChinaGuangzhouNanjing8000000
TexasUSAHoustonSacramento500000
HawaiiUSAHonoluluSacramento500000
CaliforniaUSASacramentoSacramento500000
JiangsuChinaNanjingSacramento500000
SichuanChinaChengduSacramento500000
GuangdongChinaGuangzhouSacramento500000
TexasUSAHoustonHonolulu380000
HawaiiUSAHonoluluHonolulu380000
CaliforniaUSASacramentoHonolulu380000
JiangsuChinaNanjingHonolulu380000
SichuanChinaChengduHonolulu380000
GuangdongChinaGuangzhouHonolulu380000
TexasUSAHoustonTokyo14000000
HawaiiUSAHonoluluTokyo14000000
CaliforniaUSASacramentoTokyo14000000
JiangsuChinaNanjingTokyo14000000
SichuanChinaChengduTokyo14000000
GuangdongChinaGuangzhouTokyo14000000
TexasUSAHoustonLondon9000000
HawaiiUSAHonoluluLondon9000000
CaliforniaUSASacramentoLondon9000000
JiangsuChinaNanjingLondon9000000
SichuanChinaChengduLondon9000000
GuangdongChinaGuangzhouLondon9000000

在这里插入图片描述

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值