SQL 自连接
自连接 是一种将表的记录与自身结合的连接类型,正如其名称所示。
假设一个组织在组织圣诞派对时,根据一些颜色为其员工选择一个“秘密圣诞老人”。设计的方法是将每个员工分配给一个颜色,并让他们从各种颜色的池中选择一个颜色。最终,他们将成为一个被分配了该颜色的员工的“秘密圣诞老人”。
如下图所示,与颜色分配和每个员工选择的颜色相关的信息被输入到一张表中。使用自连接将表格与自身连接起来,通过颜色列将员工与其“秘密圣诞老人”匹配。
SQL自连接
SQL自连接用于将一个表连接到自身,就好像该表是两个表一样。为了进行此操作,至少应该使用表的别名一次。
自连接是一种内连接的类型,当需要比较同一表的两列时执行,可能是为了建立它们之间的关系。换句话说,当表中同时包含外键和主键时,它与自身连接。
与其他连接查询不同,我们使用WHERE子句来指定表与自身组合的条件,而不是使用ON子句。
语法
以下是SQL自连接的基本语法:
在这里,WHERE从句可以根据您的需求是任何给定的表达式。
示例
自连接仅需要一张表;所以,让我们创建一个CUSTOMERS表,里面包含客户的详细信息,如他们的姓名、年龄、地址和工资。
现在,使用INSERT语句将值插入该表中,如下所示 –
表将会被创建成−
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | MP | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
现在让我们使用以下自连接查询来加入这个表。我们的目标是根据他们的收入建立客户之间的关系。我们正在使用WHERE子句来实现这一点。
输出:
显示的结果表将列出所有收入较低的客户:
ID | EARNS_HIGHER | EARNS_LESS | LOWER_SALARY |
---|---|---|---|
2 | Ramesh | Khilan | 1500.00 |
2 | Kaushik | Khilan | 1500.00 |
6 | Chaitali | Komal | 4500.00 |
3 | Chaitali | Kaushik | 2000.00 |
2 | Chaitali | Khilan | 1500.00 |
1 | Chaitali | Ramesh | 2000.00 |
6 | Hardik | Komal | 4500.00 |
4 | Hardik | Chaitali | 6500.00 |
3 | Hardik | Kaushik | 2000.00 |
2 | Hardik | Khilan | 1500.00 |
1 | Hardik | Ramesh | 2000.00 |
3 | Komal | Kaushik | 2000.00 |
2 | Komal | Khilan | 1500.00 |
1 | Komal | Ramesh | 2000.00 |
6 | Muffy | Komal | 4500.00 |
5 | Muffy | Hardik | 8500.00 |
4 | Muffy | Chaitali | 6500.00 |
3 | Muffy | Kaushik | 2000.00 |
2 | Muffy | Khilan | 1500.00 |
1 | Muffy | Ramesh | 2000.00 |
自连接和ORDER BY子句
在自连接时,可以使用ORDER BY子句对合并表中的记录进行排序。
语法
以下是其语法:
示例
让我们继续使用下面展示的相同的CUSTOMERS表 –
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | MP | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
在WHERE子句上使用自连接,让我们将CUSTOMERS表与自身连接;然后,使用ORDER BY子句根据指定列按升序排列记录,如下所示的查询。
输出
结果表如下所示−
ID | EARNS_HIGHER | EARNS_LESS | LOWER_SALARY |
---|---|---|---|
2 | Ramesh | Khilan | 1500.00 |
2 | Kaushik | Khilan | 1500.00 |
2 | Chaitali | Khilan | 1500.00 |
2 | Hardik | Khilan | 1500.00 |
2 | Komal | Khilan | 1500.00 |
2 | Muffy | Khilan | 1500.00 |
3 | Chaitali | Kaushik | 2000.00 |
1 | Chaitali | Ramesh | 2000.00 |
3 | Hardik | Kaushik | 2000.00 |
1 | Hardik | Ramesh | 2000.00 |
3 | Komal | Kaushik | 2000.00 |
1 | Komal | Ramesh | 2000.00 |
3 | Muffy | Kaushik | 2000.00 |
1 | Muffy | Ramesh | 2000.00 |
6 | Chaitali | Komal | 4500.00 |
6 | Hardik | Komal | 4500.00 |
6 | Muffy | Komal | 4500.00 |
4 | Hardik | Chaitali | 6500.00 |
4 | Muffy | Chaitali | 6500.00 |
5 | Muffy | Hardik | 8500.00 |
不仅仅是工资一栏,记录可以根据姓名的字母顺序、客户ID的数字顺序等进行排序。