笛卡爾乘積:mysql
A={a, b},集合B={0, 1, 2},則AxB的笛卡爾積爲{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)};sql
(AxB≠BxA)數據庫
數據庫中內鏈接與多表查詢的區別 性能
sql = "select [我的信息$].*,[工做經歷$].* from [我的信息$],[工做經歷$] where [我的信息$].UID=[工做經歷$].UID"blog
sql = "select [我的信息$].*,[工做經歷$].* from [我的信息$] inner join [工做經歷$] on [我的信息$].UID=[工做經歷$].UID" hash
第一種是普通的多表查詢,內部仍是笛卡爾積的逐行的搜索機制,若是查詢的幾張表數據量大的話會下降性能;io
第二種是內鏈接。兩種方式獲得的結果是一致的。inner join(等值鏈接) 只返回兩個表中聯結字段相等的行的記錄。 效率
從結果上看同樣。 select
可是從實現上看,多個from是笛卡爾集,再篩選,效率是O(n^2),不好。 搜索
join是先作hash,再匹配,效率是O(logN),很好。
推薦使用內鏈接。SQL規格推薦也是用join的。
鏈接查詢的分類
1. 交叉鏈接(就是沒有鏈接條件的「所有鏈接」)
形式: from 表1 [cross] join 表2 或 from 表1,表2;
結果:兩張表的笛卡爾積
2. 內鏈接
形式:from 表1 [inner] join 表2 on 表1.字段1 = 表2.字段2;
結果:取得一個「交叉鏈接」的結果中,知足所設定的鏈接條件(就是on後面的條件)的那些行的數據。
3. 左(外)鏈接
形式:from 表1 left [outer] join 表2 on 表1.字段1 = 表2.字段2;
結果:內鏈接數據+左表不知足鏈接條件的列,null(一對多時,左表列會重複。學生表->學生成績表)
是將兩個表的知足鏈接條件的全部數據(即內鏈接數據), 再加上那些「左邊」表中,不能知足鏈接條件的數據的總和。 對於左邊表中不能知足條件的數據,在結果中的右邊部分,都補上「null」
4. 右(外)鏈接
參考左外鏈接。
5. 全(外)鏈接
形式:from 表1 full [outer] join 表2 on 表1.字段1 = 表2.字段2;
左外連接和右外鏈接之並集。mysql不支持全外鏈接,能夠用union替代。