达梦数据库单表查询操作指南

达梦数据库作为国产关系型数据库的代表,其单表查询功能与标准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实现,常配合聚合函数(COUNTSUMAVG等):

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 员工表;

性能优化建议
  1. 索引利用:为高频查询条件列创建索引,避免全表扫描。
    CREATE INDEX idx_name ON 表名(列名);
    

  2. 分区表查询:对大表使用分区策略,缩小扫描范围。
  3. 避免SELECT *:仅查询必要列,减少I/O开销。
  4. 执行计划分析:通过EXPLAIN检查查询路径,调整SQL结构。
    EXPLAIN SELECT * FROM 表名 WHERE 条件;
    

  5. 批量处理:使用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选项或设置查询超时。达梦支持行级锁和表级锁,根据并发需求选择。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐