先看SQL语句
create table USERS
(USER_ID VARCHAR2(10) primary key not null, --登录名USER_NAME VARCHAR2(20) not null,--用户名(昵称)USER_PASSWORD VARCHAR2(20) not null,--密码USER_SEX VARCHAR2(2) not null,--性别USER_BIRTHDAY DATE,--生日USER_IDENTITY_CODE VARCHAR2(60),--身份证号USER_EMAIL VARCHAR2(80),--emailUSER_MOBILE VARCHAR2(11),--电话USER_ADDRESS VARCHAR2(200),--地址USER_STATUS NUMBER(6) not null--用户权限状态,1普通用户 2管理员
);
一,SQL语句的伪列ROWNUM, ROWID
code1
SELECT ROWNUM, ROWID FROM USERS
结果如下,rownum是Oracle在查询完表后生成的一个有序列,从1开始。而rowid
好像没什么用,对开发来说。
code2
SELECT ROWNUM, EU.* FROM USERS EU WHERE ROWNUM > 1
额,这样的where查是没得结果的,因为ROWNUM 是从1开始,是个动态的值,即伪列,在一个查询当中大于是无效的。只有ROWNUM >= 1才有用。
code3
-- RN 标识符无效
SELECT ROWNUM RN, EU.* FROM USERS EU WHERE RN <= 3
rn是生成的字段,本身不确定,做条件会错。
code4
SELECT * FROM
(SELECT ROWNUM RN, EU.* FROM USERS EU WHERE ROWNUM <= 3
)
WHERE RN > 0
这是查EASYBUY_USER 前面3行的数据。ROWNUM 在一个select里面写 > 就没用了, 所以把括号里面的sql当作一个表,再查,RN也可使用了。
code5
SELECT * FROM
(SELECT ROWNUM RN, EU.* FROM (SELECT * FROM USERS) EU WHERE ROWNUM <= 3
)
WHERE RN > 0
这个也是有3个查询,只不过,第三个查询可以多写条件。比如按出生查。
Oracle的分页不必mysql有limit关键字 和 SQL server的top关键字,但是搞懂原理,还是简单的,条件就是 页数 和 每页要查几行数据 这两个变量的关系。
数据库的代码
// 分页查询用户信息 pageNo 页数 pageSize 每页的行数public List<USERS> selectUserInfo(int pageNo, int pageSize) {List<USERS> list = new ArrayList<USERS>();StringBuffer sql = new StringBuffer();sql.append("SELECT * FROM");sql.append("(");sql.append("SELECT ROWNUM RN, EU.* FROM USERS EU WHERE ROWNUM <= ?");sql.append(")");sql.append("WHERE RN > ?");Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = BaseDao.getConn();ps = conn.prepareStatement(sql.toString());ps.setInt(1, pageNo * pageSize);ps.setInt(2, (pageNo - 1) * pageSize);rs = ps.executeQuery();while (rs.next()) {Users users = new Users();user.setUserId(rs.getString("USER_ID"));user.setUserName(rs.getString("USER_NAME"));user.setUserPassword(rs.getString("USER_PASSWORD"));user.setUserSex(rs.getString("USER_SEX"));list.add(users);}} catch (SQLException e) {e.printStackTrace();} finally {BaseDao.release(conn, ps, rs);}return list;}
BY MYSELF STUDY, 2020/3/14, FOR MY PROJECT.
更新…
- 下面的查法,改变表名即可
select * from (select tab1.*, rownum as rn from (select * from users) tab1) tab2where rn between ? and ?
- 设置页数和行数
ps.setInt(params.size() + 1, (pageNo - 1) * pageSize + 1);
ps.setInt(params.size() + 2, pageNo * pageSize);