1、首先,为了方便查询课提高效率,我们总是喜欢给oracle主键定义一个索引,但是,MYSQL里面没有啊,所以索引都会失效
2、错误:Every derived table must have its own alias
中文意思:每个派生出来的表都必须有一个自己的别名。
错误原因:一般在多表查询时,会出现此错误,例如我在进行如下查询时遇到的,语句为:select * from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user on tbl_topic.userid=tbl_user.userid where tbl_topic.boardid=? order by recenttopicmodifytime desc) where rownum<=1;其实解决方法也很简单,因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名,虽然只加了一个没有任何作用的别名a,但这个别名是必须的.
改进: select * from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user on tbl_topic.userid=tbl_user.userid where tbl_topic.boardid=? order by recenttopicmodifytime desc) as a where rownum<=1
3、继续刚才那个语句,别名的问题解决了,但是又出错了:Unknown column 'rownum' in 'where clause'
中文意思:未知的列出现在where后面。
错误原因:看了下mysql官方的解释,发现在嵌套的查询语句中,当用到where的时候,数据的条数可能还没有被决定, rownum这是根本都还没出来,所以会报错(注:官方解释:http://dev.mysql.com/doc/refman/4.1/en/problems-with-alias.html)。so,我们需要改一改slq语句,既然rownum不能使用,而我们知道它的意思,其实就是查出来的列数,那么,我们只需要在前面加一个COUNT( * ) AS cnt就行了。
改进: select *,count(*) as cnt from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user on tbl_topic.userid=tbl_user.userid where tbl_topic.boardid=? order by recenttopicmodifytime desc) as a where cnt<=1
4、但是,相信对mysql熟悉的小伙伴已经看出来了,既然用的事count(*) as cnt,那么where后面则不能用cnt<=1,或者说cnt<=1的这个条件前面不能使用where,在一个标准的SQL不允许引用列别名
5、分页查询,oracle需要用十分复杂的语句去完成一个分页查询,但是在mysql里面,只需要一个简单的函数就OK了,那就是limit
2、错误:Every derived table must have its own alias
中文意思:每个派生出来的表都必须有一个自己的别名。
错误原因:一般在多表查询时,会出现此错误,例如我在进行如下查询时遇到的,语句为:select * from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user on tbl_topic.userid=tbl_user.userid where tbl_topic.boardid=? order by recenttopicmodifytime desc) where rownum<=1;其实解决方法也很简单,因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名,虽然只加了一个没有任何作用的别名a,但这个别名是必须的.
改进: select * from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user on tbl_topic.userid=tbl_user.userid where tbl_topic.boardid=? order by recenttopicmodifytime desc) as a where rownum<=1
3、继续刚才那个语句,别名的问题解决了,但是又出错了:Unknown column 'rownum' in 'where clause'
中文意思:未知的列出现在where后面。
错误原因:看了下mysql官方的解释,发现在嵌套的查询语句中,当用到where的时候,数据的条数可能还没有被决定, rownum这是根本都还没出来,所以会报错(注:官方解释:http://dev.mysql.com/doc/refman/4.1/en/problems-with-alias.html)。so,我们需要改一改slq语句,既然rownum不能使用,而我们知道它的意思,其实就是查出来的列数,那么,我们只需要在前面加一个COUNT( * ) AS cnt就行了。
改进: select *,count(*) as cnt from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user on tbl_topic.userid=tbl_user.userid where tbl_topic.boardid=? order by recenttopicmodifytime desc) as a where cnt<=1
4、但是,相信对mysql熟悉的小伙伴已经看出来了,既然用的事count(*) as cnt,那么where后面则不能用cnt<=1,或者说cnt<=1的这个条件前面不能使用where,在一个标准的SQL不允许引用列别名
在哪里(where)
条款。 这一限制强加因为当在哪里(where)
条款是评估, 列值可能尚未被确定,so,总之一句话,因为cnt是不确定的值,所以不能用where,只能用having,最终语句为:select *,count(*) as cnt from (select topicid as recenttopicid,title as recenttopictitle,tbl_user.userid as recenttopicuserid,uname as recenttopicusername, modifytime as recenttopicmodifytime from tbl_topic left join tbl_user on tbl_topic.userid=tbl_user.userid where tbl_topic.boardid=? order by recenttopicmodifytime desc) as a having cnt<=15、分页查询,oracle需要用十分复杂的语句去完成一个分页查询,但是在mysql里面,只需要一个简单的函数就OK了,那就是limit