菜鸟求教查询: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
我看不懂这条写的,为什么他的就执行了 ?
问题:
1、我的错在哪里?
2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?
3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?
----------------
菜鸟,忘提示!!!望指教!!!
[解决办法]
rownum是oracle自动生成的行号,只能小于,不能大于。因为他永远从1开始,有了1才有2,有了2才有3.。。。。
[解决办法]
首先知道rownum永远都是死的 只能针对当个查询 如果加个别名就不同了
你的sql里面 外层rownum只是针对了外面一层的行号 所以不可能 >= 21 必然会报错
他的sql 在内层的时候已经赋值一个别名rn 等于在外面访问rn 是内层的行号
[解决办法]
2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?
--先把序号查出来作为一列, 这样外层查询 就能使用 这个序号判断了,那就是真正的 行
3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?
--应该不会报错吧?最多是查不出数据罢了。
[解决办法]
直接让rownum >= 查不出值,rownum都是从1开始的,你让他 >21 ,它找不到21就一直又从1开始了,导致查不到值。像 HJ_daxian 说的,在里面把它别名定义出来,这样在外面就可以让他 > 了,就可以用了。
[解决办法]
rn 是起的别名,然后就可以>=了。就是这么神奇的东西,呵呵
[解决办法]
估计是oracle的语法所致吧,,在sqlserver数据库是可以你这么写的。
[解决办法]
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关键字。
请问这是为什么 ? 能够解释 ?
你确定你的user_info这个表是存在的吗?
[解决办法]
直接让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、别名何时可用?
因为rn这时候还不起作用,别名在外层才起作用。就是说你起的别名在当前where字句中是不能用的,必须再套一层from语句
[解决办法]
首先知道rownum永远都是死的 只能针对当个查询 如果加个别名就不同了
你的sql里面 外层rownum只是针对了外面一层的行号 所以不可能 >= 21 必然会报错
他的sql 在内层的时候已经赋值一个别名rn 等于在外面访问rn 是内层的行号
我还有些疑惑,在 7 楼提出来了,能否指点下 !
提2点
1:oracle查询中 单纯的*和其他字段不能一起使用 否则报错 找不到from
在上面SELECT *, ROWNUM RN FROM ... 语法有问题
2:SELECT *, ROWNUM RN FROM (SELECT * FROM user_info )
后面这个子查询有必要么 直接select a.*,rownum rn from user_info a where ...就可以了
[解决办法]
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。
[解决办法]
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错了呢 ?
这2个 很明显的不同 表别名和字段别名
表别名 只能在当个查询里面用到
字段别名 是为了在外层查询用的 在当个查询里面使用 肯定会报错 找不到改字段
------解决方案--------------------
听这么一说,倒有点糊涂 !
那么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
[解决办法]
听这么一说,倒有点糊涂 !
那么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
学习了 HJ_daxian 是我见过的 同Dave,向上一个级别的oracle大牛