1、多表查询 where 、 join
①where 实现多表查询
select a.ID ,b.Name from Table1 as a , Table2 as b where a.ID=B.ID
缺点:在上语句中,实际先查询 表a,b 两个表的cross join 【笛卡儿积】,然后通过正确a.ID=b.ID
过滤正常的数据,这是一种低效利用数据库资源。
为了避免创建笛卡儿积,应该使用inner join
② join
select a.ID ,b.Name from Table1 a inner join Table2 b on a.ID =b.ID
优点:如上面语句,使用inner join 这样数据库就只产生等于ID 的条目标结果。增加了查询效率。
有些数据库系统会识别出 WHERE连接并自动转换为 INNER JOIN。在这些数据库系统中,WHERE 连接与INNER JOIN 就没有性能差异。但是,
INNER JOIN 是所有数据库都能识别的,因此DBA会建议在你的环境中使用它。
<>join on where 执行顺序
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
full join:外连接,返回两个表中的行:left join + right join。
cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
关键字: on
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
【举例】
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
inner join on where 结果是一样的。