前言
连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。前面章节的查询均是基于单表进行,但有时需要获取的信息存储于多张表中,此时就必须使用本章所介绍的多表连接查询技术来获取。例如,员工表只有职级号,而职级表包括职级号和职级名,如果想要获取某员工具体的职级名,则只能通过连接员工表和职级表,使用多表连接查询技术实现上述任务。
表之间的联系依赖于主键和外键,同样连接查询的连接列一般也是由外键担当。连接查询默认为内连接查询,如果希望不满足连接条件的记录也在查询结果中出现,这时就需要使用外连接。
目录
1、内连接
使用内连接获取客户“王传华”所有的订单信息和客户信息
使用内连接获取客户“王传华”下单日期在2017年4月之后的订单信息,要求显示客户姓名、下单日期。
多表连接
2、表别名
3、左外连接
外连接查询概念
统计每件商品的销售数量和销售金额,要求按照销售量和销售金额升序显示商品名、销售量和销售金额
计算每个订单的金额,要求按照订单下单日期升序、订单金额降序显示订单ID、订单下单日期、订单日期和顾客姓名
4、右外连接
1、内连接
内连接是应用程序中非常常见的连接操作,它一般都是默认的连接类型。内连接基于连接谓词,将两张表(假如有A表和B表)的列组合在一起,产生新的结果表。内连接查询会将A表的每一行和B表的每一行进行比较, 并找出满足连接谓词的组合。当连接谓词被满足,A表和B表中匹配的行会按列组合( 并排组合)成结果集中的一行。
join 表1 on 表.列名 = 表1.列名
select * from Employee join CityList on Employee.CityID= CityList.CityID
* 展示两表内所有列
如果同时关联多个表进行查询, join X on 以此类推
使用内连接获取客户“王传华”所有的订单信息和客户信息
使用内连接获取客户“王传华”下单日期在2017年4月之后的订单信息,要求显示客户姓名、下单日期。
查询之前数据:
查询之后:
select c.CustomerName,o.OrderDate from Customer c join orders o on c.CustomerID=o.CustomerID where c.CustomerName='王传华'and o.OrderDate>='2018-04-01'
多表连接
select * from OrdersDetail od join Goods g on od.GoodsID=g.GoodsID join Orders o on od.OrdersID=o.OrdersID join Customer c on o.CustomerID=c.CustomerID
2、表别名
表名 备注名 ,使用时,直接取 表别名.列名 Employee e -> e.列名
下面代码中黑体部分是表别名:
select * from OrdersDetail od join Goods g on od.GoodsID=g.GoodsID join Orders o on od.OrdersID=o.OrdersID join Customer c on o.CustomerID=c.CustomerID
3、左外连接
外连接查询概念
表之间的联系依赖于主键和外键,同样连接查询的连接列一般也是由外键担当。连接查询默认为内连接查询,如果希望不满足连接条件的记录也在查询结果中出现,这时就需要使用外连接。
左外连接的结果集包括左表的所有记录和右表中满足连接条件的记录,结果集中那些不符合连接条件的来源于右表的列值为Null
left join 表名1 on 表名.列名 = 表名1.列名
左侧表数据会全部进行展示
select e.Name , c.CityName from Employee e left join CityList c on e.CityID= c.CityID
统计每件商品的销售数量和销售金额,要求按照销售量和销售金额升序显示商品名、销售量和销售金额
select GoodsName 商品名,sum(Quantity)销售量 ,sum(Quantity*g.UnitPrice)销售金额 from OrdersDetail od join Goods g on od.GoodsID=g.GoodsID group by g.GoodsName order by 销售量,销售金额
查询之后:
计算每个订单的金额,要求按照订单下单日期升序、订单金额降序显示订单ID、订单下单日期、订单日期和顾客姓名
select o.OrdersID,o.OrderDate,o.Amount,c.CustomerName from Orders o join Customer c on o.CustomerID=c.CustomerID order by o.OrderDate,o.Amount desc
4、右外连接
右外连接跟左外连接一个道理同左外连接一样
right join 表名1 on 表名.列名 = 表名1.列名
右侧表数据会全部进行展示
select e.Name , c.CityName from Employee e right join CityList c on e.CityID= c.CityID