Dameng(达梦)数据库查询TopN记录

本文对比了SqlServer、mysql和Oracle数据库,并介绍了国产数据库达梦的特点。重点讲解了达梦数据库支持的TOP、LIMIT及ROWNUM等关键字的功能及使用场景。

从SqlServer,mysql,Oracle数据库新增国产数据库达梦数据库支持的过程中,发现达梦真的是大杂烩啊。。。

1、SqlServer中支持Top 关键字

select top 5 * from table_a;

2、mysql数据库支持limit关键字

select * from table_a limit 0,5;

3、Oracle可以用rownum 过滤

select * from table_a where rownum <=5;

4、达梦就比较厉害了,top,limit,rownum他都支持,但是top,和limit不能同时存在

select top 5 * from table_a;

top 介绍:

1. TOP <n> 选择结果的前n条记录。
2. TOP <n1>,<n2> 选择第n1条记录之后的n2条记录。
3. TOP <n> PERCENT 表示选择结果的前n%条记录。

 

select * from table_a limit 0,5;

limit介绍:

1. LIMIT N:选择前N条记录;
2. LIMIT M,N:选择第M条记录之后的N条记录;
3. LIMIT M OFFSET N:选择第N条记录之后的M条记录。

 

select * from table_a where rownum <=5;

需要注意的是,rownum的执行分配值是在排序和聚合之前进行的,所以,

select * from table_a where rownum <11 order by table_a.age ;

这样的语句并不会得到所有记录按照age排序后的前十条,只会得到查到的10条数据然后按照age排序的结果。

所以需要使用:

select * from (select * from talbe_a order by table_a.age) where rownum < 11;

或者:select top 10 from table_a order by table_a.age;

 

 

 

<think>嗯,用户这次问的是达梦数据库中如何查询表所属的数据库名称。这个问题很具体,看来用户正在实际使用达梦数据库,需要定位某个表的具体位置。从引用内容看,[1]提到数据库查询的基本概念,[2][3]涉及存储过程和表空间查询,说明用户可能已经尝试过一些方法但没找到正确答案。用户特意强调"不是真正需求",说明之前提供的引用没能解决ta的实际问题。结合达梦数据库的特性,表确实不属于某个"数据库"而属于模式,这个命名差异容易造成混淆。需要帮用户理解达梦的三级存储结构:实例→表空间→模式→对象。重点要引导用户用ALL_OBJECTS视图,通过OWNER字段获取模式名,因为这就是达梦里最接近"数据库名"的概念。考虑到用户可能是误用了MySQL/Oracle的习惯用语,回答时要明确说明术语差异。同时提供两种验证方法:既可以通过系统视图直接查归属模式,也能逆向从表空间路径反推存储位置。这样即使用户真想知道物理库文件名也能满足。用户没有提供表名细节,所以示例要用占位符${TABLE_NAME}。这里在提示用户替换时加了"包含模式前缀"的说明很重要——如果用户直接复制语句出错,很可能就是没写模式名前缀。</think> 在达梦数据库中,表是隶属于**模式(SCHEMA)**而非直接属于数据库名(因为一个数据库实例包含多个模式)。查询表所属的数据库本质上是确定**表所在的模式名**和**所属表空间路径**(隐含物理库名)。以下是详细查询方法: --- ### 一、通过系统视图查询表所属模式 1. **使用 `ALL_OBJECTS` 视图** 执行SQL(替换 `${TABLE_NAME}` 为实际表名,**需包含模式前缀**): ```sql SELECT OWNER AS "所属模式", OBJECT_NAME AS "表名" FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' AND OBJECT_NAME = UPPER('${TABLE_NAME}'); ``` *示例:查询 `HR.EMPLOYEE` 表的归属* ```sql SELECT OWNER AS "所属模式", OBJECT_NAME AS "表名" FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' AND OBJECT_NAME = 'EMPLOYEE' AND OWNER = 'HR'; -- 明确模式名 ``` 2. **查询当前用户的表归属** 若表属于当前登录用户: ```sql SELECT TABLE_NAME AS "表名" FROM USER_TABLES WHERE TABLE_NAME = UPPER('${TABLE_NAME}'); ``` --- ### 二、定位表所属数据库(物理文件) 1. **通过表空间路径反向推导** ```sql SELECT TS.NAME AS "表空间名", T.NAME AS "表名", S.NAME AS "所属模式", TS.PATH AS "物理文件路径" FROM SYS.SYSTABLES T JOIN SYS.SYSSCHEMAS S ON T.SCHID = S.ID JOIN SYS.SYSTABLESPACE TS ON T.SPACEID = TS.ID WHERE T.NAME = UPPER('${TABLE_NAME}'); ``` **说明**: - `PATH` 字段显示表数据存储的物理文件路径,其父目录即为数据库文件所在位置。 - 达梦数据库实例的物理存储由表空间文件(`.DBF`)构成,库名通常体现在路径中(如 `/dmdata/DAMENG/HR.DBF`)。 --- ### 三、核心概念澄清 - **模式(SCHEMA)**:达梦中的逻辑容器,不同模式下可存在同名表(如 `HR.EMPLOYEE` 和 `SALES.EMPLOYEE`)。 - **数据库名(物理库)**:达梦实例(如 `DAMENG`)对应一个数据库,包含所有模式和数据文件。 - **结论**: **表直接属于某一模式,而模式属于数据库实例**。因此: 1. **逻辑归属**:通过所属模式确定(上述方法一)。 2. **物理归属**:通过表空间路径确定数据库文件位置(上述方法二)。 --- ### 示例验证流程 ```sql -- 1. 查询表EMPLOYEE的模式归属 SELECT OWNER AS "所属模式" FROM ALL_OBJECTS WHERE OBJECT_NAME = 'EMPLOYEE' AND OWNER = 'HR'; -- 2. 关联物理路径 SELECT S.NAME AS "数据库名(实例)", -- 固定为实例名(如DAMENG) TS.PATH AS "物理库文件路径" FROM SYS.SYSTABLES T JOIN SYS.SYSSCHEMAS S ON T.SCHID = S.ID JOIN SYS.SYSTABLESPACE TS ON T.SPACEID = TS.ID WHERE T.NAME = 'EMPLOYEE' AND S.NAME = 'HR'; ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值