kingbase兼容mysql group by特色语法

sql标准不允许出现select列不在在group by列里,但是mysql老版本允许。
kingbase mysql模式下的数据库提供了参数可以配置是否兼容该特性

group by sql执行报错现象

test=# select relnamespace::regnamespace,relkind,count(*) from sys_class group by relkind;
ERROR:  column "sys_class.relnamespace" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select relnamespace::regnamespace,relkind,count(*) from sys_...

确认数据库模式

test=# show database_mode ;
 database_mode
---------------
 mysql
(1 row)

确认数据库参数

test=# show sql_mode ;
            sql_mode
--------------------------------
 ONLY_FULL_GROUP_BY,ANSI_QUOTES
(1 row)

调整参数解决

1.会话级设置

test=# set sql_mode='ANSI_QUOTES';
SET
test=# select relnamespace::regnamespace,relkind,count(*) from sys_class group by relkind;
 relnamespace | relkind | count
--------------+---------+-------
 pg_catalog   | r       |   118
 pg_catalog   | v       |   443
 pg_toast     | i       |   233
 pg_toast     | t       |    49
 sysmac       | S       |     3

2.全局设置

test=# show sql_mode ;
            sql_mode
--------------------------------
 ONLY_FULL_GROUP_BY,ANSI_QUOTES
(1 row)

test=# alter system set sql_mode='ANSI_QUOTES';
ALTER SYSTEM
test=# select sys_reload_conf();
 sys_reload_conf
-----------------
 t
(1 row)

test=# show sql_mode ;
  sql_mode
-------------
 ANSI_QUOTES
(1 row)

test=# select relnamespace::regnamespace,relkind,count(*) from sys_class group by relkind;
 relnamespace | relkind | count
--------------+---------+-------
 pg_catalog   | r       |   118
 pg_catalog   | v       |   443
 pg_toast     | i       |   233
 pg_toast     | t       |    49
 sysmac       | S       |     3
(5 rows)

<think>我们正在讨论Kingbase数据库的SQL语法使用指南。根据提供的引用,我们可以总结以下几点: 1. SQL是访问KingbaseES数据库的标准语言,应用程序和工具最终都会转换为SQL语句来操作数据库[^1]。 2. Ksql是KingbaseES的主要命令行界面,用于执行各种数据库操作[^2]。 3. KingbaseES的SQL语法部分兼容SQL标准,并有一些扩展和限制(如ALTER PROCEDURE语句)[^3]。 因此,我们可以从以下几个方面介绍Kingbase数据库的SQL语法使用指南: ### 1. SQL基础 KingbaseES支持标准的SQL语句,包括: - 数据定义语言(DDL):用于定义和管理数据库对象,如`CREATE`, `ALTER`, `DROP`等。 - 数据操纵语言(DML):用于操作数据,如`SELECT`, `INSERT`, `UPDATE`, `DELETE`。 - 数据控制语言(DCL):用于权限管理,如`GRANT`, `REVOKE`。 - 事务控制:如`COMMIT`, `ROLLBACK`, `SAVEPOINT`。 ### 2. Ksql命令行工具 Ksql是KingbaseES的交互式终端,允许用户直接输入SQL命令并查看结果。使用Ksql的基本步骤: ```bash # 连接到数据库 ksql -U username -d dbname # 执行SQL命令 ksql> SELECT * FROM my_table; ``` ### 3. 数据类型 KingbaseES支持丰富的数据类型,包括: - 数值类型:`INTEGER`, `NUMERIC`, `REAL`等。 - 字符类型:`CHAR`, `VARCHAR`, `TEXT`。 - 日期/时间类型:`DATE`, `TIME`, `TIMESTAMP`。 - 布尔类型:`BOOLEAN`。 - 二进制类型:`BYTEA`。 - 以及数组、JSON等。 ### 4. 函数和存储过程 KingbaseES支持内置函数和用户自定义函数(包括存储过程)。例如: ```sql -- 创建存储过程 CREATE OR REPLACE PROCEDURE my_proc() AS $$ BEGIN -- 过程体 END; $$ LANGUAGE plpgsql; ``` ### 5. 兼容性和扩展 KingbaseES在兼容SQL标准的同时,也提供了一些扩展语法。例如,在修改存储过程时,KingbaseES的`ALTER PROCEDURE`语句与标准SQL存在一些差异[^3]: ```sql -- 修改存储过程的属性(如重命名) ALTER PROCEDURE proc_name RENAME TO new_name; -- 但注意:引用[3]指出标准SQL不允许重命名过程,而KingbaseES支持。 ``` ### 6. 示例:创建表并查询 ```sql -- 创建表 CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(100), salary NUMERIC ); -- 插入数据 INSERT INTO employees (id, name, salary) VALUES (1, '张三', 8000); -- 查询 SELECT * FROM employees WHERE salary > 5000; ``` ### 7. 注意事项 - 标识符(如表名、列名)可以用双引号括起来以区分大小写,否则会被转换为小写。 - 字符串常量用单引号括起来,如'这是一个字符串'。 - 注释使用`--`(单行)或`/* ... */`(多行)。 以上是Kingbase数据库SQL语法的基本使用指南。更详细的内容可以参考官方文档。 §§相关问题§§ 1. KingbaseES的SQL语法与标准SQL有哪些主要差异? 2. 如何在KingbaseES中使用事务? 3. KingbaseES支持哪些高级SQL特性(如窗口函数、CTE等)? 4. 如何优化KingbaseES中的SQL查询性能?</think>### Kingbase数据库SQL语法使用指南 Kingbase数据库支持标准SQL语法,并提供了丰富的扩展功能。以下是核心语法指南: #### 1. 基础SQL操作 ```sql -- 创建表 CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, salary NUMERIC(10,2) ); -- 插入数据 INSERT INTO employees VALUES (1, '张三', 8000.00); -- 查询数据 SELECT * FROM employees WHERE salary > 5000; ``` #### 2. 数据类型支持 - 数值类型:`INTEGER`, `NUMERIC`, `REAL` - 字符类型:`CHAR(n)`, `VARCHAR(n)`, `TEXT` - 日期/时间:`DATE`, `TIME`, `TIMESTAMP` - 二进制:`BYTEA` - JSON/XML等扩展类型 #### 3. 高级查询特性 ```sql -- 窗口函数 SELECT name, salary, RANK() OVER (ORDER BY salary DESC) FROM employees; -- CTE表达式 WITH dept_avg AS ( SELECT department, AVG(salary) avg_sal FROM employees GROUP BY department ) SELECT * FROM dept_avg WHERE avg_sal > 10000; ``` #### 4. 过程语言扩展 ```sql -- 创建存储过程 CREATE OR REPLACE PROCEDURE raise_salary(percent NUMERIC) AS $$ BEGIN UPDATE employees SET salary = salary * (1 + percent/100); END; $$ LANGUAGE plpgsql; ``` > 注:存储过程修改语法部分兼容SQL标准,但扩展了更多功能[^3] #### 5. 命令行操作(Ksql) ```bash # 连接数据库 ksql -U myuser -d mydb # 执行SQL文件 ksql -f script.sql ``` > Ksql是KingbaseES的主要命令行界面,支持参数设置和对象管理[^2] #### 6. 安全控制 ```sql -- 权限管理 GRANT SELECT ON employees TO analyst; REVOKE UPDATE ON salaries FROM temp_user; ``` #### 7. 兼容性说明 KingbaseES兼容SQL:2011标准,同时提供Oracle/MySQL兼容模式,可通过参数切换: ```sql SET compatible_mode = 'oracle'; -- 切换至Oracle语法模式 ``` > 所有数据库访问最终都会转换为SQL语句执行,应用程序通过SQL与数据库交互[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值