第一步:认识join
join分为inner join 和 outer join
inner join 就一种
outer join 分为 left outer join,right outer join,full outer join(其中的outer都可以省略)
第二步:通过实例概念上认识join
1.准备数据
SQL>select * from a;
编号 姓名
---- ----------
1000 张三
2000 李四
3000 王五
SQL>select * from b;
编号 商品
---- ----------
1000 电视机
2000 录像机
4000 自行车
2.inner join 效果(把符合条件的留下,不符合的全不要)
SQL>select a.*,b.* from a inner join b on a.编号=b.编号;
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
3.left join 效果(符合条件的留下,左表中不符合条件的留下,右表中不符合的不要)
SQL>select a.*,b.* from a left join b on a.编号=b.编号;
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
3000 王五 空值 空值
3.right join 效果(符合条件的留下,右表中不符合条件的留下,左表中不符合的不要)
SQL>select a.*,b.* from a right join b on a.编号=b.编号;
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
空值 空值 4000 自行车
3.full join 效果(符合条件的留下,不符合条件的都留下)
SQL>select a.*,b.* from a full join b on a.编号=b.编号;
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
3000 王五 空值 空值
空值 空值 4000 自行车
第三步:光知道概念还不行,还需要有应用
比如我们想对某人的消费项目进行汇总,对应以下两个表:theme 与 themedetail
theme 的记录为:
themeid(int) themename(varchar[10])
1 就餐
2 出差
3 乘车
4 其它
themedetail 的记录为:
detailid(int) themeid(int) price(money)
1 1 12.5
2 1 5
3 1 6
4 2 11
5 2 17
6 3 8
其中 theme 中的 themeid 与 themedetail 中的 themeid 是一对多的关系,
对 themedetail 表的理解如下:
“就餐”费用为 12.5 + 5 + 6 = 23.5 元,
“出差”费用为 11 + 17 = 28 元,
“乘车”费用为 8 = 8 元,
“其它”费用不存在,视为 0 处理,
对应的 sql 语句可以这样表示:
(强调一句,凡是需要select 出来的就要有相应的group by)
select theme.themename, isnull(sum(themede
tail.price), 0) as totalprice
from theme inner join themedetail on theme.themeid = themedetail.themeid
group by theme.themename, theme.themeid
order by theme.themeid
执行结果如下:
themename totalprice
就餐 23.5
出差 28
乘车 8
对于消费记录不存的记录如果就这样不显示它的话,使用内联的方法就可以满足要求了,
但是我们现在需要对 theme 中的每一项均做统计,
也包括“其它”项,于是我们应该采用另一种方法来实现,
这就是左外联的方法,相应的 sql 语句可以这样表示:
select theme.themename, isnull(sum(themedetail.price), 0) as totalprice
from theme left outer join themedetail on theme.themeid = themedetail.themeid
group by theme.themename,theme.themeid
order by theme.themeid
执行结果如下:
themename totalprice
就餐 23.5
出差 28
乘车 8
其它 0
第四部:从文字描述上再次认识join
(一)内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的
列值。内连接分三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结
果中列出被连接表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的
列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选
择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
(二) 外连接
外连接,返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左
外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录;
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录;
例如1:SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
例如2:SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username