當前位置:首頁 » 編程語言 » 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;