SQL | 自联接 Self Join
有时你可能需要获取位于同一个表中的相关数据。为此,你可以使用一种特殊的联接,称为自联接(Self Join)。在今天的文章中,我们将学习如何使用 Navicat Premium 作为数据库客户端编写包含自联接的查询。如果你没未使用过 Navicat Premium,欢迎点击这里下载14天免费全功能试用版。
语法
自联接的基本语法如下:
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_field = b.common_field;
除了通用字段的链接之外,WHERE 子句还可以根据你的特定要求包含其他表达式。
例子
在 Sakila 示例数据库中,有一个 customer 表,其中包含与客户相关的信息,例如他们的姓名,电子邮箱和地址。以下是 Navicat 表设计器中的列:
我们可以使用自联接来检索姓氏与其他客户的名字相匹配的所有客户。我们通过为 customer 表分配别名来实现这一目标。别名允许我们将表与自身联接,因为它们为表提供了两个唯一的名称,这意味着我们可以当它们是两个不同的表进行查询。然后以 last_name 和 first_name 字段将它们联接:
SELECT
c1.customer_id as customer_1_id,
c1.first_name as customer_1_first_name,
c1.last_name as customer_1_last_name,
c2.customer_id as customer_2_id,
c2.first_name as customer_2_first_name,
c2.last_name
FROM customer c1,
customer c2
WHERE c1.last_name = c2.first_name
ORDER BY c1.last_name;
Navicat 的自动完成功能在编写查询时非常有用,因为它有助于避免拼写错误并猜测列名。因此,它对于选择字段特别有用:
运行查询会生成以下结果:
使用 INNER JOINN
将表与自身联接的另一种方法是使用 INNER JOIN。如果你不确定如何做到这一点,Navicat 可以帮助你!它提供了一个名为“查询创建工具”的有用工具,用于直观地构建查询。它允许你在不太了解 SQL 的情况下创建和编辑查询。数据库对象显示在左侧窗格中。而在右侧窗格分为两部分:上面的“图表设计”窗格和下面的“语法”窗格。
我们只需将第一个表别名的 last_name 字段拖到第二个表别名的 first_name,查询创建工具就会为我们生成联接!
这是生成的 SQL 语句
SELECT
c1.customer_id AS customer_1_id,
c1.first_name AS customer_1_first_name,
c1.last_name AS customer_1_last_name,
c2.customer_id AS customer_2_id,
c2.first_name AS customer_2_first_name,
c2.last_name
FROM
customer AS c1
INNER JOIN customer AS c2 ON c1.last_name = c2.first_name
ORDER BY
customer_1_last_name ASC
;
总结
在今天的文章中,我们学习了如何使用 Navicat Premium 编写包含自联接的查询。请尝试 Navicat Premium。你可以完全免费试用它 14 天!
往期回顾
相关文章
- Sql server在另一台服务器,在Visual Studio 中没问题,IIS中 提示“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。。。。”
- SQL JOIN - WHERE clause vs. ON clause
- 数据库根据两列数据得到层级关系SQL Queries to Manage Hierarchical or Parent-child Relational Rows in SQL Server
- sql server 获取字符串长度, 判断字符串长度,获取字段长度, 判断字段长度
- SQL存储过程中“ while (@@fetch_status=0)”是什么意思? fetch Next From into 是什么意思?
- Oracle中模拟SQL中的isnull函数
- 第八十八章 SQL命令 WHERE(一)
- 第八十章 SQL命令 UNION
- 第八十九章 SQL函数 LOG
- 从简单Sql探索优化之道
- sql之left join、right join、inner join的区别
- 《SQL初学者指南(第2版)》——2.2 语法注释
- sql模糊查询,解除绑定的单号
- 实战案例:Sql client使用sql操作FlinkCDC2Hudi、支持从savepoint恢复hudi作业
- sql之left join、right join、inner join的区别
- 数据库入门必读书籍推荐《Beginning Database Design》和《《Beginning SQL Queries》
- sql server 小技巧(3) SQL Server 2012 数据库完整导出到SQL Azure (包括数据)
- SQL之流程控制函数
- Jsp页面,结果集分页和sql(top)分页的性能对比
- SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)
- 程序员眼中的 SQL Server-执行计划教会我如何创建索引?
- 简单十步让你全面理解SQL
- SQL Server监控系列之调优排错
- sql语法:inner join on, left join on, right join on具体用法
- 怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优
- 怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优
- 【bat】sql server在多台服务器上执行SQL脚本
- 【sql server压测】sql server使用Diskspd测试SQL Server IO存储
- 如何查看正在执行sql的语句及其父语句调用?如何查看正在执行SQL的具体参数值与执行计划?xml执行计划转为图形计划
- (4.8)SQL Server DAC——专用管理员连接
- 转载:sql用逗号连接多张表对应哪个join?
- SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
- SQL学习之Insert的特殊用法(插入检索出的数据,表之间的数据复制)
- SQL Server中使用convert进行日期转换
- sql-常见的SQL优化