当前位置:首页 » 编程语言 » oraclesqltop用法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oraclesqltop用法

发布时间: 2022-05-16 07:50:42

① Oracle数据库的子查询关键字该怎么使用

一、
伪列就像Oracle中的一个表列,但实际上它并未存储在表中。伪列可以从表中查询,但是不能插入、更新或删除它们的值。常用的伪列:rowid和rownum。
Rowid:数据库中的每一行都有一个行地址,Rowid伪列返回该行地址。可以使用Rowid值来定位表中的一行。通常情况下,Rowid值可以唯一地标识数据库中的一行。
Rowid伪列有以下重要用途:
1)能以最快的方式访问表中的一行;
2)能显示表的行是如何存储的。
3)可以作为表中行的唯一标识。
如:sql> select rowid,ename from emp;
Rownum:对于一个查询返回的每一行,Rownum伪列返回一个数值代表的次序。返回的第一行的Rownum值为1,第二行的Rownum值为2,依此类推。通过使用Rownum伪列,用户可以限制查询返回的行数。
如:SQL>select * from emp where rownum<11; 从EMP表中提取10条记录
二、
oracle中不支持select top n from tablename 查询,但是通过 order by 和 rownum 组合可以实现此功能。例如:SELECT列名1...列名nFROM
(SELECT列名1...列名nFROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM <= N(抽出记录数)
ORDER BY ROWNUM ASC

② 数据库问题,sqlserver top和oracle的rownum有什么不同呢下面语句是否可以相互转换

sqlserver中的查询语句(select top 50 * from userinfo)和oracle中查询语句(select * from userinfo where rownum<51)是否可以这样翻译过来
是的

再不牵扯到排序的时候完全等同。如楼上所言,如果有ORDER BY就有次序先后之分了。
ORACLE rownum是对所有数据的物理排序,
就是SELECT * FROM TAB里面,其优先级高于order by。所以如果有select * from tab order by xxx where rownum < xxx你永远得不到正确结果,只能
SELECT * FROM (SELECT * from tab ORDER BY xxxx) t where rownum <xxx

SQL Server top是有序排序,是top始终只针对最后的结果集,也就是最后一个操作结果。
优先级低于ORDER BY

③ oracle和sql server取第一条记录的区别以及rownum详解

我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录。

sql server:
select top(1) num,Name from M_Student where name = 'xy'

Oracle:
select num,Name from M_Student where name = 'xy' and rownum <= 1

对于rownum在oracle的使用的时候,有几点需要注意:

(1) rownum 对于等于某值的查询条件
如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

(2) rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

(3) rownum对于小于某值的查询条件
rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。比如 rownum < 3

(4) rownum和排序
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

select rownum ,id,name from student order by name;

ROWNUM ID NAME
3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四
可以看出rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。必须使用子查询。

select rownum ,id,name from (select * from student order by name);
ROWNUM ID NAME
3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四
这样就成了按name排序,并且用rownum标出正确序号(由小到大)

看一个例子
把最先进入公司的5个人找出来
方法一 SELECT * FROM emp WHERE ROWNUM <= 5 ORDER BY hiredate;
方法二 SELECT * FROM(SELECT * FROM emp ORDER BY hiredate) WHERE ROWNUM <= 5;

把最先进入公司的6-10个人找出来
方法一
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
WHERE ROWNUM <= 10
MINUS
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
WHERE ROWNUM <= 5;

方法二(分页常用)
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <= 10) t WHERE t.rn >= 6;
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROM emp) e WHERE ROWNUM <= 10) WHERE rn >= 6;

④ oracle sql 语句

1. select top 1 *from (select count(BId) as cc from brrow where getdate() between T_time and B_time group by stuID) order by cc desc
2.select a.stuname,b.title,b.T_time,b.B_time from student a join
(select borrow.stuID,borrow.T_time,borrow.B_time,book.title from borrow join book on borrow.BID=book.bid) b on a.stuID =b.stuID
3.select *from student where stuID not in (select stuid from borrow where gedate() >B_time)
4.
go
create proc login
@stuid number(10),
@password varchar2(20),
@re varchar(20) output
as
declare @st number
select @st = stuid from student where stuid=@st
if isnull(@st,0)=0 return '-1'
else if @password = (select password from student where stuid =@stuid) and @password is not null rturn '0'
else return select stuname from student where stuid =@stuid
go
5.go
create function dd()
@bid number(10)
as
if ((select bid from borrow where bid =@bid) is not null )
begin
print '必须先删除借书信息记录表中所有对应于该图书的所有数据'
return
end
delete from book where bid =@bid
go

⑤ 熟悉Oracle或SQLServer数据库安装,及基本的SQL语句的使用

Oracle与Sql server都遵循SQL-92标准:
区别如下:

1.Oracle中表名,字段名,存储过程名,变量名不能超过30个字符串长度。

2.Oracle中不支持Top 语法。使用whererownum < n 代替。但需要注意如果在Top前有排序的操作,则需要先排序在利用rownum取得。

3.Oracle中光标的使用与SqlServer中有挺大差别,主要是在循环控制方面不一致。

在Oracle中如果某列是Date类型,那么它默认的格式是yyyy-MM-dd,如果使用where colDate = ‘2005-06-08 17:14:57’就会出错,‘2005-06-08’可以。如果此时需要精确比较时间(小时,分,秒),可以采用下列方法:TO_DATE('2005-6-8 17:14:57','yyyy-mm-dd hh24:mi:ss')。由于Oracle和SQLServer在DateTime上对SQL标准的拓展实现方式不同,因此不能用同一个SQL实现。

4.Oracle中的TimeStamp(时间戳)与SqlServer中的差别很大。SqlServer中的TimeStamp是二进制格式存储在数据库中,可以将DataSet中的这个字段类型设定为base64Binary类型。Oracle中的TimeStamp是时间格式存储的。因此,无法用同一个DataSet既装载SqlServer的TimeStamp,有装载Oracle的TimeStamp.由于在应用程序中很少用到这个值,因此可以不检索这个字段。

5.Oracle中的TimeStamp不能像SqlServer在传入数据的时候自动填充,可以设定默认值systimestamp来实现类似功能。

6.Oracle中没有Boolean的字段类型,可以用intger或者char代替SqlServer中的bit类型。

7.Oracle中会将””空字符串当多NULL处理,也就是说,当应用程序往数据库中插入一个空字符串时,实际数据库会尝试插入一个NULL。如果这个字段是NOTNULL类型,那么就会出错,这种情况下可以用别的默认值代替空字符串。当从SqlServer导入数据到Oracle的时候,在NOTNULL列上的空字符串会导致导出操作失败。此时可以在导出向导中手工修改SQL脚本,将空字符串设定成一个特殊值。

⑥ oracle取前几条数据语句

1、首先在oracle软件中,可以使用下面的 SELECT 语句:(其中%就是通配符,标识表达式>=1个字符)。

⑦ sql server和oracle中查询结果返回指定行数的语句

SQL Server下查询结果返回指定行用top命令。

如查询proct表中的5行数据:

selecttop5*fromproct;