电科金仓KingbaseES数据库全面语法解析与应用实践
摘要:KingbaseES是国产化替代浪潮中的重要数据库产品,具备多模合一架构兼容主流数据库语法。文章详细介绍了其系统特性与基本语法操作,包括丰富的数据类型支持(数值、字符、日期等)、数据库/模式管理方法、数据表创建与维护(含分区表等高级特性)、DML操作(增删改查)、高级查询技术(连接查询、子查询、窗口函数)以及性能优化技巧。通过订单管理系统实例演示了实际应用场景,为技术人员掌握这一国产数据库提供了全面指导,助力信创环境下的数据库国产化迁移与开发工作。
1 KingbaseES数据库概述
金仓数据库管理系统KingbaseES是中电科金仓(北京)科技股份有限公司的核心产品,具有大型通用、高可靠、高性能、高安全、易管理、易使用、易扩展等特点,是唯一入选国家自主创新产品目录的数据库产品,也是国家级、省部级实际项目中应用最广泛的国产数据库产品。作为信创领域的核心数据库产品,KingbaseES由电科金仓自主研发,同时兼容Oracle、MySQL等主流数据库语法。官网地址:https://www.kingbase.com.cn/

KingbaseES采用"多模合一"架构,支持Oracle/PostgreSQL/MySQL/SQL Server四种兼容模式,开发者无需重新学习语法,可直接复用原有业务代码。无论是高校实验室的教学场景,还是企业级应用的国产化迁移,KingbaseES都展现出了灵活的适配能力。从部署层面看,KingbaseES提供轻量化单机版与企业级集群版,满足不同场景的需求。
在今天的国产化替代浪潮中,掌握KingbaseES的基本语法和操作技巧对于技术人员来说至关重要。本文将全面介绍KingbaseES_V009R001C010B0004_x86_64版本的基本语法,通过丰富的实例演示帮助读者快速掌握这一国产数据库的核心操作。

2 KingbaseES数据类型详解
2.1 数值类型
KingbaseES提供了丰富的数值类型,满足不同场景的数据存储需求。以下是主要的数值类型及其特性:
整数类型包括Smallint(2字节,-32768到+32767)、Integer(4字节,-2147483648到+2147483647)和Bigint(8字节,-9223372036854775808到+9223372036854775807)。与某些数据库不同,KingbaseES的整数类型不需要指定长度。
自增序列类型包括Smallserial(1到32767)、Serial(1到2147483647)和Bigserial(1到9223372036854775807),这些类型常用于主键的自动生成。
精确小数类型Numeric(也称为Decimal)支持用户指定精度,可存储小数点前131072位和小数点后16383位的数字。
浮点数类型包括Real(4字节,6位十进制数字精度)和Double precision(8字节,15位十进制数字精度),适用于科学计算等场景。
2.2 字符类型
KingbaseES提供了多种字符类型来存储文本数据:
-
Character varying(n)(别名Varchar):变长字符串,有长度限制
-
Character(n)(别名Char):定长字符串,不足补空白
-
text:变长字符串,无长度限制
在使用字符类型时,可以规定长度也可以不规定长度。对于可变长度字符串,推荐使用varchar或text类型,它们可以节省存储空间。
2.3 日期时间类型
KingbaseES支持全面的日期时间类型:
-
Date:4字节,只用于日期,范围从4713BC到5874897AD
-
Timestamp:8字节日期和时间,可以指定是否包含时区
-
Time:8字节只用于一日内时间,可以指定是否包含时区
-
Interval:12字节存储时间间隔,范围从-178000000年到178000000年
2.4 其他数据类型
除了上述基本类型,KingbaseES还支持布尔类型(Boolean/Bool,存储true/false值)、二进制类型(Bytea,存储二进制字符串)以及特殊字符类型(如内部使用的"char"和name类型)。
3 数据库和模式管理
3.1 数据库的创建与管理
在KingbaseES中,一个数据库集群包含一个或多个已命名的数据库。用户和用户组在整个集群范围是共享的,但是每个数据库的数据并不共享。任何与服务器连接的客户端都只能访问在连接请求里声明的数据库。
创建数据库的基本语法如下:
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] user_name ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ LC_COLLATE [=] lc_collate ]
[ LC_CTYPE [=] lc_ctype ]
[ TABLESPACE [=] tablespace_name ]
[ ALLOW_CONNECTIONS [=] allowconn ]
[ CONNECTION LIMIT [=] connlimit ]
[ IS_TEMPLATE [=] istemplate ] ]
修改数据库可以使用ALTER DATABASE语句,而删除数据库则使用DROP DATABASE语句。
3.2 模式的概念与使用
模式(Schema)是KingbaseES中重要的逻辑容器,一个数据库包含一个或多个已命名的模式,模式包含表及其它对象,如数据类型、函数、操作符等。使用模式的优点包括:
-
允许多个用户使用一个数据库而不会干扰其它用户
-
将数据库对象组织成逻辑组,使得它们更便于管理
-
第三方的应用可以放在不同的模式中,但不会和其它同名对象冲突
创建模式的语法如下:
CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification
设置模式搜索路径可以让用户更方便地访问模式中的对象:
-- 显示当前搜索路径
SHOW search_path;-- 设置搜索路径
SET search_path TO kmxiao,test_schema;
4 数据定义语言(DDL)

4.1 创建表
表是KingbaseES数据库中最基本的操作对象,记录了实体对象的重要信息。KingbaseES数据库表对象类型是关系表,关系表由简单的列组成,是最常见的表类型。
创建表的基本语法树如下:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
[ (column_name [, ...] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
AS query
[ WITH [ NO ] DATA ]
需要注意的是,在KingbaseES中,int类型是不可以定长的,这是常见的建表错误。错误示例:create table students (num int(10), name varchar(225), age int(3));会报语法错误。正确的创建语句应该是:create table students (num int, name varchar(225), age int);。
4.2 表示例:订单管理系统
以下是一个完整的订单管理系统表示例:
-- 创建客户表
CREATE TABLE customers (C_ID INT AUTO_INCREMENT PRIMARY KEY,C_NAME VARCHAR(50) NOT NULL,C_ADDRESS TEXT NOT NULL,C_PHONE VARCHAR(15) NOT NULL
);-- 创建分区表items商品表
CREATE TABLE items (I_ID INT PRIMARY KEY,I_NAME VARCHAR(100) NOT NULL,I_PRICE DECIMAL(10,2) NOT NULL,I_STOCK INT NOT NULL
) PARTITION BY RANGE (I_PRICE) (PARTITION p_low VALUES LESS THAN (200),PARTITION p_medium VALUES LESS THAN (500),PARTITION p_high VALUES LESS THAN (1000),PARTITION p_high_price VALUES LESS THAN (MAXVALUE)
);-- 创建orders订单表
CREATE TABLE orders (O_ID INT,O_DATE DATE NOT NULL,C_ID INT NOT NULL,I_ID INT NOT NULL,O_QUANTITY INT NOT NULL,O_TOTAL_PRICE DECIMAL(10,2) NOT NULL,FOREIGN KEY(C_ID) REFERENCES customers(C_ID),FOREIGN KEY(I_ID) REFERENCES items(I_ID)
);
实操记录如下图所示:

4.3 修改表结构
在实际应用中,经常需要修改已存在的表结构。KingbaseES提供了ALTER TABLE语句来实现这一功能:
-- 给订单表添加主键
ALTER TABLE orders ADD CONSTRAINT pk_orders PRIMARY KEY(O_ID);-- 给订单表添加一个comment列
ALTER TABLE orders ADD COLUMN comment varchar(20);-- 修改列数据类型
ALTER TABLE orders ALTER COLUMN comment TYPE varchar(50);-- 删除列
ALTER TABLE orders DROP COLUMN comment;
实操记录如下图所示:

4.4 表类型与特性
KingbaseES支持多种表类型,满足不同场景的需求:
-
普通表:存放永久数据的基本表类型
-
临时表(TEMP):临时存放数据,包括会话级别的局部临时表和可共享表定义的全局临时表
-
分区表:将逻辑上的大表拆分成较小的相对独立的子表,支持范围分区(PARTITION BY RANGE)、列表分区(PARTITION BY LIST)和哈希分区(PARTITION BY HASH)
-
继承表(INHERITS):子表继承父表的所有字段,支持多重继承
使用分区表的优势在于可以减少I/O访问量,提高查询性能,通过有选择地搜索分区来降低I/O访问量。
5 数据操作语言(DML)
5.1 插入数据
INSERT语句用于向数据库表中插入新数据。KingbaseES支持多种插入数据的方式:
基本插入语句需要指定要插入数据的表名和列名,以及相应的值:
INSERT INTO customers (C_NAME, C_ADDRESS, C_PHONE)
VALUES ('Alice Smith', '123 Main St, City A', '123-456-7890');
多行插入可以在一个命令中插入多行数据:
INSERT INTO customers (C_NAME, C_ADDRESS, C_PHONE)
VALUES ('Alice Smith', '123 Main St, City A', '123-456-7890'),('Bob Johnson', '456 Oak Ave, City B', '234-567-8901'),('Charlie Brown', '789 Pine Rd, City C', '345-678-9012');
插入查询结果可以将查询结果插入到表中:
INSERT INTO products (product_no, name, price)
SELECT product_no, name, price FROM new_products
WHERE release_date = 'today';
对于大批量数据插入,可以使用KingbaseES提供的sys_bulkload工具,这比普通的INSERT语句效率更高。实操记录如下图所示:

5.2 插入测试数据示例
以下是向订单管理系统插入测试数据的示例:
-- 向customers表中插入数据
INSERT INTO customers (C_NAME, C_ADDRESS, C_PHONE)
VALUES ('Alice Smith', '123 Main St, City A', '123-456-7890'),('Bob Johnson', '456 Oak Ave, City B', '234-567-8901'),('Charlie Brown', '789 Pine Rd, City C', '345-678-9012');-- 向items表中插入数据
INSERT INTO items (I_ID, I_NAME, I_PRICE, I_STOCK)
VALUES(1, 'Laptop', 1299.99, 50),(2, 'Phone', 699.99, 75),(3, 'Tablet', 299.99, 30);-- 向orders表中插入数据
INSERT INTO orders (O_ID, O_DATE, C_ID, I_ID, O_QUANTITY, O_TOTAL_PRICE)
VALUES(1, '2023-10-01', 1, 1, 2, 2599.98),(2, '2023-10-02', 2, 2, 1, 699.99),(3, '2023-10-03', 3, 3, 3, 899.97);
实操记录如下图所示:

5.3 查询数据
SELECT语句是SQL中最常用的语句,用于从数据库表中检索数据。基本的SELECT语句包括选择列、指定数据源和设置条件:
-- 查询所有列
SELECT * FROM customers;-- 查询特定列
SELECT C_NAME, C_PHONE FROM customers;-- 使用别名
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
实操记录如下图所示:

条件查询使用WHERE子句过滤数据:
-- 等值查询
select * from employees where last_name = 'Doe';-- 范围查询
SELECT * FROM employees WHERE hire_date BETWEEN '2023-01-01 00:00:00' AND '2025-11-08 00:00:00';-- 多重条件
SELECT * FROM employees WHERE last_name = 'Doe' AND hire_date > '2022-01-01 00:00:00';
实操记录如下图所示:

高级查询功能包括:
-
去重查询:
SELECT DISTINCT empid FROM employee; -
排序查询:
SELECT * FROM weather ORDER BY city, temp_lo; -
分组查询:
SELECT city, max(temp_lo) FROM weather GROUP BY city; -
分页查询:
SELECT empid, name FROM employee ORDER BY empid LIMIT 5 OFFSET 0;
5.4 更新数据
UPDATE语句用于修改数据库表中的现有数据。基本语法如下:
UPDATE 表名
SET 列名1 = 值1, 列名2 = 值2, ...
WHERE 条件;
在实际应用中,为了保证数据安全,建议先查询确认要修改的数据,再执行更新,最后验证更新结果:
-- 1. 查询确认要修改的订单
SELECT * FROM orders WHERE O_ID = 7;-- 2. 执行更新
UPDATE orders
SET O_TOTAL_PRICE = 800.00
WHERE O_ID = 7;-- 3. 验证更新结果
SELECT * FROM orders WHERE O_ID = 7;
实操记录如下图所示:

也可以同时更新多个字段:
UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > '1994-11-28';
5.5 删除数据
DELETE语句用于从数据库表中删除数据。使用DELETE时应当特别注意,避免误删数据:
条件删除只删除满足特定条件的行:
DELETE FROM employees WHERE age < 30;
安全删除实践建议先查询确认要删除的数据:
-- 先查询确认要删除的订单
SELECT * FROM orders WHERE O_ID = 5;-- 确认后执行删除
DELETE FROM orders WHERE O_ID = 5;
清空表有多种方式,各有不同的效果:
-
DELETE FROM table_name;-- 删除所有行,但保留表结构 -
TRUNCATE TABLE table_name;-- 清空表内容,表还在,表的约束索引都在,性能比DELETE好 -
DROP TABLE table_name;-- 删除整个表结构,包括表的内容
6 高级查询技术

6.1 多表连接查询
连接查询是关系数据库的核心功能,允许从多个表中检索相关数据。KingbaseES支持多种连接类型:
内连接(INNER JOIN)返回两个表中连接条件匹配的行:
-- 使用ON的内连接
SELECT * FROM students INNER JOIN class ON students.num = class.num;-- 使用USING的内连接(去掉重复的字段)
SELECT * FROM students INNER JOIN class USING(num);
外连接包括左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN),用于返回不匹配的行:
-- 左外连接(返回左表所有行和右表匹配的行)
SELECT * FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
交叉连接(CROSS JOIN)返回两个表的笛卡尔积:
SELECT * FROM students CROSS JOIN class;
自连接是指表与自身连接,常用于查询层次结构或比较表内数据:
SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,W2.city, W2.temp_lo AS low, W2.temp_hi AS high
FROM weather W1, weather W2
WHERE W1.temp_lo < W2.temp_lo AND W1.temp_hi > W2.temp_hi;
6.2 子查询
子查询是将一个查询的结果作为另一个查询的数据来源或判断条件的查询。KingbaseES支持多种子查询方式:
IN/NOT IN子查询用于检查某个值是否在子查询结果中:
SELECT name FROM students WHERE num IN (SELECT num FROM class);SELECT ... FROM fdt WHERE c1 IN (SELECT c1 FROM t2);
EXISTS/NOT EXISTS子查询检查子查询是否返回结果:
SELECT name FROM students WHERE EXISTS (SELECT num FROM class);
ANY/SOME和ALL子查询用于与子查询结果的比较:
-- ANY表示满足任意一个条件即可
SELECT * FROM products WHERE price > ANY (SELECT price FROM special_products);-- ALL表示需要满足所有条件
SELECT * FROM products WHERE price > ALL (SELECT price FROM special_products);
6.3 聚合函数与分组
KingbaseES提供了丰富的聚合函数用于数据统计和分析:
-
count():统计行数
-
sum():计算总和
-
avg():计算平均值
-
max():获取最大值
-
min():获取最小值
使用GROUP BY子句可以对结果进行分组:
SELECT city, max(temp_lo)
FROM weather
GROUP BY city;
使用HAVING子句可以对分组结果进行过滤:
SELECT city, max(temp_lo)
FROM weather
GROUP BY city
HAVING max(temp_lo) < 40;
6.4 模式匹配查询
KingbaseES提供了强大的模式匹配功能,包括LIKE操作符和正则表达式:
LIKE操作符使用通配符进行模式匹配:
-
%匹配任何字符序列 -
_匹配任意单个字符
示例查询:
-- 返回姓名包含A的员工信息
SELECT * FROM employee WHERE name like '%A%';-- 返回所有以A开头的姓名
SELECT * FROM employee WHERE name like 'A%';-- 返回所有以A结尾的姓名
SELECT * FROM employee WHERE name like '%A';-- 返回所有以A开头,且只有两个字符的姓名
SELECT * FROM employee WHERE name like 'A_';
KingbaseES对LIKE进行了拓展,提供了ILIKE操作符,在模式匹配时忽略大小写。此外,还支持SQL标准的正则表达式匹配:
-- 使用SIMILAR TO进行正则表达式匹配
SELECT * FROM employee WHERE name SIMILAR TO '%(a|o)';-- 使用~进行POSIX正则表达式匹配
SELECT * FROM employee WHERE name ~ '^A.*B$';
7 高级特性与性能优化
7.1 窗口函数
窗口函数是KingbaseES的高级特性,可以进行排序、生成序列号等一般聚合函数无法实现的操作。窗口函数语法如下:
<窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用列清单>)
窗口函数主要分为两类:
-
能够作为窗口函数的聚合函数(sum、avg、count、max、min)
-
rank、dense_rank、row_number等专用窗口函数
示例:展示每个员工的薪水与他/她所在部门的平均薪水的比较:
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname)
FROM empsalary;
7.2 视图
视图是虚拟表,其内容由查询定义。创建视图可以给查询一个名字,可以像使用普通表一样使用它:
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;SELECT * FROM myview;
视图可以简化复杂查询,提高数据安全性和逻辑独立性。
7.3 事务控制
KingbaseES支持完整的事务控制,确保数据的一致性:
-
BEGIN:开始事务
-
COMMIT:提交事务
-
ROLLBACK:回滚事务
-
SAVEPOINT:在事务中设置保存点
-
SET TRANSACTION ISOLATION LEVEL:设置事务隔离级别
7.4 性能优化技巧
-
索引优化:对经常用于查询条件的列创建索引
-
分区表:对大表使用分区提高查询性能
-
批量操作:使用批量插入代替单条插入
-
查询优化:避免SELECT *,只选择需要的列
8 实际应用示例

8.1 订单管理系统综合查询
结合前面创建的订单表结构,以下是一些综合查询示例:
-- 查询客户的姓名和他们下的订单总数
SELECT C_NAME, COUNT(O_ID) as order_count
FROM customers
LEFT JOIN orders ON customers.C_ID = orders.C_ID
GROUP BY C_NAME;-- 查询每类商品的销售总量和总金额
SELECT I_NAME, SUM(O_QUANTITY) as total_quantity, SUM(O_TOTAL_PRICE) as total_amount
FROM items
JOIN orders ON items.I_ID = orders.I_ID
GROUP BY I_NAME;-- 使用窗口函数计算每个客户的订单金额排名
SELECT C_NAME, O_DATE, O_TOTAL_PRICE,RANK() OVER (PARTITION BY customers.C_ID ORDER BY O_TOTAL_PRICE DESC) as rank
FROM customers
JOIN orders ON customers.C_ID = orders.C_ID;
8.2 数据维护最佳实践

在实际应用中,数据维护需要遵循安全、高效的原则:
更新操作最佳实践:
-- 1. 先查询确认要修改的数据
SELECT * FROM orders WHERE O_ID = 7;-- 2. 执行更新
UPDATE orders SET O_TOTAL_PRICE = 800.00 WHERE O_ID = 7;-- 3. 验证更新结果
SELECT * FROM orders WHERE O_ID = 7;
删除操作最佳实践:
-- 先查询确认要删除的数据
SELECT * FROM orders WHERE O_ID = 5;-- 确认后执行删除
DELETE FROM orders WHERE O_ID = 5;
9 总结
本文全面介绍了电科金仓KingbaseES数据库的基本语法和高级特性,涵盖了数据类型、数据库和模式管理、表设计、数据操作以及高级查询技术等方面。通过丰富的实例演示,展示了如何在KingbaseES环境中进行高效的数据库操作。

KingbaseES作为一款成熟的国产数据库产品,具有以下显著特点:
-
多语法兼容:支持Oracle、MySQL、PostgreSQL等多种数据库语法,降低迁移成本
-
高性能:在批量操作和复杂查询场景下表现优异
-
完善的工具链:提供图形化管理工具和命令行工具,便于开发和管理
-
国产化适配:已适配主流国产芯片和操作系统,满足信创要求
对于开发者来说,掌握KingbaseES的基本语法和特性,能够更好地应对国产化替代带来的技术挑战,为构建安全可控的信息系统奠定坚实基础。随着国产数据库技术的不断发展,KingbaseES将在各行各业发挥越来越重要的作用。

关于本文,博主还写了相关文章,欢迎关注《电科金仓》分类:
第一章:基础与入门(13篇)
1、【金仓数据库征文】政府项目数据库迁移:从MySQL 5.7到KingbaseES的蜕变之路
2、【金仓数据库征文】学校AI数字人:从Sql Server到KingbaseES的数据库转型之路
3、电科金仓2025发布会,国产数据库的AI融合进化与智领未来
4、国产数据库逆袭:老邓的“六大不敢替”被金仓逐一破解
5、《一行代码不改动!用KES V9 2025完成SQL Server → 金仓“平替”迁移并启用向量检索》
6、《赤兔引擎×的卢智能体:电科金仓如何用“三骏架构”重塑AI原生数据库一体机》
7、探秘KingbaseES在线体验平台:技术盛宴还是虚有其表?
8、破除“分布式”迷思:回归数据库选型的本质
9、KDMS V4 一键搞定国产化迁移:零代码、零事故、零熬夜——金仓社区发布史上最省心数据库迁移评估神器
10、KingbaseES V009版本发布:国产数据库的新飞跃
11、从LIS到全院云:浙江省人民医院用KingbaseES打造国内首个多院区异构多活信创样板
12、异构多活+零丢失:金仓KingbaseES在浙人医LIS国产化中的容灾实践
13、金仓KingbaseES数据库:迁移、运维与成本优化的全面解析
第二章:能力与提升(10篇)
1、零改造迁移实录:2000+存储过程从SQL Server滑入KingbaseES V9R4C12的72小时
2、国产数据库迁移神器,KDMSV4震撼上线
3、在Ubuntu服务器上安装KingbaseES V009R002C012(Orable兼容版)数据库过程详细记录
4、金仓数据库迁移评估系统(KDMS)V4 正式上线:国产化替代的技术底气
5、Ubuntu系统下Python连接国产KingbaseES数据库实现增删改查
6、KingbaseES V009版本发布,新特性代码案例
7、Java连接电科金仓数据库(KingbaseES)实战指南
8、使用 Docker 快速部署 KingbaseES 国产数据库:亲测全过程分享
9、【金仓数据库产品体验官】Oracle兼容性深度体验:从SQL到PL/SQL,金仓KingbaseES如何无缝平替Oracle?
10、KingbaseES在Alibaba Cloud Linux 3 的深度体验,从部署到性能实战
第三章:实践与突破(10篇)
1、国产之光金仓数据库,真能平替MongoDB?实测来了!
2、【金仓数据库产品体验官】实战测评:电科金仓数据库接口兼容性深度体验
3、KingbaseES与MongoDB全面对比:一篇从理论到实战的国产化迁移指南
4、从SQL Server到KingbaseES:一步到位的跨平台迁移与性能优化指南
5、ksycopg2实战:Python连接KingbaseES数据库的完整指南
6、KingbaseES:从MySQL兼容到权限隔离与安全增强的跨越
7、电科金仓KingbaseES数据库全面语法解析与应用实践
后期作品正在准备中,敬请关注......
