笛卡尔乘积: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替代。