在查询多张表时总会用到用到连表查询,那么连表查询的连接方法到底有几种呢?今天就一起看看
1、交叉连接(只做笛卡尔积)
XML Code
1 | select * from A cross join B |
它等同于
XML Code
1 | select * from A,B |
准备如下数据
XML Code
1 | create table clazz(id int,name varchar(20),remark varchar(100)) |
学生表如下
班级表如下
XML Code
1 | select * from student s cross join clazz c |
实测得
XML Code
1 | select * from student,clazz |
所得的结果集一样
结论一:交叉连接(cross join ) <==> 只做笛卡尔积
2、内连接(inner join)
XML Code
1 | select s.name,s.age,s.salary,s.category,s.feature,s.seq,c.name,c.remark from student s inner join clazz c on s.cid = c.id |
内连接是做笛卡尔积后再根据on后面的条件筛选出符合条件的行
运行上面的SQL得出以下结果集
内连接等价于
XML Code
1 | select s.name,s.age,s.salary,s.category,s.feature,s.seq,c.name,c.remark from student s ,clazz c where s.cid = c.id |
结论二:内连接(inner join ) <==> 做完笛卡尔积后根据on后面的条件筛选出符合条件的记录
3、外连接(left/right [outer] join)
XML Code
1 | select s.name,s.age,s.salary,s.category,s.feature,s.seq,c.name,c.remark from student s left OUTER join clazz c on s.cid = c.id |
运行以上的sql得到以下结果集
注意仔细观察,这个结果集和内连接的结果集相比多了一行,这是因为外连接比内连接多了一个步骤
即外连接1、做笛卡尔积 2、根据on条件筛选 3、把左表中没有匹配的行加结果集中进来
所以才会多了最后的一行
结论三:外连接(left/right [outer] join) <==> 通过on条件筛选笛卡尔积的结果后再把没有匹配的行加入到结果集中来
这就是mysql常用的3中连接方式