对于Mysql中的多表查询内连接的方式之前一直有疑问,举这么一个经典的例子:Student、Course、SC(学生表、课程表、选课表)三张表,我们想查看学生选了什么课程,肯定需要进行是三表联查。
此时我要查看小明选了什么课,这时有两种查询方式:
用where的方式:
1、select student.name,course.name from sudent s,course c,sc where s.sid = sc.sid and c.cid = sc.cid and s.name = '小明';
用inner join的方式
2.1、select student.name,course.name from sudent s inner join course c inner join sc on (s.sid = sc.sid and c.cid = sc.cid and s.name = '小明');
2.2、select student.name,course.name from sudent s inner join course c inner join sc on (s.sid = sc.sid and c.cid = sc.cid) where s.name = '小明';
这三条SQL语句查询出来的结果是一样的,那么他们之间有什么区别呢?
首先对于1和2 两种方式:
inner join 接 on 和使用where 接 “=” 的结果是一样的,但对于执行效率来看是不一样的,join这种内连接的方式执行效率是高于直接用where+“=”的方式, 因为join是基于hashtable进行连接比较,而后者直接就是取笛卡尔集再过滤,所以后者效率低,是O(N^2),前者是O(LogN)。所以还是提倡直接使用join,因为join本身是内连接,还有外连接中的左连接,右连接,全外连接等,统一方式,然后根据不同情况选择适合的使用。
对于2.1和2.2两种写法:
一般来说,我们更提倡使用第二2.2的写法,这样可以使得sql语句的结构清晰,连接涉及到的相关条件我们就放在on()里面,而对于其他的附加过滤条件还是跟在where后面使用比较合适。
总结:
综上所述:对于多表的查询,建议使用join+on的连接方式,同时为了sql语句的清晰,将连接条件放在on()里,其他过滤条件还是放在where后。