先放一段代码
for (int i=0; i<1000;我+ +){ for (int j=0; j<5; j + +) { System.out.println (“hello”); } } (int i=0; i<5,我+ +){ (int j=0; j<1000; j + +) { System.out.println (“hello”); } }
分析以上代码可以看到两行代码除了循环的次序不一致意外,其他并无区别,在实际执行时两者所消耗的时间和空间应该也是一致的。但是这仅仅是在Java中,现在我们转化一下情景,最外层循环是数据库中的连接操作,内层循环为查找操作,那么现在两次的结果将相差巨大。
之所以出现这样的原因是数据库的特点决定的,数据库中相比较于查询操作而言,建立连接是更消耗资源的。第一段代码建立了1000次连接,每一次连接却只做了5次查询,显然是很浪费的。
因此在我们对数据库进行操作时需要遵循的操作应当是小表驱动大表(小的数据集驱动大的数据集)。
<强>表结构强>
tbl_emp为员工表,deptld为部门id.tbl_dept为部门表。员工表中含有客人,其deptld字段为1
mysql>desc tbl_emp; + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | |字段类型零额外默认关键| | | | | + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | | int id (11) | | PRI零| | auto_increment | | |名称varchar(20) |是| |零| | | deptld | int(11) |是| MUL零| | | + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 3行集(0.00秒) mysql>desc tbl_dept; + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | |字段类型零额外默认关键| | | | | + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | | int id (11) | | PRI零| | auto_increment | | deptName | varchar(30) |是| MUL零| | | | locAdd | varchar(40) |是| |零| | + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 3行集(0.01秒)
我们知道对于一个公司而言相对于部门来说员工数要多得多。现在我们有这样一个需求:查询属于这个公司的员工(不含来访客人),我们可以用以下代码解决
#先查询部门表中所有的id,然后拿员工表中的deptld字段与之对比,若含有则保留。
mysql>select *从tbl_emp a.deptld在(从tbl_dept选择id);
关键字就像或的拼接,例如上述sql雨中子查询查出的结果为1、2、3,则sql语句等价于以下形式
mysql>select * from tbl_emp a.deptld=1或a.deptld=2或a.deptld=3
总的来说的关键字就是将子查询中的所有结果都查出来,假设结果集为B,共有m条记录,然后在将子查询条件的结果集分解成m个,再进行m次查询。可以看到这里主要是用到了一个的索引,B表如何对查询影响不大
mysql>select *从tbl_dept tbl_emp存在一个地方(选择1 b a.deptld=b。id);
退出:将主查询的数据放到子查询中做条件验证,根据验证结果(真或假)来判断是否保留主查询中的记录。
(我=0;我& lt;count ();我+ +){//遍历一个的总记录数=get_record(我);//从一个表逐条获取记录 如果(B)。id=(id))//如果子条件成立 结果[]=; } 返回结果;
可以看到:存在主要是用到了B表的索引,一个表如何对查询的效率影响不大
mysql>select *从tbl_emp a.deptld在(从tbl_dept选择id);
若tbl_dept的记录数少余tbl_emp则使用的效率比较高
mysql>select *从tbl_dept tbl_emp存在一个地方(选择1 b a.deptld=b。id);
若tbl_dept的记录数多余tbl_emp则使用的效率比较高
<强> 1,查询分析强>
从一个id在SELECT *(选择id从B);在与MySQL中存在的使用及区别介绍