金仓数据库KingbaseES基础语法详解与实践指南

1 金仓数据库概述

金仓数据库管理系统KingbaseES是中电科金仓(北京)科技股份有限公司研发的企业级关系型数据库产品,作为国产化替代浪潮中的核心力量,已广泛应用于政府、金融等关键行业领域。该产品具有大型通用、高可靠、高性能、高安全等特点,是国家自主创新产品目录中唯一的数据库产品。

KingbaseES采用**"多模合一"架构**,支持Oracle、PostgreSQL、MySQL及SQL Server四种兼容模式,这一特性使得开发者无需重新学习语法即可平滑迁移现有业务系统。从部署层面看,KingbaseES提供从轻量化单机版到企业级集群版的多种解决方案,满足不同应用场景的需求。

随着信创战略的深入推进,掌握KingbaseES的基本语法和操作技巧已成为技术人员必备的技能。本文将以KingbaseES V9R1C10版本为基础,全面介绍该数据库的核心语法和实战技巧。

2 数据库与模式管理

2.1 数据库的创建与管理

在KingbaseES中,数据库集群包含多个命名的数据库,用户和用户组在集群范围内共享,但各数据库的数据相互隔离。客户端连接只能访问连接请求中指定的数据库。

创建数据库的基本语法如下:

sql 复制代码
CREATE DATABASE name
[ WITH ] [ OWNER [=] user_name ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ TABLESPACE [=] tablespace_name ]
[ CONNECTION LIMIT [=] connlimit ]

实际应用示例

sql 复制代码
-- 创建基本数据库
CREATE DATABASE mydb;

-- 指定属主和编码创建数据库
CREATE DATABASE mydb 
    WITH OWNER = SYSTEM
    ENCODING = 'UTF8'
    TEMPLATE = template1
    TABLESPACE = pg_default;

创建数据库后,可以通过sys_database系统表查看数据库信息,使用sys_database_size('dbname')函数查询数据库占用空间。

KingbaseES提供三种创建数据库的方式:图形界面操作SQL命令命令行工具createdb。对于生产环境,建议使用SQL脚本方式以便于版本控制和自动化部署。

2.2 模式的概念与使用

**模式(Schema)**​ 是KingbaseES中重要的逻辑容器,用于组织数据库对象。每个数据库包含一个或多个模式,模式内包含表、数据类型、函数等对象。

使用模式的主要优势包括:

  • 多用户隔离:允许多个用户使用同一数据库而不会相互干扰

  • 逻辑组织:将数据库对象组织成逻辑组,便于管理维护

  • 命名空间隔离:第三方应用可放在不同模式中,避免同名对象冲突

模式管理语法

sql 复制代码
-- 创建模式
CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ];

-- 设置搜索路径
SET search_path TO kmxiao, test_schema;

-- 显示当前搜索路径
SHOW search_path;

在实际项目开发中,建议将业务表统一放置在PUBLIC模式下,这样有利于数据库迁移和SQL语句编写。

3 数据类型详解

3.1 数值类型

KingbaseES提供丰富的数值类型以满足不同场景需求:

整数类型

  • Smallint:2字节,范围-32768到+32767

  • Integer:4字节,范围-2147483648到+2147483647

  • Bigint:8字节,范围-9223372036854775808到+9223372036854775807

自增序列类型

  • Smallserial:1到32767

  • Serial:1到2147483647

  • Bigserial:1到9223372036854775807

精确小数类型

  • Numeric/Decimal:支持用户指定精度,可存储小数点前131072位和小数点后16383位的数字

浮点数类型

  • Real:4字节,6位十进制精度

  • Double precision:8字节,15位十进制精度

与某些数据库不同,KingbaseES的整数类型不需要指定长度,这是建表时需要注意的细节。

3.2 字符类型

KingbaseES提供多种字符类型存储文本数据:

  • Character varying(n)(别名Varchar):变长字符串,有长度限制

  • Character(n)(别名Char):定长字符串,不足补空白

  • text:变长字符串,无长度限制

字符类型支持字节或字符语义 ,通过系统参数nls_length_semantics控制默认行为,也可显式指定:

sql 复制代码
-- 显式指定字符语义
CREATE TABLE test_char (col char(4 char));

-- 显式指定字节语义  
CREATE TABLE test_byte (col char(4 byte));

字符类型的最大长度限制为10485760字节或字符,实际使用时应根据业务需求合理选择类型和长度。

3.3 日期时间类型

  • Date:4字节,只存储日期,范围从4713BC到5874897AD

  • Timestamp:8字节日期和时间,可指定是否包含时区

  • Time:8字节存储一日内时间,可指定是否包含时区

  • Interval:12字节存储时间间隔,范围从-178000000年到178000000年

3.4 其他数据类型

  • 布尔类型:Boolean/Bool,存储true/false值

  • 二进制类型:Bytea,存储二进制字符串

  • 大文本类型:Text,最大可存储1GB数据

4 数据定义语言(DDL)

4.1 表的创建与管理

表是KingbaseES中最基本的数据存储对象,创建表时需要定义列名、数据类型及约束条件。

基本建表语法

sql 复制代码
CREATE [ TEMPORARY | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
(column_name data_type [ column_constraint [...] ]
[, table_constraint ...])
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) ];

订单表示例

sql 复制代码
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)
);

常见建表错误

sql 复制代码
-- 错误示例: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 表类型与特性

KingbaseES支持多种表类型适应不同场景:

普通表:存放永久数据的基本表类型

临时表(TEMP):会话级别的临时数据存储

分区表:将大表拆分为相对独立的子表,提升查询性能和管理效率

分区表示例

sql 复制代码
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)
);

分区表支持范围分区列表分区哈希分区三种策略,可根据业务需求选择合适的分区方式。

4.3 表结构修改

在实际应用中,经常需要调整已存在的表结构,KingbaseES提供ALTER TABLE语句实现这一功能:

sql 复制代码
-- 添加主键约束
ALTER TABLE orders ADD CONSTRAINT pk_orders PRIMARY KEY(O_ID);

-- 添加新列
ALTER TABLE orders ADD COLUMN comment varchar(50);

-- 修改列数据类型
ALTER TABLE orders ALTER COLUMN comment TYPE varchar(100);

-- 删除列
ALTER TABLE orders DROP COLUMN comment;

修改表结构时需注意数据兼容性问题,特别是修改数据类型时需确保现有数据能正确转换。

5 数据操作语言(DML)

5.1 插入数据(INSERT)

INSERT语句用于向表添加新数据,支持多种插入方式:

基本插入

sql 复制代码
INSERT INTO customers (C_NAME, C_ADDRESS, C_PHONE) 
VALUES ('Alice Smith', '123 Main St, City A', '123-456-7890');

批量插入

sql 复制代码
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');

插入查询结果

sql 复制代码
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 查询数据(SELECT)

SELECT语句是SQL核心,用于从表中检索数据:

基本查询

sql 复制代码
-- 查询所有列
SELECT * FROM customers;

-- 查询特定列
SELECT C_NAME, C_PHONE FROM customers;

-- 使用别名
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

条件查询

sql 复制代码
-- 等值查询
SELECT * FROM employees WHERE last_name = 'Doe';

-- 范围查询
SELECT * FROM employees WHERE hire_date BETWEEN '2023-01-01' AND '2025-11-08';

-- 多重条件
SELECT * FROM employees WHERE last_name = 'Doe' AND hire_date > '2022-01-01';

高级查询功能

sql 复制代码
-- 去重查询
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.3 更新数据(UPDATE)

UPDATE语句用于修改表中现有数据:

基本更新

sql 复制代码
UPDATE orders
SET O_TOTAL_PRICE = 800.00
WHERE O_ID = 7;

多字段更新

sql 复制代码
UPDATE weather 
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2 
WHERE date > '1994-11-28';

安全更新实践

为保证数据安全,建议先查询确认要修改的数据,再执行更新,最后验证结果:

sql 复制代码
-- 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;

5.4 删除数据(DELETE)

DELETE语句用于从表中删除数据:

条件删除

sql 复制代码
DELETE FROM employees WHERE age < 30;

安全删除实践

与更新操作类似,删除前应先确认数据:

sql 复制代码
-- 先查询确认要删除的订单
SELECT * FROM orders WHERE O_ID = 5;

-- 确认后执行删除
DELETE FROM orders WHERE O_ID = 5;

清空表的多种方式

  • DELETE FROM table_name:删除所有行,保留表结构,可回滚

  • TRUNCATE TABLE table_name:清空表内容,表结构保留,性能更好

  • DROP TABLE table_name:删除整个表,包括表结构和数据

6 高级查询技术

6.1 多表连接查询

连接查询是关系数据库的核心功能,KingbaseES支持多种连接类型:

内连接

sql 复制代码
SELECT u.username, p.content
FROM users u
JOIN posts p ON u.id = p.user_id;

左外连接

sql 复制代码
SELECT u.username, o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

自连接

sql 复制代码
SELECT e1.name, e2.name as manager_name
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;

6.2 子查询

子查询提供了更复杂的数据检索能力:

标量子查询

sql 复制代码
SELECT name, price, 
       (SELECT AVG(price) FROM products) as avg_price
FROM products;

存在性检查

sql 复制代码
SELECT name
FROM departments d
WHERE EXISTS (SELECT 1 FROM employees e WHERE e.dept_id = d.id);

IN子查询

sql 复制代码
SELECT name
FROM products
WHERE category_id IN (SELECT id FROM categories WHERE active = true);

6.3 窗口函数

窗口函数允许在结果集的某个窗口上执行计算,而不影响结果集的行数:

sql 复制代码
SELECT name, department, salary,
       AVG(salary) OVER (PARTITION BY department) as dept_avg_salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;

7 数据库开发实践

7.1 学生选课系统示例

数据库设计

sql 复制代码
-- 创建学生表
CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INTEGER CHECK (age > 0 AND age < 120),
    gender CHAR(1) CHECK (gender IN ('M', 'F')),
    email VARCHAR(100) UNIQUE,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 创建课程表
CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,
    course_name VARCHAR(100) NOT NULL,
    course_code VARCHAR(20) UNIQUE NOT NULL,
    credits INTEGER CHECK (credits > 0),
    teacher VARCHAR(50),
    description TEXT
);

-- 创建选课表
CREATE TABLE enrollments (
    enrollment_id SERIAL PRIMARY KEY,
    student_id INTEGER NOT NULL,
    course_id INTEGER NOT NULL,
    grade DECIMAL(3,1) CHECK (grade >= 0 AND grade <= 100),
    enroll_date DATE DEFAULT CURRENT_DATE,
    FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE,
    FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE,
    UNIQUE(student_id, course_id)
);

数据操作

sql 复制代码
-- 插入测试数据
INSERT INTO students (name, age, gender, email) VALUES
('张三', 20, 'M', 'zhangsan@example.com'),
('李四', 21, 'F', 'lisi@example.com');

INSERT INTO courses (course_name, course_code, credits, teacher) VALUES
('数据库原理', 'DB101', 3, '张教授'),
('Java程序设计', 'JAVA201', 4, '李教授');

-- 复杂查询:查询学生选课情况
SELECT s.name, c.course_name, e.grade
FROM students s
JOIN enrollments e ON s.id = e.student_id
JOIN courses c ON e.course_id = c.course_id
WHERE e.grade IS NOT NULL
ORDER BY s.name, e.grade DESC;

7.2 性能优化建议

  1. 索引策略:在经常查询的列上创建索引,但避免过度索引影响写入性能

  2. 查询优化:使用EXPLAIN分析查询计划,避免全表扫描

  3. 分区策略:对大数据表采用分区技术提升查询效率

  4. 连接优化:确保连接条件上有合适的索引

8 工具与客户端使用

8.1 KStudio开发工具

KingbaseES提供KStudio图形化管理工具,支持数据库开发的全生命周期管理。主要功能包括:

  • 对象管理:可视化创建、修改数据库对象

  • 数据编辑:直观的数据增删改查界面

  • SQL编辑:语法高亮、智能提示的SQL编辑器

  • 性能监控:数据库性能监控和调优工具

8.2 ksql命令行工具

ksql是KingbaseES的命令行客户端,支持本地和远程连接:

基本连接命令

sql 复制代码
# 连接到本地数据库
ksql -h localhost -p 54321 -d TEST -U SYSTEM -W

# 执行SQL文件
ksql -h localhost -p 54321 -d TEST -U SYSTEM -f script.sql

# 执行单条命令
ksql -h localhost -p 54321 -d TEST -U SYSTEM -c "SELECT version();"

常用元命令

bash 复制代码
-- 查看所有数据库
\l

-- 查看当前数据库下的表
\dt

-- 查看表结构
\d table_name

-- 切换数据库
\c database_name

-- 查看所有用户
\du

9 最佳实践与注意事项

9.1 命名规范

  • 使用有意义的英文名词命名数据库对象

  • 保持命名一致性,如主键字段统一命名为id

  • 避免使用保留字和特殊字符

  • 表名使用复数形式,列名使用单数形式

9.2 安全规范

  • 遵循最小权限原则,合理分配用户权限

  • 使用参数化查询防止SQL注入

  • 敏感数据加密存储

  • 定期备份和恢复测试

9.3 性能规范

  • 避免SELECT *,明确指定需要的列

  • 大量数据操作使用批量处理

  • 合理使用事务,避免长事务

  • 定期分析表和更新统计信息

10 总结

本文系统介绍了金仓数据库KingbaseES的基础语法和核心功能,涵盖数据库管理、数据类型、DDL、DML、高级查询等关键内容。通过实际示例演示了如何在实际项目中应用这些知识。

KingbaseES作为国产数据库的佼佼者,既兼容国际主流数据库语法,又具备国产化优势。掌握其核心技术对于从事国产化项目开发的技术人员至关重要。建议读者在学习理论的同时,多进行实践操作,逐步掌握这款强大的数据库管理系统。

随着信创产业的深入发展,KingbaseES将在更多关键领域发挥重要作用。希望本文能为您的KingbaseES学习之路提供有力支持,助力您在国产数据库技术领域取得更大成就。

关于本文,博主还写了相关文章,欢迎关注《电科金仓》分类:

第一章:基础与入门(15篇)

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数据库:迁移、运维与成本优化的全面解析

14、部署即巅峰,安全到字段:金仓数据库如何成为企业数字化转型的战略级引擎

15、电科金仓 KEMCC-V003R002C001B0001 在CentOS7系统环境内测体验:安装部署与功能实操全记录

第二章:能力与提升(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 的深度体验,从部署到性能实战

第三章:实践与突破(13篇)

1、国产之光金仓数据库,真能平替MongoDB?实测来了!

2、【金仓数据库产品体验官】实战测评:电科金仓数据库接口兼容性深度体验

3、KingbaseES与MongoDB全面对比:一篇从理论到实战的国产化迁移指南

4、从SQL Server到KingbaseES:一步到位的跨平台迁移与性能优化指南

5、ksycopg2实战:Python连接KingbaseES数据库的完整指南

6、KingbaseES:从MySQL兼容到权限隔离与安全增强的跨越

7、电科金仓KingbaseES数据库全面语法解析与应用实践

8、电科金仓国产数据库KingBaseES深度解析:五个一体化的技术架构与实践指南

9、电科金仓自主创新数据库KingbaseES在医疗行业的创新实践与深度应用

10、金仓KingbaseES助力央企数字化转型

11、金仓数据库引领新能源行业数字化转型:案例深度解析与领导力展现

12、金仓数据库在发电行业的创新应用与实战案例

13、Oracle迁移实战:从兼容性挑战到平滑过渡金仓数据库的解决方案

第四章:重点与难点(13篇)

1、从Oracle到金仓KES:PL/SQL兼容性与高级JSON处理实战解析

2、Oracle迁移的十字路口:金仓KES vs 达梦 vs OceanBase核心能力深度横评

3、Oracle迁移至金仓数据库:PL/SQL匿名块执行失败的深度排查指南

4、【金仓数据库产品体验官】Oracle迁移实战:深度剖析金仓V9R2C13性能优化三大核心场景,代码与数据说话!

5、金仓数据库MongoDB兼容深度解析:多模融合架构与高性能实战

6、金仓数据库KingbaseES基础语法详解与实践指南

后期作品正在准备中,敬请关注......

相关推荐
alonewolf_994 小时前
MySQL全局优化详解与8.0新特性全面解读
数据库·mysql
ASS-ASH4 小时前
快速处理虚拟机磁盘扩容问题
linux·数据库·vmware·虚拟机·磁盘扩容
爱写bug的野原新之助4 小时前
数据库及navicat工具
数据库·网络爬虫·工具
数据知道4 小时前
一文掌握 MongoDB 存储引擎 WiredTiger 的原理
数据库·mongodb·数据库架构
Full Stack Developme4 小时前
Mycat 2 实现 MySQL 读写分离,并且实现 主从同步
android·数据库·mysql
我是人✓4 小时前
Spring IOC入门
java·数据库·spring
Hello.Reader4 小时前
PyFlink DataStream 程序骨架、常用 Source/Sink、状态(State)、与 Table/SQL 互转一篇搞定
数据库·sql·linq
三不原则4 小时前
故障案例:模型推理响应慢,排查 Redis 缓存集群问题
数据库·redis·缓存
alonewolf_994 小时前
MySQL Explain详解与索引优化实战
数据库·mysql·adb