一張表,就是一個集合,一行數據就是集合的一個元素。
理論上講:不可能存在完全相同的兩個行,但是表中可以完全相同的兩行,
因為表內部有一個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