简介:本文全面汇总达梦数据库DM8的SQL语法体系,涵盖DQL、DML、DDL等核心模块,提供结构化速查表与实战案例,助力开发者快速掌握高效数据库操作技巧。
达梦数据库DM8作为国产自主可控的数据库管理系统,其SQL语法体系兼容标准SQL并扩展了特有的功能特性。SQL语法主要分为三大类:DQL(数据查询语言)、DML(数据操作语言)、DDL(数据定义语言),辅以TCL(事务控制语言)和DCL(数据控制语言)构成完整的数据操作框架。本文将系统梳理各模块核心语法,结合达梦特有扩展功能,提供可直接应用的速查指南。
SELECT [DISTINCT] column_listFROM table_name[WHERE condition][GROUP BY group_column][HAVING group_condition][ORDER BY sort_column [ASC|DESC]][LIMIT offset, count];
达梦扩展特性:
TOP N语法替代LIMIT:SELECT TOP 10 * FROM tableSELECT * FROM table WHERE ROWID BETWEEN 11 AND 20
-- 内连接SELECT a.*, b.* FROM table1 a INNER JOIN table2 b ON a.id = b.id;-- 达梦特有外连接语法SELECT a.*, b.* FROM table1 a LEFT OUTER JOIN table2 b WITH(NOLOCK) ON a.id = b.id;
性能优化建议:
WITH(NOLOCK)提示减少锁竞争STRAIGHT_JOIN强制连接顺序(达梦8.3+版本支持)
-- 窗口函数应用SELECTemp_id,salary,RANK() OVER(PARTITION BY dept_id ORDER BY salary DESC) as dept_rankFROM employee;-- 递归查询(CTE)WITH RECURSIVE dept_tree AS (SELECT * FROM dept WHERE parent_id IS NULLUNION ALLSELECT d.* FROM dept d JOIN dept_tree dt ON d.parent_id = dt.id) SELECT * FROM dept_tree;
-- 批量插入优化INSERT INTO orders (order_id, cust_id, amount)VALUES (1, 1001, 500), (2, 1002, 750), (3, 1003, 320);-- 达梦特有UPDATE语法UPDATE products SET price = price * 1.1WHERE category_id IN (SELECT id FROM categories WHERE parent_id = 5)RETURNING product_id, old_price AS prev_price;
事务控制要点:
BEGIN WORK/COMMIT WORK显式事务控制SAVEPOINT设置事务回滚点
-- 安全删除模式DELETE FROM log_tableWHERE create_time < ADD_MONTHS(SYSDATE, -6)AND rowid NOT IN (SELECT DISTINCT log_id FROM audit_trail);-- 达梦级联删除示例ALTER TABLE order_itemsADD CONSTRAINT fk_orderFOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE;
CREATE TABLE employee (emp_id INT PRIMARY KEY,emp_name VARCHAR(50) NOT NULL,dept_id INT REFERENCES departments(dept_id),hire_date DATE DEFAULT SYSDATE,salary DECIMAL(10,2) CHECK(salary > 0),photo BLOB) TABLESPACE ts_employeeSTORAGE(INITIAL 100M, NEXT 50M);
达梦特有参数:
TABLESPACE指定表空间STORAGE子句控制存储参数COMMENT ON TABLE添加表注释
-- 创建复合索引CREATE INDEX idx_cust_order ON orders(cust_id, order_date DESC);-- 达梦函数索引示例CREATE INDEX idx_name_upper ON employees(UPPER(emp_name));-- 位图索引适用场景CREATE BITMAP INDEX idx_gender ON customers(gender)WHERE registration_date > '2023-01-01';
索引选择原则:
INDEX ONLY SCAN优化
-- 创建可更新视图CREATE VIEW emp_dept_view ASSELECT e.emp_id, e.emp_name, d.dept_nameFROM employees e JOIN departments d ON e.dept_id = d.dept_idWITH CHECK OPTION;-- 物化视图自动刷新CREATE MATERIALIZED VIEW sales_summaryREFRESH COMPLETE ON DEMANDAS SELECT product_id, SUM(quantity)FROM order_items GROUP BY product_id;
-- 设置事务隔离级别SET TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 保存点使用示例BEGIN WORK;UPDATE accounts SET balance = balance - 1000 WHERE acc_id = 1;SAVEPOINT sp1;UPDATE accounts SET balance = balance + 1000 WHERE acc_id = 2;-- 异常时回滚到保存点ROLLBACK TO sp1;COMMIT WORK;
-- 角色授权示例CREATE ROLE analyst_role;GRANT SELECT ON sales_data TO analyst_role;GRANT analyst_role TO user1, user2;-- 达梦特有系统权限GRANT CREATE ANY TABLESPACE TO dba_group;REVOKE DELETE ANY TABLE FROM junior_dev;
-- 创建序列CREATE SEQUENCE order_seqINCREMENT BY 1START WITH 1000MAXVALUE 999999CYCLE;-- 使用序列INSERT INTO orders(order_id, ...)VALUES (order_seq.NEXTVAL, ...);
-- 包定义示例CREATE OR REPLACE PACKAGE emp_pkg ASPROCEDURE raise_salary(p_emp_id INT, p_percent NUMBER);FUNCTION get_dept_avg(p_dept_id INT) RETURN NUMBER;END emp_pkg;/CREATE OR REPLACE PACKAGE BODY emp_pkg ASPROCEDURE raise_salary(p_emp_id INT, p_percent NUMBER) ISBEGINUPDATE employees SET salary = salary * (1 + p_percent/100)WHERE emp_id = p_emp_id;END;FUNCTION get_dept_avg(p_dept_id INT) RETURN NUMBER ISv_avg NUMBER;BEGINSELECT AVG(salary) INTO v_avg FROM employeesWHERE dept_id = p_dept_id;RETURN v_avg;END;END emp_pkg;/
| 优化场景 | 达梦特有语法 | 效果说明 |
|---|---|---|
| 大表查询 | /*+ FULL(table) */ |
强制全表扫描 |
| 索引使用 | /*+ INDEX(table idx_name) */ |
指定索引 |
| 并行查询 | /*+ PARALLEL(table 4) */ |
设置并行度 |
| 结果缓存 | SELECT /*+ RESULT_CACHE */ * FROM config |
缓存查询结果 |
调优建议:
EXPLAIN PLAN分析执行计划ANALYZE TABLE table_name COMPUTE STATISTICSSQL_TRACE功能本文系统梳理了达梦数据库DM8的核心SQL语法,结合标准SQL与达梦特有扩展,提供了可直接应用于开发实践的速查指南。建议开发者结合具体业务场景,通过达梦管理工具DM Manager进行语法验证与性能测试,持续提升数据库操作效率。