八、连接查询概念与左连接语法以及左右内连接的区别
一张表,就是一个集合,一行数据就是集合的一个元素。
理论上讲:不可能存在完全相同的两个行,但是表中可以完全相同的两行,
因为表内部有一个rowid。
*
*
集合相乘,就是笛卡尔积
其实就是两个集合的完全组合
问:设集合A有M个元素,M个元素各不相同
设集合B,有N个元素,N个元素各不相同
A*B,得到的积,有M*N个元素,不可能重复。
表A有9行,表B有10行
两表相乘有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 联通手机充值卡
要从goods,category表取数据
然后,在两表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.列 [此处表连接成一张大表,完全当成普通表看]where,group by having……..照常写
右连接:
Select 列1,列2,列N from
tableA right join tableB
on tableA.列 = tableB.列 [此处表连接成一张大表,完全当成普通表看]where,group by having……..照常写
内连接:
Select 列1,列2,列N from
tableA inner join tableB
on tableA.列 = tableB.列 [此处表连接成一张大表,完全当成普通表看]where,group 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表连接查询,得出以下字段:
2. 根据给出的表结构按要求写出SQL语句。
Match 赛程表
Team参赛队伍表
Match的hostTeamID与guestTeamID都与Team中的teamID关联;查出2006-6-1到2006-7-1之间举行的所有比赛,并且用以下形式列出;
拜仁 2:0 不莱梅 2006-6-21