多表连接
在关系数据库中,一个查询往往会涉及多个表,因为很少数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于
第三范式,存在大量的冗余和异常。
因此,连接就是一种把多个表连接成一个表的重要手段
迪卡尔积
笛卡尔积在SQL中实现方式为
交叉连接(Cross Join),所有连接都会先生成临时笛卡尔积表,表示两个表中的每一行数据进行组合,也就是行*行=结果表,本身上没什么实际意义,通过WHERE过滤才有意义,Cross Join后面不加ON只能加WHERE
SELECT * FROM table1 CROSS JOIN table2 where table1.colunm = table2.colunm
内连接
按照上面的理解,内连接可以先看作对两个表进行交叉连接,再通过添加限制条件ON剔除不符合条件的行的子集,得到的结果就是内连接的效果了
1.等值连接
在连接条件用‘=’运算符,相当于两个表的交集(实际运用多)
SELECT * FROM table1 a INNER JOIN table2 b ON a.xx = b.xx
2.不等连接
在连接条件用除了‘=’以外的比较运算符‘>','<' ,'>=','<=','<>' (实际上得出的表没实际意义)
SELECT * FROM table1 a INNER JOIN table2 b ON a.xx > b.xx
外连接
分为左连接(LEFT JOIN / LEFT OUTER JOIN),右连接(RIGHT JOIN / RIGHT OUTER JOIN),全连接(FULL JOIN / FULL OUTER JOIN)
1.左连接
返回左表的所有行的子集,和右表中与左表相同行的子集,如果右表中的行在左表中没有相匹配,则返回NULL
2.右连接
返回右表的所有行的子集,和左表中与右表相同行的子集,如果左表中的行在右表中没有相匹配,则返回NULL
3.全连接
返回左表与右表中所有行的子集,当某一行在另一个表中没有匹配,则那一行返回NULL,相当于左连接与右连接的结合
例子:
table1 id value table2 id value
1 a 1 b
2 c 3 d
4 e
SELECT * FROM table1 a LEFT JOIN table2 b ON a.id = b.id(左连接)
结果:
id value id value
1 a 1 b
2 c null null
4 e null null
SELECT * FROM table1 a RIGHT JOIN table2 b ON a.id = b.id(右连接)
结果:
id value id value
1 a 1 b
null null 3 d
SELECT * FROM table1 a FULL JOIN table2 b ON a.id = b.id(全连接)
结果:
id value id value
1 a 1 b
2 c null null
null null 3 d
4 e null null