八、连接查询概念与左连接语法以及左右内连接的区别

 一张表,就是一个集合,一行数据就是集合的一个元素。
理论上讲:不可能存在完全相同的两个行,但是表中可以完全相同的两行,
因为表内部有一个rowid
                     *
         *
集合相乘,就是笛卡尔积
其实就是两个集合的完全组合
问:设集合AM个元素,M个元素各不相同
设集合B,有N个元素,N个元素各不相同
A*B,得到的积,有M*N个元素,不可能重复。
 
A9行,表B10
两表相乘有9*10=90
select * from ta;
 
Id num
a,  5
b,  10
c,  15
d,  10
 
Select * from tb;
 
Id   num
b    5
c    10
d    20
e    99
 
select * from ta,tb;
id num id num
a 5 b 5
b 10 b 5
c 15 b 5
d 10 b 5
a 5 c 10
b 10 c 10
c 15 c 10
d 10 c 10
a 5 d 20
b 10 d 20
c 15 d 20
d 10 d 20
a 5 e 99
b 10 e 99
c 15 e 99
d 10 e 99
 
左连接,右连接,内连接
 
Goods表:
goods_id cat_id goods_name
1 4 KD876
4 8 诺基亚N85原装充电器
3 8 诺基亚原装5800耳机
5 11 索爱原装M2卡读卡器
6 11 胜创XINGMAX内存卡
7 8 诺基亚N85原装立体声耳机HS-82
8 3 飞利浦909V
9 3 诺基亚E66
10 3 索爱C702C
 
Category:
cat_id cat_name
1 手机类型
2 CDMA手机
3 GSM手机
4 3G手机
5 双模手机
6 手机配件
7 充电器
8 耳机
9 电池
11 读卡器和内存卡
12 充值卡
13 小灵通/固话充值卡
14 移动手机充值卡
15 联通手机充值卡
 
要从goodscategory表取数据
然后,在两表M*N的过程中,筛选,
以什么条件筛选,答:cat_id相同
1. 连接上表
2. 连接条件
 
select
goods_id,goods.cat_id,cat_name,goods_name,shop_price
from
goods left join category
on goods.cat_id = category.cat_id;
 
左连接:
Select 1,列2,列N from
tableA left join tableB
on tableA.= tableB.列   [此处表连接成一张大表,完全当成普通表看]wheregroup by having……..照常写
 
右连接:
Select 1,列2,列N from
tableA right join tableB
on tableA.= tableB.列   [此处表连接成一张大表,完全当成普通表看]wheregroup by having……..照常写
 
内连接:
Select 1,列2,列N from
tableA inner join tableB
on tableA.= tableB.列   [此处表连接成一张大表,完全当成普通表看]wheregroup by having……..照常写
 
左连接:
以左表为准,去右边找匹配数据,找不到匹配,用NULL补齐。
如何记忆:
1. 左右连接可以相互转化。
2. 推荐把右连接转换为左连接来使用
右连接:
A站在B的左边《======B站在A的右边
A left join B ========B right join A
 
内连接:
查询左右表都有的数据,即不要左右连接中NULL的那一部分。内连接是左右连接的交集。
Select boy.*,girl.* from boy inner join girl on boy.flower = girl.flower;
 
思考:能否查出左右连接的并集
答:目前不能,目前的mysql不支持外连接。
但是可以用union来达到目的
先来个左连接,再来个右连接,左右连接union一下就行了
 
练习题:
1. goods表,category表,brand表,3表连接查询,得出以下字段:
Good_id
Cat_id
Cat_name
Brand_id
Brand_name
Goods_name
2. 根据给出的表结构按要求写出SQL语句。
Match 赛程表
字段名称
字段类型
描述
matchID
int
主键
hostTeamID
Int
主队的ID
guestTeamID
Int
客队的ID
matchResult
Varchar(20)
比赛结果,如(20
matchTime
Date
比赛开始时间
Team参赛队伍表
字段名称
字段类型
描述
teamID
Int
主键
teamName
int
队伍名称
 
MatchhostTeamIDguestTeamID都与Team中的teamID关联;查出2006-6-12006-7-1之间举行的所有比赛,并且用以下形式列出;
拜仁   2:0   不莱梅  2006-6-21