SQL内连接详解及图解
一、什么是 SQL 中的内部连接?
只要列之间匹配,INNER JOIN 就会从两个参与表中选择所有行。SQL INNER JOIN 与 JOIN 子句相同,将两个或多个表中的行组合在一起。
SQL Inner Join 的图示:
语法:
SELECT *
FROM table1 INNER JOIN table2
ON table1.column_name = table2.column_name;
或者:
SELECT *
FROM table1
JOIN table2
ON table1.column_name = table2.column_name;
SQL 中的 INNER JOIN 使用比较运算符根据特定条件的匹配来连接两个表。
语法图 - INNER JOIN
示例:两个表之间的 SQL INNER JOIN
下面是两个表之间的 SQL 内部联接示例。
foods 样品表:食品
ITEM_ID | ITEM_NAME | ITEM_UNIT | COMPANY_ID |
1 | Chex Mix | Pcs | 16 |
6 | Cheez-It | Pcs | 15 |
2 | BN Biscuit | Pcs | 15 |
3 | Mighty Munch | Pcs | 17 |
4 | Pot Rice | Pcs | 15 |
5 | Jaffa Cakes | Pcs | 18 |
7 | Salt n Shake | Pcs |
company 示例表:公司
COMPANY_ID | COMPANY_NAME | COMPANY_CITY |
18 | Order All | Boston |
15 | Jack Hill Ltd | London |
16 | Akas Foods | Delhi |
17 | Foodies. | London |
19 | sip-n-Bite. | New York |
要连接物料名称、食物表中的物料单位列和公司名称、公司表中的公司城市列,条件如下:
1.食物和公司餐桌的company_id必须相同,可以使用以下 SQL 语句:
SELECT foods.item_name,foods.item_unit,
company.company_name,company.company_city
FROM foods
INNER JOIN company
ON foods.company_id =company.company_id;
输出结果:
ITEM_NAME ITEM_ COMPANY_NAME COMPANY_CITY ------------------------- ----- ------------------------- -------------- Chex Mix Pcs Akas Foods Delhi Cheez-It Pcs Jack Hill Ltd London BN Biscuit Pcs Jack Hill Ltd London Mighty Munch Pcs Foodies. London Pot Rice Pcs Jack Hill Ltd London Jaffa Cakes Pcs Order All Boston
使用 JOIN 关键字的 SQL INNER JOIN 示例
要从食物表中获取项目名称、项目单位列和公司名称,从公司表中获取公司城市列,在连接这些提到的表后,条件如下
1.食品公司ID和公司表公司ID必须相同,可以使用以下 SQL 语句:
SELECT foods.item_name,foods.item_unit,
company.company_name,company.company_city
FROM foods
JOIN company
ON foods.company_id =company.company_id;
ITEM_NAME ITEM_ COMPANY_NAME COMPANY_CITY ------------------------- ----- ------------------------- ------------- Chex Mix Pcs Akas Foods Delhi Cheez-It Pcs Jack Hill Ltd London BN Biscuit Pcs Jack Hill Ltd London Mighty Munch Pcs Foodies. London Pot Rice Pcs Jack Hill Ltd London Jaffa Cakes Pcs Order All Boston
公司和食物表的 SQL 内部联接的图形表示:
二、所有列的 SQL INNER JOIN
加入后从食物和公司表中获取所有列,条件如下
1.食品公司ID和公司表公司ID必须相同,可以使用以下 SQL 语句:
SELECT *
FROM foods
JOIN company
ON foods.company_id =company.company_id;
输出结果:
ITEM_ID ITEM_NAME ITEM_ COMPAN COMPAN COMPANY_NAME COMPANY_CITY -------- ------------------------- ----- ------ ------ ------------------------- ------------- 1 Chex Mix Pcs 16 16 Akas Foods Delhi 6 Cheez-It Pcs 15 15 Jack Hill Ltd London 2 BN Biscuit Pcs 15 15 Jack Hill Ltd London 3 Mighty Munch Pcs 17 17 Foodies. London 4 Pot Rice Pcs 15 15 Jack Hill Ltd London 5 Jaffa Cakes Pcs 18 18 Order All Boston
三、JOIN 和 INNER JOIN 之间的区别
1.JOIN 返回一个表的键记录等于另一个表的键记录的表中的所有行。
2.只要列之间匹配,INNER JOIN 就会从两个参与表中选择所有行。SQL INNER JOIN 与 JOIN 子句相同,将两个或多个表中的行组合在一起。
3.内部联接使用比较运算符,根据每个表的公共列中的值来匹配两个表中的行。例如,检索学生表和课程表的学生标识号相同的所有行。
JOIN 子句
SELECT * FROM
Table1 JOIN Table2
ON Table1.column_name=Table2.column_name;
INNER JOIN 子句
SELECT *
FROM Table1 INNER JOIN Table2
ON Table1.column_name= Table2.column_name;
四、INNER JOIN 和 OUTER JOIN 之间的区别
INNER JOIN 就是这样一种联接类型,它从一个表的键记录等于另一个表的键记录的两个参与表中返回所有行。这种类型的联接需要比较运算符根据两个表的公共字段或列来匹配参与表中的行。
其中,OUTER JOIN 返回参与表中满足条件的所有行,以及与条件不匹配的行将出现在此操作中。此结果集可以采用三种类型的格式 。
第一个是 LEFT OUTER JOIN,在此联接中包括 JOIN 子句的左表中的所有行和右表中具有所选列的 NULL 值的不匹配行。
第二个是 RIGHT OUTER JOIN,在此联接中包括 JOIN cause 右侧的所有行和左侧表中具有所选列的 NULL 值的不匹配行。
FULL OUTER JOIN 中的最后一个,在此联接中,包括 JOIN 子句的左右表中的匹配行,以及左右表中具有所选列的 NULL 值的不匹配行。
示例:
这里有两个表 tableX 和 tableY,它们每个表中没有重复的行。在表X中,值(A,B)是唯一的,在表Y中,值(E,F)是唯一的,但值(C和D)在两个表中是通用的。
INNER JOIN 示例:
SELECT *
FROM tableX
INNER JOIN tableY on tableX.X = tableY.Y;
或者:
SELECT tableX.*,tableY.*
FROM tableX,tableY
WHERE tableX.X = tableY.Y;
输出结果:
这里只有 tableX 和 tableY 的匹配出现在结果集中。
LEFT OUTER JOIN示例:
SELECT tableX.*,tableY.*
FROM tableX,tableY
WHERE tableX.X = tableY.Y(+)
或者:
SELECT *
FROM tableX
LEFT OUTER JOIN tableY ON tableX.X= tableY.Y
输出:
这里出现了 tableX 中的所有行(即 JOIN 子句的左侧)和 tableY(即 JOIN 子句右侧)中所有具有 NULL 值的不匹配列的行。
RIGHT OUTER JOIN示例:
SELECT * FROM tableX
RIGHT OUTER JOIN tableY ON tableX.X= tableY.Y
输出:
这里出现了 tableY(即 JOIN 子句右侧)中的所有行,以及 tableX 中(即 JOIN 子句左侧)中所有具有 NULL 值的行。
FULL OUTER JOIN示例:
SELECT *
FROM tableX
FULL OUTER JOIN tableY ON tableX.X= tableY.Y
输出:
这里显示了 tableX 和 tableY 中的所有匹配行,以及两个表的 NULL 值为空的所有不匹配行。
五、INNER JOIN ON 与 WHERE 子句
WHERE 子句,所做的是将所有与 WHERE 条件匹配的记录都包含在结果集中,但 INNER JOIN 是,与 JOIN 条件不匹配的数据将从结果集中排除。
两个或多个表之间的链接应使用 INNER JOIN ON 子句完成,但对单个数据元素的筛选应使用 WHERE 子句完成。
INNER JOIN 是 ANSI 语法,而 WHERE 语法更面向关系模型。
INNER JOIN 通常被认为更具可读性,它是表的笛卡尔乘积,尤其是当您联接大量表时,但可以使用 WHERE 子句在匹配列上筛选两个表 JOIN'ed 的结果。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/499.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。