数据库中表的连接

本文详细介绍了数据库中表的连接方法,包括AS用于设置别名以提高SQL语句的可读性,交叉连接(Cross Join)、内连接(Inner Join)、自然连接(Natural Join)、外连接(Outter Join)以及自连接(Self-Join)的各种应用场景和示例。此外,还提到了联合(UNION)、交集(INTERSECT)和差集(EXCEPT)的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍数据库之间表的连接。

====================================================================================================================================

  • AS

AS可以用来设置表或者列的别名。

当数据库中的表越来也越多时,如果碰巧要操作两个相似的表或者列,为了更好地对其进行区分,可以采用设置别名的方式增加SQL语句的可读性,帮助理解。

<pre name="code" class="sql">SELECT a.field1, b.field1, from your_table1 AS a NATURAL JOIN your_table2 AS b; #表your_table1设置别名为a,给表your_table2设置别名为b
#为了简化操作AS关键字其实也可以省略
SELECT a.field1, b.field1, from your_table1 a NATURAL JOIN your_table2 b;


AS关键字还有一个用法,即可以将select语句查询出的内容填充进新的列里。

<pre name="code" class="sql">CREAT  TABLE new_table(
          id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
          profession VARCHAR(10)
) AS
SELECT profession FROM table_exists; #可将从表table_exists中查询到的profession列直接填充到表new_table中的profession列
 
将上表的查询语句进行适当修改,令其更加规范
CREAT  TABLE new_table(
          id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
          prof VARCHAR(10)
) AS
SELECT te.prof AS prof FROM table_exists AS te;


  • 连接

交叉连接(Cross Join)俗称笛卡尔积,该连接方法返回表中所有行的相乘的结果。若存在表A和表B分表储存了人的姓名和鞋履的品牌。

表A

 

表B

id(主键)

姓名

 

鞋子id(主键)

品牌

1

王五

 

1

耐科

2

陈琪

 

2

锐不

3

邱钢

 

3

阿迪达是

4

斯研

 

4

特不

 

<pre name="code" class="sql">SELECT A.姓名, B.品牌 FROM A CROSS JOIN B; #交叉连接关键字为CROSS JOIN 
#上述查询将返回如下结果

 

返回结果

姓名

品牌

王五

耐科

王五

锐不

王五

阿迪达是

王五

特不

陈琪

耐科

陈琪

锐不

陈琪

阿迪达是

陈琪

特不

。。。

。。。

 

内连接(Inner Join)考虑到了具体的查询条件从而对个别列进行了筛选和移除之后的结果。若存在表A和表B分别表示个人信息以及车牌信息。

 

表A

 

表B

姓名

注册人id(主键)

 

注册人id(外键)

车牌号码

车牌id

王五

1

 

1

1234

1

陈琪

2

 

1

1231

2

邱钢

3

 

2

2343

3

斯午

4

 

3

4532

4

 

<pre name="code" class="sql">SELECT A.姓名, B.车牌号码 FROM A INNER JOIN B WHERE A.注册人id = B.注册人id; #内连接关键字为INNER JOIN, WHERE关键字也可以换成ON, 同时可以采用其他比较运算符如>,<,>=,<=
#上述查询将返回如下结果

 

返回结果

姓名

车牌号码

王五

1234

王五

1231

陈琪

2343

邱钢

4532

 

自然链接(Natural Join)属于一种特殊的内连接,只有在所要连接的两个表拥有相同名称的列时才会有用。若存在表A和表B分别表示个人信息以及车牌信息,且两个表中同时存在相同的字段名称“注册人id”。

 

表A

 

表B

姓名

注册人id(主键)

 

注册人id(外键)

车牌号码

车牌id(主键)

王五

1

 

1

1234

1

陈琪

2

 

1

1231

2

邱钢

3

 

2

2343

3

斯午

4

 

3

4532

4

 

<pre name="code" class="sql">SELECT A.姓名, B.车牌号码 FROM A NATURAL JOIN B; #省略了WHERE/ON关键字后面的内外键比较部分
 #且上述查询将返回和之前的内连接一样的结果

 

返回结果

姓名

车牌号码

王五

1234

王五

1231

陈琪

2343

邱钢

4532

 

外连接(Outter Join)返回某张表的所有行,并且带有来自另外一张表的条件相符的行。外连接对数据表有严格的位置放置要求,且分为左外连接和右外连接。外连接和内连接相比一定会提供相应的数据行,无论其在另一个表中是否能找到相匹配的内容,若不存在相匹配内容则会返回NULL。若存在表A和表B分别表示个人信息以及车牌信息,且两个表中同时存在相同的字段名称“注册人id”。

 

表A

 

表B

姓名

注册人id(主键)

 

注册人id(外键)

车牌号码

车牌id(主键)

王五

1

 

1

1234

1

陈琪

2

 

1

1231

2

邱钢

3

 

2

2343

3

斯午

4

 

3

4532

4

 

SELECT A.姓名, B.车牌号码 FROM A LEFT OUTER JOIN B ON A.注册人id=B.注册人id; 
<pre name="code" class="sql">#左外连接,左表比右表,没有找到对应斯午的车牌号码,所以返回NULL

 

返回结果

姓名

车牌号码

王五

1234

王五

1231

陈琪

2343

邱钢

4532

斯午

NULL

 

SELECT A.姓名, B.车牌号码 FROM A RIGHT OUTER JOIN B ON A.注册人id=B.注册人id; 
<pre name="code" class="sql"> #右外连接,右表比左表,右表中没有注册人id为4的车牌号,所以不会返回任何和注册人id为4有关的信息

 

返回结果

姓名

车牌号码

王五

1234

王五

1231

陈琪

2343

邱钢

4532

 

自连接(Self-Join)即表自身与自身连接,比如存在表A描述某公司员工层级情况。王五为最高级别了领导,直属手下是邱钢和李去,这两个人各自又带有部分雇员。

 

表A

id

姓名

领导id

1

王五

1

2

陈琪

3

3

邱钢

1

4

斯午

3

5

科右

3

6

李去

1

7

南迪

6

8

凡勇

6

9

博伊

6

 

SELECT A1.姓名, A2.姓名 AS 领导姓名 FROM A AS A1 INNER JOIN A AS A2 ON A2.领导id.= A1.id; #表A1,A2其实都是表A本身

 

返回结果

姓名

领导姓名

王五

1234

王五

1231

陈琪

2343

邱钢

4532

 

* 联合(UNION)/交集(INTERSECT)/差集(EXCEPT)(MySQL中无后面两项)这三个概念基本上参照数学上的集合和韦恩图的概念即可,不做过多解释,UNION还有一个可选项是UNION ALL(和UNION相比剔除了“过滤重复值”的功能)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值