1.优化子查询包含in()的sql语句
user表
CREATE TABLE `user` ( `ID` int(11) NOT NULL, `NAME` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mid_user表
CREATE TABLE `mid_user` ( `id` int(11) NOT NULL, `user_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
使用in时的查询语句
SELECT * FROM `user` WHERE ID in(SELECT user_id FROM mid_user)
使用EXISTS改写sql语句
SELECT * FROM `user` WHERE EXISTS ( SELECT mid_user.id FROM mid_user WHERE `user`.ID = mid_user.user_id )
EXISTS 会对外表user进行循环查询匹配,它不在乎后面的内表子查询的返回值是什么,只在乎有没有存在返回值,存在返回值,则条件为真,该条数据匹配成功,加入查询结果集中;如果没有返回值,条件为假,丢弃该条数据。
COUNT()的作用
是一个特殊的函数 有两种非常不同的作用 1 它可以统计某个列值的数量 2 也可以统计行数
在统计列值的时候要求列值是非空的
COUNT() 的另一个作用是统计结果集的函数 当MYSQL确认括号呢的表达式值不可能为空时 实际上就是在统计行数 最简单的就是当我们使用COUNT(*) 的时候 这种情况下通配符 * 并不会像我们猜想的那样扩展成所有的列 实际上 他会忽略所有的列而直接统计所有的行数
我们发现一个最常见的错误就是,在括号内指定了一个列却希望统计结果集的行数 如果希望知道的是结果集行数 最好使用count(*) 这样写意义清晰 性能也会很好