高级联结表
迄今为止我们所使用的只是内联结的简单联结,但SQL除了内联结还有外联结(OUTER JOIN),当然也有人叫左联结、右联结以及全联结,其实都是一个意思,只要理解了内联结和外联结,左右联结就不难了,这也使最常用的高级联结了。
| 注意:在学习高级联结前,我们先来学习一个特殊功能表别名,故名思意就是给表起个别名,这样可以在一条SELECT中多次使用同一个表,别名只是在查询中使用,不会返回 |
1.1 使用别名
下面我们来看一个例子:
SQL语句:
SELECT cust_name,cust_contact
From Customers AS C,Orders AS O,OrderItems AS OI
WHERE C.cust_id=o.cust_id
AND OI.order_num=o.order_num
AND prod_id='RGAN01'
输出结果
![]() |
SQL语句分析:可以看到FROM子语句中的三个表全都有别名,Customers AS C 使用C作为别名,如此等等,这样的话就可以省略Customers了,别名不仅可以在SELECT子语句中使用,还可以在WHERE、ORDER BY中使用。
1.2 外联结
许多联结都是将一个表中的行与另一个表中的行进行关联,但有时候需要包含那些没有关联行的那些行,这些联结包含了那些在相关表中没有关联行的行的联结就叫外联结,听起来不叫拗口,也不容易理解,没关系用心体会下,下面的例子:
SQL语句:
SELECT Customers.cust_id,orders.order_num
From Customers LEFT OUTER JOIN Orders
ON Customers.cust_id=ORDERS.cust_id
输出结果:
![]() |
SQL语句分析:
可以看到使用外联结时筛选出了一条order_num为NULL的数据,这里其实可以这样理解,LEFT是以匹配语句的左侧数据表为准,将左侧表中的所有数据筛选出,出现NULL就意味着这条数据并不满足筛选条件,当然RIGHT也就是以右侧表为准,上局语句中的左侧表就是Customers了。
注意:
- 说实话这地方确实难以理解,有时候在实际情况中也是难以取舍
- 内联结INNER JOIN也可使用LEFT 和RIGHT,内联结使用LFET和RIGHT时,可以省略INNER,直接用LEFT JOIN即可
- 外联结OUTER JOIN在使用的使用必须配LEFT和RIGHT一起使用
- 这里可以说一下我的理解供大家理解,内联结就是很严谨匹配,只有符合筛选条件的才能被筛选出,外联结就是可以筛选出那些不满足筛选条件的数据,LEFT和RIGHT就是体现哪侧优先原则,FULL就更好理解了就是全部
1.3 带聚集函数的联结
聚集函数使用来汇总数据的,迄今为止我们局的聚集函数都是从一个表中汇总数据,但是这些函数也是可以与联结一起使用的。下来我们看一个例子:
SQL语句:
SELECT cUSTOMERS.cust_id,COUNT(Orders.order_num) AS num_ord
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id
输出结果:
![]() |
sql语句解析:这条SELECT语句是使用INNER JOIN将Customers和Orders表相互关联。Group BY 子语句按顾客进行分组数据,函数条用COUNT对每个客户的订单技术,并将它们作为num_ord返回
总结:
- 一般我们使用的内联结,但是用外联结也有效。
- 使用联结时应总是提供联结条件,否则会得出笛卡尔积
- 在一个联结中可以包含多个表,甚至可以对每个联结采用不同的联结类型
本文介绍了SQL Server中的高级联结表概念,包括内联结、外联结(LEFT JOIN、RIGHT JOIN)和全联结。通过实例展示了如何使用别名简化查询,以及在外联结中如何处理没有关联行的行。同时,解释了带有聚集函数的联结操作,如COUNT函数在联结查询中的应用。总结指出,使用联结时应提供联结条件,避免笛卡尔积,并且可以灵活结合不同类型的联结。




2157

被折叠的 条评论
为什么被折叠?



