达梦数据库单表查询操作指南
摘要:本文详细介绍达梦数据库单表查询操作方法,包括基础SELECT语法、条件筛选(WHERE)、排序分组(ORDER BY/GROUP BY)、常用函数应用等核心功能。特别说明分页查询的两种实现方式(LIMIT/ROWNUM)以及CASE表达式、WITH子句等高级技巧,并提供创建索引、使用EXPLAIN等性能优化建议。同时指出达梦特有的伪列查询、TOP-N语法等注意事项,帮助用户高效提取数据并优化
达梦数据库单表查询操作指南
达梦数据库作为国产关系型数据库的代表,其单表查询功能与标准SQL语法高度兼容,同时提供了一些特有的优化特性。以下从基础查询、条件筛选、排序分组、函数应用等方面详细介绍单表查询的操作方法。
基础查询语法
达梦数据库单表查询遵循标准SQL语法,基础查询结构如下:
SELECT 列名1, 列名2 FROM 表名;
查询所有列时使用通配符:
SELECT * FROM 表名;
支持列别名定义,增强可读性:
SELECT 列名 AS 别名 FROM 表名;
条件筛选
通过WHERE子句实现数据过滤,支持比较运算符(=、>、<等)和逻辑运算符(AND、OR、NOT):
SELECT * FROM 表名 WHERE 列名 = 值;
支持模糊查询,LIKE配合%(任意字符)和_(单个字符):
SELECT * FROM 表名 WHERE 列名 LIKE '张%';
达梦扩展REGEXP支持正则表达式匹配:
SELECT * FROM 表名 WHERE 列名 REGEXP '^[0-9]+$';
排序与分组
使用ORDER BY对结果排序,默认为升序(ASC),降序需指定DESC:
SELECT * FROM 表名 ORDER BY 列名 DESC;
分组统计通过GROUP BY实现,常配合聚合函数(COUNT、SUM、AVG等):
SELECT 部门, COUNT(*) FROM 员工表 GROUP BY 部门;
HAVING子句用于过滤分组结果:
SELECT 部门, AVG(工资) FROM 员工表 GROUP BY 部门 HAVING AVG(工资) > 5000;
函数应用
达梦提供丰富的内置函数,包括字符串、数学、日期函数等:
SELECT CONCAT(姓, 名) AS 姓名, UPPER(地址) FROM 客户表;
日期函数示例:
SELECT 订单ID, DATEDIFF(DAY, 下单时间, 发货时间) AS 处理天数 FROM 订单表;
窗口函数支持高级分析(需达梦8及以上版本):
SELECT 员工ID, 工资, RANK() OVER (ORDER BY 工资 DESC) AS 排名 FROM 员工表;
性能优化建议
- 索引利用:为高频查询条件列创建索引,避免全表扫描。
CREATE INDEX idx_name ON 表名(列名); - 分区表查询:对大表使用分区策略,缩小扫描范围。
- 避免
SELECT *:仅查询必要列,减少I/O开销。 - 执行计划分析:通过
EXPLAIN检查查询路径,调整SQL结构。EXPLAIN SELECT * FROM 表名 WHERE 条件; - 批量处理:使用
FETCH FIRST N ROWS限制返回行数,降低网络传输负担。
特有功能
达梦支持TOP-N查询优化语法:
SELECT TOP 10 * FROM 表名 ORDER BY 销量 DESC;
兼容Oracle的ROWNUM伪列:
SELECT * FROM 表名 WHERE ROWNUM <= 5;
SELECT [DISTINCT] column_list
FROM table_name
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC|DESC]]
[LIMIT offset, row_count];
示例查询所有员工信息:
SELECT * FROM dm_employee;
使用DISTINCT去重:
SELECT DISTINCT dept_id FROM dm_employee;
条件筛选实现
WHERE子句支持多种条件表达式:
-- 比较运算
SELECT emp_name, salary FROM dm_employee WHERE salary > 10000;
-- 逻辑运算
SELECT * FROM dm_employee
WHERE dept_id = 'D001' AND hire_date > '2020-01-01';
-- IN/NOT IN
SELECT emp_id, emp_name FROM dm_employee
WHERE dept_id IN ('D001', 'D002');
-- BETWEEN
SELECT * FROM dm_employee
WHERE salary BETWEEN 8000 AND 15000;
-- LIKE模糊查询
SELECT * FROM dm_employee
WHERE emp_name LIKE '张%';
排序与分组
ORDER BY支持多列排序:
SELECT emp_name, salary, hire_date
FROM dm_employee
ORDER BY dept_id ASC, salary DESC;
GROUP BY分组统计:
SELECT dept_id, COUNT(*) as emp_count, AVG(salary) as avg_salary
FROM dm_employee
GROUP BY dept_id
HAVING AVG(salary) > 8000;
常用函数应用
字符串函数示例:
SELECT emp_id, UPPER(emp_name), SUBSTR(emp_no, 7, 4)
FROM dm_employee;
数值函数示例:
SELECT ROUND(salary, 2), TRUNC(salary/30, 2) as daily_salary
FROM dm_employee;
日期函数示例:
SELECT emp_name, DATEDIFF('YEAR', hire_date, CURRENT_DATE) as work_years
FROM dm_employee;
分页查询实现
达梦支持两种分页方式:
-- LIMIT语法
SELECT * FROM dm_employee
ORDER BY emp_id
LIMIT 10 OFFSET 20;
-- ROWNUM伪列
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM dm_employee ORDER BY emp_id
) a WHERE ROWNUM <= 30
) WHERE rn > 20;
高级查询技巧
CASE条件表达式:
SELECT emp_name, salary,
CASE
WHEN salary > 15000 THEN '高薪'
WHEN salary > 8000 THEN '中薪'
ELSE '基础'
END as salary_level
FROM dm_employee;
WITH子句实现临时结果集:
WITH dept_stats AS (
SELECT dept_id, AVG(salary) as avg_sal
FROM dm_employee
GROUP BY dept_id
)
SELECT e.* FROM dm_employee e
JOIN dept_stats d ON e.dept_id = d.dept_id
WHERE e.salary > d.avg_sal;
性能优化建议
创建合适索引提升查询速度:
CREATE INDEX idx_emp_dept ON dm_employee(dept_id);
CREATE INDEX idx_emp_name ON dm_employee(emp_name);
使用EXPLAIN分析执行计划:
EXPLAIN SELECT * FROM dm_employee WHERE dept_id = 'D001';
避免SELECT * 而明确指定列名,减少I/O开销。对于大表查询,建议结合分区表特性进行优化。
查询成功之后的页面

特殊语法注意事项
达梦数据库支持伪列查询:
SELECT ROWID, emp_name FROM dm_employee;
TOP-N查询语法:
SELECT TOP 10 * FROM dm_employee ORDER BY salary DESC;
时间戳特殊处理:
SELECT * FROM dm_log
WHERE operate_time > TIMESTAMP'2023-01-01 00:00:00';
注意事项
索引使用优化 确保查询条件中的字段已建立合适索引,避免全表扫描。达梦支持B-tree、位图等多种索引类型,根据数据分布选择合适的索引。复合索引需注意最左前缀匹配原则。
SQL编写规范 避免在WHERE子句中对字段使用函数或运算,这会导致索引失效。例如WHERE UPPER(name)='ABC'应改为WHERE name='ABC'(前提是数据存储规范)。
数据类型匹配 查询条件中的值类型必须与字段定义类型严格匹配,隐式类型转换可能影响性能。如VARCHAR字段查询时应使用字符串字面量而非数字。
分区表查询 若表为分区表,尽量在查询条件中包含分区键条件,使查询能定位到特定分区。达梦支持范围、列表、哈希等多种分区策略。
统计信息准确性 定期更新表统计信息(ANALYZE TABLE),优化器依赖统计信息生成执行计划。统计信息过期可能导致性能下降。
事务隔离级别 根据业务需求设置合适的事务隔离级别(如READ COMMITTED)。高隔离级别可能增加锁竞争,影响查询并发性能。
内存参数配置 调整SORT_AREA_SIZE等内存参数,对排序、哈希连接等操作有显著影响。大表查询需确保足够的内存分配。
示例性能对比
-- 低效写法(索引失效)
SELECT * FROM employees WHERE salary*1.1 > 5000;
-- 高效写法
SELECT * FROM employees WHERE salary > 5000/1.1;
执行计划分析 使用EXPLAIN命令查看执行计划,重点关注TABLE ACCESS方式(FULL/FULL SCAN表示全表扫描)、JOIN方法等。达梦提供图形化执行计划展示工具。
锁机制影响 长时间运行的查询可能持有锁资源,考虑使用NOWAIT选项或设置查询超时。达梦支持行级锁和表级锁,根据并发需求选择。
更多推荐


所有评论(0)