join、union、关联查询

本文深入探讨了SQL中的各种连接类型,包括内连接、左连接、右连接和全连接,以及UNION和UNION ALL操作符的使用。详细解释了on、where和having子句的执行顺序和效率,帮助读者理解如何优化查询。

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

1、join、union、关联查询

  • 内连接查询 (select * from a join b on a.id = b.id)
  • 关联查询 (select * from a , b where a.id = b.id)
  • UNION 操作符用于合并两个或多个 SELECT 语句的结果集

2、on、where、having的执行顺序以及效率

from a join bfrom a, b 产生的临时表结果集 都是执行笛卡尔积即 (select * from a cross join b )两表的行乘积数

  • on:与取得结果集,同步进行数据筛选及过滤

  • where:获得结果集之后,才进行数据筛选及过滤。

执行顺序:on在上游,where在中游,having在下游。

3、left join、right join、inner join、full join

sql中的连接查询有inner join(内连接)、left join(左连接)、right join(右连接)、full join(全连接)四种方式,它们之间其实并没有太大区别,仅仅是查询出来的结果有所不同。

例如有两张表:

Orders表通过外键Id_P和Persons表进行关联。
在这里插入图片描述

3.1 inner join(内连接)

在两张表进行连接查询时,只保留两张表中完全匹配的结果集

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
INNER JOIN Orders o
ON p.Id_P=o.Id_P and 1=1  --用and连接多个条件
ORDER BY p.LastName

查询结果集:
在这里插入图片描述

注意:单纯的select * from a,b笛卡尔乘积。比如a表有5条数据,b表有3条数据,那么最后的结果有5*3=15条数据。

另:

  • 对两个表进行关联:select * from a,b where a.id = b.id
  • 此时就等价于内连接:select * from a inner join b on a.id = b.id

但是这种写法并不符合规范,可能只对某些数据库管用,如sqlserver。推荐最好不要这样写。最好写成inner join的写法

3.2 left join

在两张表进行连接查询时,会返回左表所有的行即使在右表中没有匹配的记录

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
LEFT JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

在这里插入图片描述

3.3 right join

在两张表进行连接查询时,会返回右表所有的行即使在左表中没有匹配的记录

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
RIGHT JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

在这里插入图片描述

3.4 full join

在两张表进行连接查询时,返回左表和右表中所有没有匹配的行。

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
FULL JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

在这里插入图片描述

4、UNION

UNION 操作符用于合并两个或多个 SELECT 语句的结果集,请注意UNION 内部的 SELECT 语句必须:

  • 拥有相同数量的列
  • 列必须拥有相似的数据类型
  • 每条 SELECT 语句中的列的顺序必须相同

默认地:

  • UNION 默认操作符选取不同的值
  • 如果允许重复的值,请使用 UNION ALL

在这里插入图片描述

4.1 UNION

列出所有在中国和美国的不同的雇员名:

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

结果:

这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值
在这里插入图片描述

4.2 UNION ALL

UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值

列出在中国和美国的所有的雇员:

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA

结果:
在这里插入图片描述
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值