如果想查询A表中class_id字段在B表中的class_id中沒有出现过的所对应的相关信息
1.子查询方式------效率较低
- 主查询会过滤students表中所有的信息(共计7行)子查询也会过滤classes表中所有的信息(共计4行)
- 如果主查询和子查询的数据量都非常大的话,这种查询方式最终需要过滤2个表里面的所有信息才能找到最终需要的信息
这种方式前提昰,2个表格关联的字段都有索引效率才高否者也会很慢
- 可以看出,最终的数据包含classes表的字段只是对应的值都是null
- 最终查看到,虽然2个表格也都全部过滤了一遍filtered列,我们看到第二个表的查询过滤数只有25越接近100,说明查询效率越高经过查询发现,classes表没有使用claas_id设置为索引因为此种情况,第二张表格的数据比第一个少所以效果不是很明显。
- 如果A表小B表大,那么B表对应的字段就需要使用索引否者会过濾所有的选项。
相同的代码使用cash表中borrow_no作为索引,最终结果如下:
不使用索引最终结果:
最终我们能看到,不使用索引最终第二个大表会检索所有数据,最终效率会非常慢
exits的基础用法:
count(*) 有时候还使用count(1)代替,效果都一样
- 通过如上分析使用not exists 最终只过滤了一个表的全蔀,另一个表过滤的行数只有1这样效率很高。
- 这种方式效率很高在从students每个数据开始查询的时候,都计算一下是否有classes表里面的数据满足s.class_id=c.class_id,如果每组则这组数据最终的count(*)为1否者为0,所以在students表中没有符合条件的数据,都是在students中存在且在classes表中不存在的数据