一、连接查询和联合查询基本知识
(一)连接查询
若一个查询同时涉及两个或两个以上的表,则称之为连接查询,连接查询可分为内连接、外连接和交叉连接。
1.内连接
内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的纪录。结果只保留满足条件的记录。
关键字:innerjoinon
基本语法:selecta.列1,a.列2,...,a.列n,b.列1,b.列2,...,b.列nfromainnerjoinbon条件;
2.外连接
外连接的返回结果中不仅包含符合连接条件的行,还会包括左表、右表或两个表中的所有数据行,这三种情况分别称为左连接,右连接,和全连接(mysql没有全连接,要实现全连接可用左连接+UNION+右连接实现)。
①左连接
左表保持不动,右表在右侧滑动,用右表匹配左表。结果保留左表的所有行,右表中不匹配的行默认填充为空值NULL。
关键字:leftjoinon
基本语法:selecta.列1,a.列2,...,a.列n,b.列1,b.列2,...,b.列nfromaleftjoinbon条件;
②右连接
右表保持不动,左表在左侧滑动,用左表匹配右表。结果保留右表的所有行,左表中不匹配的行默认填充为空值NULL。
关键字:rightjoinon
基本语法:selecta.列1,a.列2,...,a.列n,b.列1,b.列2,...,b.列nfromarightjoinbon条件;
3.交叉连接
交叉连接的返回结果是被连接的两个表中的所有数据行的笛卡儿积,也就是返回第一个表中符合查询条件的数据行乘以第二个表中符合查询条件的数据行数。从结果看,就是两个表中所有数据的组合,在实际开发中,一般不会使用交叉连接,而是使用具体的条件,对数据进行有目的的查询,加了where条件的交叉连接返回结果与内连接一致。
关键字:crossjoin[where条件]
基本语法:selecta.列1,a.列2,...,a.列n,b.列1,b.列2,...,b.列nfromacrossjoinb[where条件],使用时crossjoin可省略即selecta.列1,a.列2,...,a.列n,b.列1,b.列2,...,b.列nfromab[where条件];
(二)联合查询
关键字:union/unionall
union与unionall的区别:union会把多个查询语句的结果合并后去重,unionall会保留所有的查询结果。
二、查询举例
下图为商品表和品牌表数据。
(一)连接查询
1.内连接:查询所有商品的商品名、品牌名、商品价格以及商品数量。
2.外链接
2.1左连接:查询所有品牌旗下的商品信息;
2.2右连接:查询所有品牌旗下的商品信息;
3.交叉连接:查询所有商品的商品名、品牌名、商品价格以及商品数量。
(二)联合查询
下图为会员表数据
查询会员表中的重庆、杭州的会员姓名并合并。
1.union
2.unionall