菜鸟求教查询:n-m行的查询
我不是职业搞数据库的,我做的事web,因为分页,自己写的sql出错,百度别人的
会用但看不懂,所以特来求教!
这是我写的sql:
select * from
(select * from user_info where rownum < = 8)
where rownum>=5
SELECT * FROM ( SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?
--先把序号查出来作为一列, 这样外层查询 就能使用 这个序号判断了,那就是真正的 行
3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?
--应该不会报错吧?最多是查不出数据罢了。
我原本认为的是:A只是user_info这张表查出的所有数据的一个别名,然后A与rn构成新的一张表显示出来,于是,我决定去掉别名A,我改成
SELECT * FROM ( SELECT *, ROWNUM RN
FROM (SELECT * FROM user_info ) WHERE ROWNUM <= 8 order by id ) WHERE RN >= 3
可此时程序就报错了!
错误提示:ORA-00923,未找到要求的from关键字。
请问这是为什么 ? 能够解释 ?
直接让rownum >= 查不出值,rownum都是从1开始的,你让他 >21 ,它找不到21就一直又从1开始了,导致查不到值。像 HJ_daxian 说的,在里面把它别名定义出来,这样在外面就可以让他 > 了,就可以用了。
那么别名何时开始可以用 ?
我把百度的代码改了下,
select * from (
select A.*, rownum rn from (select * from user_info) A where rn < 8
)
where rn > 3
代码就错了!
而如果把内层的where rn<8改成 rownum<8,sql就正确了!
请问,1、这是为什么?2、别名何时可用?
直接让rownum >= 查不出值,rownum都是从1开始的,你让他 >21 ,它找不到21就一直又从1开始了,导致查不到值。像 HJ_daxian 说的,在里面把它别名定义出来,这样在外面就可以让他 > 了,就可以用了。
那么别名何时开始可以用 ?
我把百度的代码改了下,
select * from (
select A.*, rownum rn from (select * from user_info) A where rn < 8
)
where rn > 3
代码就错了!
而如果把内层的where rn<8改成 rownum<8,sql就正确了!
请问,1、这是为什么?2、别名何时可用?
首先知道rownum永远都是死的 只能针对当个查询 如果加个别名就不同了
你的sql里面 外层rownum只是针对了外面一层的行号 所以不可能 >= 21 必然会报错
他的sql 在内层的时候已经赋值一个别名rn 等于在外面访问rn 是内层的行号
我还有些疑惑,在 7 楼提出来了,能否指点下 !
2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?
--先把序号查出来作为一列, 这样外层查询 就能使用 这个序号判断了,那就是真正的 行
3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?
--应该不会报错吧?最多是查不出数据罢了。
我原本认为的是:A只是user_info这张表查出的所有数据的一个别名,然后A与rn构成新的一张表显示出来,于是,我决定去掉别名A,我改成
SELECT * FROM ( SELECT *, ROWNUM RN
FROM (SELECT * FROM user_info ) WHERE ROWNUM <= 8 order by id ) WHERE RN >= 3
可此时程序就报错了!
错误提示:ORA-00923,未找到要求的from关键字。
请问这是为什么 ? 能够解释 ?
2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?
--先把序号查出来作为一列, 这样外层查询 就能使用 这个序号判断了,那就是真正的 行
3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?
--应该不会报错吧?最多是查不出数据罢了。
我原本认为的是:A只是user_info这张表查出的所有数据的一个别名,然后A与rn构成新的一张表显示出来,于是,我决定去掉别名A,我改成
SELECT * FROM ( SELECT *, ROWNUM RN
FROM (SELECT * FROM user_info ) WHERE ROWNUM <= 8 order by id ) WHERE RN >= 3
可此时程序就报错了!
错误提示:ORA-00923,未找到要求的from关键字。
请问这是为什么 ? 能够解释 ?
可以解释的,这里SELECT *, ROWNUM RN
FROM (SELECT * FROM user_info的*,是不行的,不能这样查询,只能查询一个*或者rownum。
直接让rownum >= 查不出值,rownum都是从1开始的,你让他 >21 ,它找不到21就一直又从1开始了,导致查不到值。像 HJ_daxian 说的,在里面把它别名定义出来,这样在外面就可以让他 > 了,就可以用了。
那么别名何时开始可以用 ?
我把百度的代码改了下,
select * from (
select A.*, rownum rn from (select * from user_info) A where rn < 8
)
where rn > 3
代码就错了!
而如果把内层的where rn<8改成 rownum<8,sql就正确了!
请问,1、这是为什么?2、别名何时可用?
。。。。
我在9楼提出了个别名的问题:
我依然不知道Oracle中别名什么时候用。
请看场景1:
首先请看一个正确的:select * from user_info a where a.id = 2
这里我定义完别名 a 后直接使用a ,a.id =2 就可以了。
请看场景2:
然而在9楼提出的,
select * from (
select A.*, rownum rn from (select * from user_info) A where rn < 8
)
where rn > 3
我在这里也是,内层定义完rownum别名rn后直接使用rn却错了 !
场景1和场景2都是使用别名,怎么1对了2错了呢 ?
听这么一说,倒有点糊涂 !
那么18楼说的对不 ?
听这么一说,倒有点糊涂 !
那么18楼说的对不 ?
是对的
一般sql执行顺序
(1) FROM 子句 组装来自不同数据源的数据
(2) WHERE 子句 基于指定的条件对记录进行筛选
(3) GROUP BY 子句 将数据划分为多个分组
(4) 使用聚合函数进行计算
(5) 使用HAVING子句筛选分组
(6) 计算所有的表达式
(7) 使用ORDER BY对结果集进行排序
用sql语法表示的话 大致这样
1. FROM
2. WHERE
3. GROUP BY
4. SUM、AVG..
5. HAVING
6. SELECT
7. DISTINCT
8. ORDER BY
9. TOP