七、连接查询

一、联接查询

联接查询的作用和分类:

通过联接查询可以将多个表作为一个表进行处理;

当检索数据时,通过联接查询可检索出源于不同表的信息,提高用户操作的灵活性;

联接查询分为:交叉联接、内联接和外联接
交叉联接:
笛卡尔积:
含义:两个集合中的每一个成员,都与对方集合中的任意一个成员有关联。即第一个表的行数乘以第二个表的行数等于笛卡尔积大小。

  --语法
  --fieldlist:表table1和表table2中的字段列表
  SELECT   fieldlist    FROM    table1
  CROSS  JOIN   table2
  <WHERE 条件表达式>
  --没有WHERE条件的交叉联接所生成的结果集即笛卡尔积。

不带WHERE条件的交叉联接中的列数=表table1与table2中列数之和;
不带WHERE条件的交叉联接中的行数=表table1与table2中行数之积。

--获取Employee表和Rank表的笛卡尔积
SELECT  * FROM  Employee  CROSS JOIN  Rank

内联接:
案例1:通过内联接获取两张表的全部数据:

  SELECT *  FROM  Employee  INNER  JOIN  Rank ON 
  Employee.RankID=Rank.RankID  
  --两表联接的条件  

案例2:通过内联接获取两张表的部分列数据:

SELECT   e.Name,  r.RankID,  r.RankName  --来源于两张表的部分列  
FROM  Employee  e  JOIN  Rank  r ON  e.RankID=r.RankID

案例3:查询每个职级的员工数和平均月基本工资,要求列出职级名:

--带聚合函数内联接(红色标记)
SELECT  r.RankName   职级名,   COUNT(e.EmployeeID)   员工数, AVG(Salary)   
平均月基本工资  FROM  Employee  e  JOIN  Rank  r ON  e.RankID=r.RankID  
GROUP  BY r.RankName

案例4:查询每个职级的员工数和平均月基本工资,要求列出职级名,但仅显示月平均 基本工资低于30000的分组信息:

SELECT  r.RankName   职级名,   COUNT(e.EmployeeID)   员工数, AVG(Salary)   
平均月基本工资  FROM  Employee  e  JOIN  Rank  r ON  e.RankID=r.RankID  
GROUP  BY r.RankNameHAVING AVG(Salary)<30000

外连接查询
在内连接查询中,只有满足连接条件的记录才能出现在查询结果中。但在实际应用中,如果希望不满足连接条件的记录也在查询结果中出现,这时需要使用外连接查询;根据不同的外连接形式,外连接所生成的结果集中不仅包含符合条件的数据记录,而且还包含左表或右表或左右表中所有的数据记录。

--语法:
SELECT 字段名称 FROM 表名1 LEFT|RIGHT|FULL [OUTER] JOIN 表名2 ON  表名1.字段名1=表名2.字段名2 

左外连接和右外连接:
左外连接(left join)的结果集包括左表的所有记录和右表中满足连接条件的记录,结果集中那些不符合连接条件的来源于右表的列值为NULL。
右外连接(right join)的结果集包括右表的所有记录和左表中满足连接条件的记录,结果集中那些不符合连接条件的来源于左表的列值为NULL。
二、多表连接
简单多表查询:

--table1, table2:在FROM子句中,直接列出所有要连接的表
SELECT    fieldlist    FROM    table1,table2
--在WHERE子句中指定连接条件,与内联接功能相同。如果没有WHERE子句,则结果为笛卡尔积
<WHERE  table1.column=table2.column>

三、总结:

  • 使用等值连接、非等值连接和自然连接获取客户订单信息
  • 使用多表连接获取客户详细订单信息
  • 使用左连接、右连接获取所有客户信息及其所下订单信息及其所下订单信息
  • 统计订单销售金额
    四、本章代码:
    内连接:
Select * from employee join rank on employee, rankID = rank.rankID
--显示部分信息
Select name, birthday, address, salary, rankName from employee e join rank r 
on e.rankID = r.rankID

多表连查询:

Select name, salary, deptName, rankName from employee e join department d 
on e.deptID = d.deptID Join rank r on e.rankID = r.rankID
--查询地址为深圳的员工:再最后加:where address = ‘深圳’
--采用简单多表连接查询(简单、方便)
Select name, salary, deptName, rankName from employee e, department d, rank r 
where e.deptID = d.deptID and e.rankID = r.rankID and address = ‘深圳’

外连接查询:

--查询无null 的员工信息
Select name, salary from employee e join rank r on e.RankID = r.RankID
--查询全部员工信息(左表/右表/全外连接查询)
Select name, salary, rankName from employee e left/right/full join rank r 
on e.RankID = r.RankID

连接查询的综合应用:

Select GoodsName 商品名, sum(od.Quantity) 销售量, sum(g.UnitPrice*od.Quantity) 销售金额 
from goods g left join orderDetail od on g.GoodsID = od.GoodsID where Category = ‘书籍’ 
group by GoodsName having sum(g.UnitPrice*od.Quantity) > 100 order by 销售金额

最后,一共有七篇文章,介绍了SQL Server 数据库的基本操作,每章都是个人写的笔记,仅供参考,如有不足/错误/补充等,欢迎评论……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值