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无(两个表结构和列数必须同等)否
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |