盛世宏图 发表于 2024-6-11 12:35:04

数据库-表毗连的几种方式

1. 数据库表毗连方式简介

在关系型数据库中,表与表之间的毗连黑白常紧张的操纵。毗连可以将两个或多个表中的数据进行归并,实现数据的查询和分析。常见的毗连方式有内毗连、左毗连、右毗连、全毗连、交织毗连和团结查询。下面将分别对这几种毗连方式进行详细介绍。
2. 内毗连(INNER JOIN)

用比较运算符比较要毗连的列的值的毗连,不匹配的行不会被体现。sql关键字JOIN 大概INNER JOIN,通常写成JOIN。
内毗连只返回两个表中共有的行,即两个表中毗连字段的值相称的行。内毗连的语法为:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
3. 左外毗连(LEFT JOIN)

① 外毗连又分为:左外毗连、右外毗连、全外毗连。
② 对应的sql关键字:LEFT/RIGHT/FULL OUTER JOIN,通常省略OUTER关键字,写成LEFT/RIGHT/FULL JOIN。
③ 在左、右外毗连中都会以一种表为基表,基表的所有行、列都会体现,外表假如和条件不匹配则所有的外表列值都为NULL。
全外毗连则所有表的行、列都会体现,条件不匹配的值皆为NULL。
左毗连返回左表中的所有行,以及右表中毗连字段的值和左表相称的行。假如右表中没有符合条件的行,则返回 NULL 值。左毗连的语法为:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
4. 右外毗连(RIGHT JOIN)

右毗连和左毗连相反,返回右表中的所有行,以及左表中毗连字段的值和右表相称的行。假如左表中没有符合条件的行,则返回 NULL 值。右毗连的语法为:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
5. 全毗连(FULL OUTER JOIN)

没有where条件的交织毗连将产生毗连表所涉及的笛卡尔积,即TableA的行数*TableB的行数的结果集。假如带where,返回或体现的是匹配的行数。(cross join后只能用where不能是on)
全毗连返回左右两个表中的所有行,并将左表和右表中毗连字段的值相称的行归并成一行。假如左表或右表中没有符合条件的行,则返回 NULL 值。全毗连的语法为:
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;
6. 交织毗连(CROSS JOIN)

交织毗连返回两个表中的所有可能的组合,也称为笛卡尔积。交织毗连的语法为:
SELECT column_name(s)
FROM table1
CROSS JOIN table2;
7. 团结查询(UNION)

团结查询将两个或多个表中的数据归并成一个结果集,不包罗重复的行。要求每个表中的列数和数据范例必须完全同等。团结查询的语法为:
SELECT column_name(s)
FROM table1
UNION
SELECT column_name(s)
FROM table2;
8. 案例分析

假设有两个表,分别为表 A 和表 B,它们的数据分别如下:
表 A:
idname1Alice2Bob3Cathy4David5Edward 表 B:
idage225330435640 现在需要通过毗连查询得到一个包罗两个表中所有行的结果集,它们的毗连字段为 id。则不同的毗连方式返回的结果如下:


[*]内毗连:
idnameage2Bob253Cathy304David35

[*]左毗连:
idnameage1AliceNULL2Bob253Cathy304David355EdwardNULL

[*]右毗连:
idnameage2Bob253Cathy304David356NULL40

[*]全毗连:
idnameage1AliceNULL2Bob253Cathy304David355EdwardNULL6NULL40

[*]交织毗连:
idnameage1Alice251Alice301Alice351Alice402Bob252Bob302Bob352Bob403Cathy253Cathy303Cathy353Cathy404David254David304David354David405Edward255Edward305Edward355Edward40

[*]团结查询:
idname1Alice2Bob3Cathy4David5Edward2NULL3NULL4NULL6NULL 9. 代码示例

下面是针对上述案例的 SQL 代码示例:
-- 创建表 A 并插入数据
CREATE TABLE A (
id INT PRIMARY KEY,
name VARCHAR(50)
);

INSERT INTO A VALUES (1, 'Alice');
INSERT INTO A VALUES (2, 'Bob');
INSERT INTO A VALUES (3, 'Cathy');
INSERT INTO A VALUES (4, 'David');
INSERT INTO A VALUES (5, 'Edward');

-- 创建表 B 并插入数据
CREATE TABLE B (
id INT PRIMARY KEY,
age INT
);

INSERT INTO B VALUES (2, 25);
INSERT INTO B VALUES (3, 30);
INSERT INTO B VALUES (4, 35);
INSERT INTO B VALUES (6, 40);

-- 内连接查询
SELECT A.id, A.name, B.age
FROM A
INNER JOIN B
ON A.id = B.id;

-- 左连接查询
SELECT A.id, A.name, B.age
FROM A
LEFT JOIN B
ON A.id = B.id;

-- 右连接查询
SELECT A.id, A.name, B.age
FROM A
RIGHT JOIN B
ON A.id = B.id;

-- 全连接查询
SELECT A.id, A.name, B.age
FROM A
FULL OUTER JOIN B
ON A.id = B.id;

-- 交叉连接查询
SELECT A.id, A.name, B.age
FROM A
CROSS JOIN B;

-- 联合查询
SELECT id, name
FROM A
UNION
SELECT id, NULL AS name
FROM B;
各个毗连的区别

毗连方式含义结果左表右表到场条件是否生存未匹配数据内毗连(INNER JOIN)只返回两个表中存在匹配的行匹配的行表A表BON条件否左外毗连(LEFT JOIN)返回左表中所有行和右表中与左表匹配的行匹配的行+左表未匹配行null值表A表BON条件右外毗连(RIGHT JOIN)返回右表中所有行和左表中与右表匹配的行匹配的行+右表未匹配行null值表A表BON条件全毗连(FULL OUTER JOIN)返回左表和右表中所有的行,假如匹配,则返回匹配的行匹配的行+左表未匹配行+右表未匹配行null值表A表BON条件交织毗连(CROSS JOIN)返回两个表中所有匹配的行笛卡尔积表A表B无(不需要条件)否团结查询(UNION)把两个表中的结果集归并在一起并去重归并且去重后的行表A表B无(两个表结构和列数必须同等)否 https://img-blog.csdnimg.cn/068f648edd864fd4aba1a917780c036d.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 数据库-表毗连的几种方式