SQL INNER JOIN 连接和SQL UNION连接

SQL INNER JOIN 关键字

INNER JOIN 是 SQL 中最常用的连接方式之一,用于从多个表中根据它们之间的关系提取匹配的记录。

INNER JOIN 关键字在表中存在至少一个匹配时返回行,返回的是两个表中满足连接条件的交集,即同时存在于两个表中的数据。

SQL INNER JOIN 语法

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

或:

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

参数说明:

  • columns:要显示的列名。
  • table1:表1的名称。
  • table2:表2的名称。
  • column_name:表中用于连接的列名。

注释:INNER JOIN 与 JOIN 是相同的。

SQL INNER JOIN

假设有两个表:Students 和 Enrollments。

Students 表

StudentID Name Age
1 Alice 22
2 Bob 23
3 Charlie 24

Enrollments 表

EnrollmentID StudentID Course
101 1 Math
102 2 Science
103 4 History
使用 INNER JOIN 查询
SELECT Students.Name, Enrollments.Course
FROM Students
INNER JOIN Enrollments
ON Students.StudentID = Enrollments.StudentID;

得到结果如下:

Name Course
Alice Math
Bob Science

解释INNER JOIN 返回的是 Students 和 Enrollments 表中 StudentID 匹配的数据。没有匹配上的记录(如 Charlie 和 EnrollmentID 为 103 的数据)将被排除。


演示数据库

在本教程中,我们将使用 RUNOOB 样本数据库。

下面是选自 "Websites" 表的数据:

+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | 菜鸟教程      | http://www.runoob.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

下面是 "access_log" 网站访问记录表的数据:

mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)

SQL INNER JOIN 实例

下面的 SQL 语句将返回所有网站的访问记录:

实例

SELECT Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count;

执行以上 SQL 输出结果如下:

注释:INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Websites" 表中的行在 "access_log" 中没有匹配,则不会列出这些行。

SQL LEFT JOIN 关键字

LEFT JOIN 是 SQL 中的一个连接关键字,用于从多个表中提取数据。

LEFT JOIN 与 INNER JOIN 不同之处在于,LEFT JOIN 会返回左表中的所有记录,即使在右表中没有匹配的记录。

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SQL LEFT JOIN 语法

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

或:

SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.c
### SQLUNION 操作与连接JOIN)之间的区别 #### 1. 功能定位差异 UNION 主要用于合并多个 `SELECT` 语句的结果集,这些结果集会被垂直叠加在一起形成一个新的结果集合[^1]。而 JOIN 则侧重于横向拼接多张表中的记录,在此基础上还可以通过设定条件来筛选出满足特定关系的数据行[^2]。 #### 2. 数据处理方式的不同 当使用 UNION 合并查询时,默认情况下会自动去除重复项;如果希望保留所有的匹配条目,则应采用 UNION ALL 来代替标准形式下的 UNION。相比之下,JOIN 类型更为多样,包括 INNER JOIN、LEFT JOIN RIGHT JOIN 等多种形式,每种都能实现不同程度上的关联操作,并允许开发者精确控制如何对待不完全配对的情况[^3]。 #### 3. 结果集中列的数量顺序规定 对于 UNION 而言,参与联合运算的所有 SELECT 子句所返回的列数必须相同,并且相应位置上的数据类型也需兼容一致[^4]。至于 JOIN 的情况,由于其本质在于跨表间建立联系而非简单地堆积行列,因此并不严格限定两方之间存在相等数量或类型的属性列表——只要能提供有效的联结依据即可完成任务。 ```sql -- Example of using UNION to combine results vertically without duplicates. SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; -- An example demonstrating an INNER JOIN which retrieves only the matching rows between two tables based on a specified condition. SELECT t1.column_name, t2.another_column FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.common_field = t2.common_field; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋进学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值